Доступ к вложенным переменным в Ansible

#python #ansible #yaml #jinja2

#python #ansible #yaml #jinja2

Вопрос:

Допустим, у меня это определено в моей group_vars:

 ucarp_data:
  - vhid: 6
    interface: eth0
    hosts:
      - 10.1.60.4
      - 10.1.60.5
    options: --shutdown --preempt

  - vhid: 9
    interface: eth0
    hosts:
      - 10.1.60.7
      - 10.1.60.8
    options: --shutdown --preempt
 

Я хочу проверить, что хост, с которым я сейчас работаю, находится в этом hosts: массиве.

Что-то вроде:

 - name: Check if ucarp_data contains this host
  assert:
    that: ansible_host in ucarp_data.hosts
 

Но это возвращает fatal: [test_machine]: FAILED! => {"msg": "The conditional check 'ansible_host in ucarp_data.hosts' failed. The error was: error while evaluating conditional (ansible_host in ucarp_data.hosts): 'dict object' has no attribute 'hosts'"

Есть идеи?

Также я продолжаю сталкиваться с этими препятствиями с помощью Ansible и вложенных переменных yaml… Кажется, я не могу динамически исследовать, как если бы я был в записной книжке Jupyter, у меня есть завершение вкладки для любого объекта Python, что очень помогает, какие-нибудь советы по этому поводу?

Ответ №1:

Например, учитывая список ucarp_data, приведенный ниже сборник пьес

 - hosts: 10.1.60.5,10.1.60.7,10.1.60.9
  tasks:
    - assert:
        that: inventory_hostname in ucarp_data|map(attribute='hosts')|flatten
        fail_msg: "[ERR] {{ inventory_hostname }} not in ucarp_data"
 

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

 ok: [10.1.60.5] => changed=false 
  msg: All assertions passed
ok: [10.1.60.7] => changed=false 
  msg: All assertions passed
fatal: [10.1.60.9]: FAILED! => changed=false 
  assertion: inventory_hostname in ucarp_data|map(attribute='hosts')|flatten
  evaluated_to: false
  msg: '[ERR] 10.1.60.9 not in ucarp_data'