Назад | Перейти на главную страницу

Ansible: установка имени хоста поверх инвентаря

Я новичок в 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}}"