使用with_items

时间:2016-06-24 09:14:33

标签: ansible devops

如何在ansible中实现以下目标?我想在服务器列表中运行多个lineinfile。

如果我执行以下操作,由于重复lineinfile

,ansible会抱怨
- name: ensure /etc/environment is correct
  tags: env
  with_items: "{{ hosts }}"
  lineinfile: dest=/etc/environment regexp=^PROFILE=line=PROFILE={{prof}}
  lineinfile: dest=/etc/environment regexp=^OTHER=line=OTHER={{other}}

我试图嵌套with_items无济于事。

1 个答案:

答案 0 :(得分:2)

以下是确保文件/ tmp / testfile在服务器1和服务器2上将PROFILE设置为my_new_profile且OTHER设置为my_new_other的示例playbook:

- hosts: server1, server2
  tasks:
    - lineinfile: dest=/tmp/testfile regexp={{item.regex}} line={{item.replace_with}}
      with_items:
        - regex: ^PROFILE=
          replace_with: PROFILE=my_new_profile
        - regex: ^OTHER=
          replace_with: OTHER=my_new_other

更新:使用动态组和嵌套循环创建两个文件:testfile_host1和testfile_host2,并且在playbook中先前创建的my_dynamic_group组中的所有服务器上都有行。

- hosts: localhost
  tasks:
    - add_host: name={{ item }} groups=my_dynamic_group
      with_items:
        - server1
        - server2

- hosts: my_dynamic_group
  tasks:
    - lineinfile: dest=/tmp/testfile_{{ item[0] }} regexp={{item[1].regex}} line={{item[1].replace_with}} create=yes
      with_nested:
        - [ 'host1', 'host2' ]
        - [
            { regex: '^PROFILE=', replace_with: 'PROFILE=my_new_profile' },
            { regex: '^OTHER=',   replace_with: 'OTHER=my_new_other' }
          ]