Ansible - динамическая переменная с host_vars и строкой в ​​имени

Я пытаюсь создать роль задания в Ansible для запуска yum install / update пакетов, которые будут предоставлены сторонней системой в виде файла .yml в каталог vars в роли со следующим соглашением: server01.yml, server02. yml, serverX.yml с переменной в форме packageList_serverNumber: 'список пакетов'. Эта переменная будет прочитана с помощью задачи:

 - name: server update packages from host_vars
yum:
  name: "{{ install_pkgs }}"
  state: latest

Это должно указывать на файл host_vars для конкретного хоста:

install_pkgs: "{{ packageList_server01 }}"

Поскольку эта задача должна выполняться только тогда, когда переменная определена, я пытался использовать предложение when с переменной, которая будет указывать на packageList_serverNumber. Когда я его жестко кодирую, как показано ниже, он работает:

when: packageList_server01 is defined

Подскажите, пожалуйста, как сделать динамичным? Я пытался:

when: packageList_{{hostvars[inventory_hostname]}} is defined

Но, к сожалению, это не работает.


person PawelN    schedule 02.11.2020    source источник


Ответы (1)


Используйте плагин lookup vars. Выполните команду ниже, чтобы увидеть подробности

shell> ansible-doc -t lookup vars

Учитывая файлы vars

shell> cat roles/test4/vars/server01.yml 
packageList_server01: [pkg1, pkg2, pkg3]

shell> cat roles/test4/vars/server02.yml 
packageList_server02: [pkg4, pkg5, pkg6]

shell> cat roles/test4/vars/server03.yml 
packageList_server03: [pkg7, pkg8, pkg9]

прочтите вары, объявите переменную install_pkgs и используйте ее

shell> cat roles/test4/tasks/main.yml
- include_vars: "vars/{{ inventory_hostname }}.yml"
- set_fact:
    install_pkgs: "{{ lookup('vars', 'packageList_' ~ inventory_hostname) }}"
- debug:
    msg: "Install {{ install_pkgs }}"

Например, playbook

- hosts: server01,server02,server03
  gather_facts: false
  roles:
    - test4

дает (сокращенно)

TASK [test4 : debug] ****
ok: [server01] => 
  msg: Install ['pkg1', 'pkg2', 'pkg3']
ok: [server03] => 
  msg: Install ['pkg7', 'pkg8', 'pkg9']
ok: [server02] => 
  msg: Install ['pkg4', 'pkg5', 'pkg6']
person Vladimir Botka    schedule 02.11.2020