Использование условий в Playbook для выполнения на основе IP-адреса

Мне нужно изменить имя компьютера Windows на 40 машинах в AWS. Я попытался использовать collect_facts, чтобы установить условие, которое будет выполняться только в том случае, если IP-адрес совпадает. Но почему-то не поднимает. Мое решение проблемы на данный момент (крайне неэффективно - создавать отдельные группы хостов по одной на каждый IP-адрес. Я знаю, что должен быть лучший способ сделать это, любой вклад будет оценен.

Вот что у меня работает

---
- hosts: windows_machine1
  gather_facts: yes

  tasks:



    - name: Change the hostname to newname1
      win_hostname:
        name: newname1
      register: res

- hosts: windows_machine2
  tasks:

    - name: Change the hostname to newname2
      win_hostname:
        name: newname2
      register: res

    - name: Reboot
      win_reboot:
      when: res.reboot_required

Я попробовал два способа сделать условное выражение, оба привели к ошибке при запуске.

---
- hosts: windows_machine1
  gather_facts: yes

  tasks:



    - name: Change the hostname to newname1
      win_hostname:
        name: newname1
      register: res
      when: ansible_facts['ansible_all_ipv4_addresses'] == '10.x.x.x


    - name: Change the hostname to newname2
      win_hostname:
        name: newname2
      register: res
      when: ansible_facts['address'] == '10.x.x.x'

    - name: Reboot
      win_reboot:
      when: res.reboot_required

Это не удастся, говоря, что условная проверка не удалась. Потому что мои условия плохие. Кто-нибудь знает, как сделать условное на основе ip?


person Drumbum51    schedule 17.01.2019    source источник
comment
Разве вы не можете использовать список с объектами в качестве записей списка, например. вот так: host_mapping: - { old: 127.0.0.1, new: newName1} и так далее?   -  person nwinkler    schedule 17.01.2019


Ответы (1)


Отказ от ответственности: я запускаю Ansible только на хостах Linux, поэтому я думаю, что на хостах Windows все может быть по-другому.

Вы не указываете ansible_facts, а вместо этого просто начинаете с определенного корневого факта.

В первом случае факт, к которому вы пытаетесь добраться, вам не поможет, потому что он возвращает список всех IP-адресов в системе. Даже если есть только один, он все равно возвращает список, с которым вы не можете просто сравнить строки.

Это должно делать то, что вы хотите в первую очередь:

- name: Change the hostname to newname2
  win_hostname:
    name: newname2
  register: res
  when: "ansible_default_ipv4.address == '10.0.0.1'"

Вы собираетесь дублировать этот блок кода, по одному на хост? Если это так, рассмотрите возможность установки переменной для поиска IP и нового имени:

- hosts: all
  vars:
    ip_newname:
      10.0.0.1: newname1
      10.0.0.2: newname2
      10.0.0.3: newname3
  tasks:
    - name: Change the hostname
      win_hostname:
        name: "{{ ip_newname[ansible_default_ipv4.address] }}"
      register: res
      when: ansible_default_ipv4.address in ip_newname.keys()
    - name: Reboot
        win_reboot:
      when: res is defined and res.reboot_required
person clockworknet    schedule 17.01.2019
comment
Я попробовал первый пример, который вы привели, и это привело к сбою. фатальный: [10.x.x.1]: FAILED! =› {msg: условная проверка 'ansible_default_ipv4.address == '10.x.x.1'' не удалась. Ошибка была: ошибка при оценке условного (ansible_default_ipv4.address == '10.x.x.1') . - person Drumbum51; 18.01.2019
comment
Ах, извините. Я должен был проверить здравомыслие, прежде чем публиковать. Ansible немного требователен к сравнениям необработанных строк и требует, чтобы все выражение было заключено в двойные кавычки, тогда как для других сравнений это не так. Отредактировал и проверил мой ответ. Кроме того, просто для подтверждения, вы используете фактический IP-адрес в коде, который вы запускаете, а не «10.x.x.1»? - person clockworknet; 19.01.2019