【问题标题】:Replace string in file, if exists with Ansible playbook替换文件中的字符串,如果存在 Ansible 剧本
【发布时间】:2023-01-09 17:20:20
【问题描述】:

我有一个文件,包含一行多个空格分隔的字符串:

$ cat /tmp/strings.txt
alpha beta gamma zeta omega

我的目标是检查 /tmp/strings.txt 中是否不存在 delta 字符串,如果不存在,则将其添加到 gamma 字符串之后:

$ cat /tmp/strings.txt
alpha beta gamma delta zeta omega

我认为将是一个解决方案:

    - name: Check if delta string is present
      ansible.builtin.command: grep 'delta' /tmp/strings.txt | wc -l
      register: delta_string

    - name: Add delta string
      ansible.builtin.blockinfile:
        block: gamma delta
        path: /tmp/strings.txt
      when: delta_string.stdout == 0

这是在 Ansible 中正确使用字符串替换吗?不确定 ansible.builtin.blockinfile 块是如何工作的,如果找不到它会插入 gamma delta 字符串作为 gamma 的替代品,还是将其添加到文件末尾?

有没有需要 when 检查的解决方案?

【问题讨论】:

    标签: ansible


    【解决方案1】:

    将双胞胎放入字典中,例如

      twins:
        gamma: delta
        foo: bar
    

    读取文件并拆分项目。声明变量

      strings: "{{ out['content']|b64decode|split() }}"
    

    下面的任务

        - slurp:
            src: /tmp/strings.txt
          register: out
    

    给出字符串列表

      strings: [alpha, beta, gamma, zeta, omega]
    

    迭代字符串如果缺少双胞胎,请添加

      update_str: |
        [
        {% for i in strings %}
        {% if i in twins and strings[loop.index]|d(None) != twins[i] %}
        {{ i }}, {{ twins[i] }},
        {% else %}
        {{ i }},
        {% endif %}
        {% endfor %}
        ]
    

    给出有效的 YAML

      update_str: |-
        [
        alpha,
        beta,
        gamma, delta,
        zeta,
        omega,
        ]
    

    将字符串转换为列表

      update: "{{ update_str|from_yaml }}"
    

      update: [alpha, beta, gamma, delta, zeta, omega]
    

    加入项目并写入文件

        - copy:
            dest: /tmp/strings.txt
            content: "{{ update|join(' ') }}"
    

    shell> cat /tmp/strings.txt 
    alpha beta gamma delta zeta omega
    

    用于测试的完整剧本示例

    - hosts: localhost
    
      vars:
    
        twins:
          gamma: delta
          foo: bar
    
        strings: "{{ out['content']|b64decode|split() }}"
        update_str: |
          [
          {% for i in strings %}
          {% if i in twins and strings[loop.index]|d(None) != twins[i] %}
          {{ i }}, {{ twins[i] }},
          {% else %}
          {{ i }},
          {% endif %}
          {% endfor %}
          ]
        update: "{{ update_str|from_yaml }}"
    
      tasks:
    
        - slurp:
            src: /tmp/strings.txt
          register: out
        - debug:
            var: strings
        - debug:
            var: update_str
        - debug:
            var: update
        - copy:
            dest: /tmp/strings.txt
            content: "{{ update|join(' ') }}"
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-04
      • 1970-01-01
      • 2020-02-03
      • 2019-12-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多