是否有更好的方法使用Ansible剧本遍历节点计算机上的多个文件并搜索n替换特定行

时间:2018-12-12 20:01:46

标签: ansible jinja2 ansible-2.x ansible-inventory ansible-template

是否有更好的方法使用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命令来实现相同或更好的方法来遍历多个文件,而不是将每个文件都写入到剧本中。

谢谢

1 个答案:

答案 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 }}"