2016-06-24 2 views
0

Как я могу добиться следующего в недоступном? Я хочу запустить несколько lineinfile в списке серверов.Запустить несколько команд lineinfile с with_items

Если я делаю следующее, анзибль жалуется из-за неоднократного lineinfile

- 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 безрезультатно.

+0

Опишите, что означает 'groups ['app']' в вашем примере? Для запуска задачи в списке серверов в недоступном вам используется параметр 'hosts:' для воспроизведения. Для запуска той же задачи с разными параметрами вы используете 'with_items:' и '{{item}}' placeholder в параметрах своей задачи. Если вы хотите вложенные циклы (например, изменить несколько разных строк для некоторых разных приложений в файле), вы используете 'with_nested:' [docs] (http://docs.ansible.com/ansible/playbooks_loops.html#nested-loops) , В любом случае имя задачи ('lineinfile' в вашем примере) всегда указывается только один раз. –

+0

@ KonstantinSuvorov вместо 'groups [app]' это может быть 'hosts'. Я хочу запустить * несколько похожих задач * в списке серверов. Мне не повезло с помощью 'with_nested', можете ли вы привести пример в этом случае? –

+0

'lineinfile' - это анти-шаблон. Вы должны рассмотреть «шаблон». – tedder42

ответ

2

Вот пример сборник пьес для обеспечения файл/TMP/TestFile имеет PROFILE набор для my_new_profile и другой набор для my_new_other на обоих server1 и server2:

- 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 

Update: с использованием динамической группы и вложенных циклов в создайте два файла: testfile_host1 и testfile_host2 с линиями, присутствующими на всех серверах в группе my_dynamic_group, созданной ранее в playbook.

- 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' } 
      ] 
+0

Я не могу использовать это, потому что я уже использую разные '{{hosts}}' –

+0

. Я не уверен, что вы подразумеваете под этим, но я обновил свой ответ с помощью динамической группы и вложенных Пример цикла. –