如果文件存在于目录中,我可以替换文件中的字符串。
同样,如果文件存在于同一目录中,我想替换另外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
答案 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
。