Я новичок в Ansible, но долгое время работал программистом, также немного работал с марионеткой.
Вот ситуация, мне нужно инициализировать некоторые сетевые устройства, они не говорят на bash, поэтому я использую сырой модуль и пока в этом плане все хорошо. Но у меня проблемы с запуском разных команд на разных хостах. У меня может быть переменное количество хостов, для которых нужно установить имя хоста, от 1 до N, где N меньше 10. Префикс имени хоста всегда один и тот же как prefix_. Я хочу добавить суффикс из списка:
ctr_suffixes: "[ 'A', 'B', 'C', 'D', 'E']
В суффиксе_list всегда должно быть достаточно элементов для предоставления уникального суффикса (т. е. список с величиной 10 предоставит суффиксы для от 1 до 10 указанных хостов, но если указано только 3, то будут использоваться A, B, C, но не более).
Итак, если у меня в инвентаре 3 хоста, я хочу создать playbook, который даст следующие имена хостов
prefix_A
prefix_B
prefix_C
команда, которую нужно запустить на каждом хосте,
set hostname prefix_{{item}}
где {{item}} следует заполнить буквами A для первого хоста, B для второго хоста и т. д.
К сожалению, все, что я пробовал, будет применять команду set hostname для каждого хоста в инвентаре, и в конце все хосты будут названы prefix_C
Это то, что у меня пока не работает:
---
- hosts: controllers_test
gather_facts: no
remote_user: admin
vars:
# ctr_suffixes: [ 'A', 'B', 'C', 'D', 'E' ]
ctr_suffixes: [ 'A', 'B']
tasks:
- name: Assign names to the Controllers
raw: "set hostname ctr-TEST-{{item|quote}}"
with_items: ctr_suffixes
Мой ansible_hosts файл имеет:
[controllers_test]
10.144.38.137
10.144.38.139
В результате я получаю:
TASK: [Assign names to the Controllers]
*************************************** ok: [10.144.38.139] => (item=A) => {"item": "A", "rc": 0, "stderr": "", "stdout": ""} ok: [10.144.38.137] => (item=A) => {"item": "A", "rc": 0, "stderr": "", "stdout": ""} ok: [10.144.38.137] => (item=B) => {"item": "B", "rc": 0, "stderr": "", "stdout": ""} ok: [10.144.38.139] => (item=B) => {"item": "B", "rc": 0, "stderr": "", "stdout": ""}
PLAY RECAP
********************************************************************
10.144.38.137 : ok=2 changed=0 unreachable=0 failed=0
10.144.38.139 : ok=2 changed=0 unreachable=0 failed=0
Я пробовал with_toght и еще несколько вещей, но все они, похоже, хотят применить весь список префиксов к каждому хосту. Я бы согласился вести списки того же размера, что и количество хостов, если это упростит код.
Я подозреваю, что мне нужно использовать какой-то шаблон.
Вы можете сделать это с помощью переменные хоста такой, что твой ansible_hosts файл имеет:
[controllers_test]
10.144.38.137 hostname_suffix=A
10.144.38.139 hostname_suffix=B
И тогда ваш сценарий станет:
---
- hosts: controllers_test
gather_facts: no
remote_user: admin
tasks:
- name: Assign names to the Controllers
raw: "set hostname ctr-TEST-{{hostname_suffix|quote}}"