是否有更好的方法使用Ansible剧本遍历节点计算机上的多个文件并搜索n替换特定行。
我的目录中有以下文件,它需要遍历这些文件并检查并替换文件中的特定行。
/opt/a1.conf
/opt/a2.con.f
/var/app1/conf/a3.conf
/etc/a5.conf
/etc/a6.conf
/etc/a7.conf
/etc/a8.conf
/etc/a9.conf
我的Ansible剧本的格式如下:
-
name: Install nginx and other binaries using with_item and variables.
gather_facts: yes
hosts: aws1
become_method: sudo
become: yes
tasks:
- name: Modify line to include Timeout
become: yes
become_method: sudo
lineinfile:
path: {{ item }}
regexp: 'http\s+Timeout\s+\='
line: 'http Timeout = 10'
backup: yes
with-items
- /opt/a1.conf
- /opt/a2.con.f
- /var/app1/conf/a3.conf
- /etc/a5.conf
- /etc/a6.conf
- /etc/a7.conf
- /etc/a8.conf
- /etc/a9.conf
这实际上可以工作并为我提供帮助。我还可以创建一个vars.yaml文件并添加所有这些文件,并以“ with_items”语法使用它们。 但是,实际上这会使剧本显得冗长,因为要搜索的文件数量更多
通过使用“ for”循环的jinja2模板,我们可能可以有效地实现相同的目的。 例如:{%为vars.yml%中的项目}
那将是一种有效的方法,并且不会使我的Ansible剧本笨拙,但是我无法弄清楚用于循环播放它的确切命令。
是否有一个Jinja命令来实现相同或更好的方法来遍历多个文件,而不是将每个文件都写入到剧本中。
谢谢
答案 0 :(得分:2)
您不需要jinja2。为什么不为文件列表变量(如vars.yml
)使用单独的文件,其内容如下:
---
files:
- /opt/a1.conf
- /opt/a2.con.f
- /var/app1/conf/a3.conf
- /etc/a5.conf
- /etc/a6.conf
- /etc/a7.conf
- /etc/a8.conf
- /etc/a9.conf
并将此文件包含在您的剧本中
---
- name: Install nginx and other binaries using with_item and variables.
gather_facts: yes
hosts: aws1
become_method: sudo
become: yes
vars_files:
- z.var
tasks:
- name: Modify line to include Timeout
lineinfile:
path: {{ item }}
regexp: 'http\s+Timeout\s+\='
line: 'http Timeout = 10'
backup: yes
loop:
"{{ files }}"