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