Создать переменную из возможных фактов - PullRequest
1 голос
/ 02 мая 2019

У меня есть четыре системы, в которых мне нужно извлечь факты и использовать их в качестве переменных в шаблоне jinja 2.

В Ansible у меня есть:

vars:
    office1:
       web01:
          myip: 10.10.10.10 // or fact
          peer: 10.10.10.20
       web02
          myip: 10.10.10.20 // or fact
          peer: 10.10.10.10

    office2:
       web01:
          myip: 10.20.20.30 // or fact
          peer: 10.20.20.40
       web02
          myip: 10.20.20.40 // or fact
          peer: 10.20.20.30 

На шаблоне jinja 2 у меня есть:

# Config File:
host_name: {{ ansible_hostname }}  // web01
host_ip: {{ ansible_eth0.ipv4.address }}
host_peer: {{ office1."{{ ansible_hostname }}".peer }}

Однако я получаю ошибку, что переменная Ansible: office1.ansible_hostname.peerне определено.

Любая помощь с этим будет принята с благодарностью.

1 Ответ

1 голос
/ 02 мая 2019

Расширение в Ansible не является рекурсивным. Попробуйте расширение ниже

host_peer: {{ office1[ansible_hostname].peer }}

Например, игра ниже

- hosts: test_01
  gather_facts: yes
  vars:
    office1:
      test_01:
        myip: 10.20.20.30
        peer: 10.20.20.40
  tasks:
    - template:
        src: template.j2
        dest: /scratch/test_01.cfg

с шаблоном.j2

# Config File:
host_name: {{ ansible_hostname }}
host_peer: {{ office1[ansible_hostname].peer }}

дает:

# cat /scratch/test_01.cfg 
# Config File:
host_name: test_01
host_peer: 10.20.20.40

Чтобы ответить на вопрос

Создать переменную из возможных фактов

можно использовать lookup vars . Например, игра ниже

vars:
  var1: var1
  var2: var2
  var3: var3
tasks:
  - debug:
      msg: "{{ lookup('vars', 'var' + item) }}"
    with_sequence: start=1 end=3

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

"msg": "var1"
"msg": "var2"
"msg": "var3"
...