Ansible - 如果文件存在,则替换多个文件中的特定字符串

时间:2018-03-21 02:53:42

标签: ansible

如果文件存在于目录中,我可以替换文件中的字符串。

同样,如果文件存在于同一目录中,我想替换另外25个文件(test2.conf .. test25.conf)中的字符串。使用with_items我可以替换所有文件中的字符串,但无法使用寄存器来检查循环中是否存在该文件。

下面的playbook对于一个文件来说是成功的,我怎样才能为25个文件实现相同的目标?

     - hosts: webserver  

       vars:
    strings:
       - user1
       - user2

  tasks:  
     - name: Check /home/user/test1.conf exists
       stat:  
          path: /home/user/test1.conf  
       register: stat_result


 - name:  Replace string in test1.conf
   replace:
     dest: /home/user/test1.conf
     backup: yes
     regexp: '^Hello'
     replace: "Hello {{ strings | join(' ')}}"
   when: stat_result.stat.exists == True 

1 个答案:

答案 0 :(得分:2)

使用find模块而不是stat并迭代结果:

- hosts: webserver  

  vars:
    strings:
      - user1
      - user2

  tasks:  
    - name: Get a list of test*.conf in /home/user
      find:  
        paths: /home/user
        patterns: test*.conf
       register: my_find

    - name: Replace strings in files found
      replace:
        dest: "{{ item.path }}"
        backup: yes
        regexp: '^Hello'
        replace: "Hello {{ strings | join(' ')}}"
      with_items: "{{ my_find.files }}"

您的replace任务不是幂等的,它会在后续运行中无限地添加strings