Использование условий в 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?

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
Другие вопросы по тегам