Создайте Vars из фактов Ansible и Jinja2 - PullRequest
0 голосов
/ 14 мая 2019

Cars Vars от Ansible Facts

Обновлено: у меня есть четыре системы, в которых мне нужно извлечь факты и использовать их в качестве переменных в шаблоне jinja 2. Реальные имена хостов имеют префикс с тире, что затрудняет использование всего имени хоста в качестве переменной. Системы настроены как:

office1
    debn-web01
    ubun-web02

office2
    linx-web01
    linx-web02

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

vars:
    office1:
       web01:
          myip: 10.10.10.10
          peer: 10.10.10.20
       web02:
          myip: 10.10.10.20
          peer: 10.10.10.10

    office2:
       web01:
          myip: 10.20.20.30
          peer: 10.20.20.40
       web02:
          myip: 10.20.20.40
          peer: 10.20.20.30

Я хотел бы извлечь часть имени хоста после тире на имени хоста, то есть "debn-web01" -> "web01", чтобы использовать его как ранее созданную переменную ansible.

Итак, по шаблону Jinja2 у меня есть:

# This should create the var: web01
{% set trimd_hostname = ansible_hostname.split("-")[1] %}

# Start of Ansible Config File:
host_name: {{ ansible_hostname }}
web01 host_ip: {{ ansible_eth0.ipv4.address }}
host_peer: {{ office1[ trimd_hostname ]peer }}

Опция обрезки работает, так как я могу распечатать вывод сам по шаблону. Однако я получаю сообщение об ошибке, что узел не является переменным объектом office1.trimd_hostname.

1 Ответ

0 голосов
/ 14 мая 2019

Ответ на этот вопрос немного сложен, потому что вы еще не опубликовали полный репродуктор. Это означает, что этот вопрос может быть немного странным, потому что я должен был сделать некоторые предположения о том, что вы делаете.

Если я попытаюсь воспроизвести вашу проблему с помощью следующего примера playbook, он работает без ошибок:

---
- hosts: localhost
  gather_facts: false
  vars:
    office1:
      web01:
        myip: 10.10.10.10
        peer: 10.10.10.20
      web02:
        myip: 10.10.10.20
        peer: 10.10.10.10

    office2:
      web01:
        myip: 10.20.20.30
        peer: 10.20.20.40
      web02:
        myip: 10.20.20.40
        peer: 10.20.20.30
    trimd_hostname: web01
    ansible_hostname: debn-web01
    ansible_eth0:
      ipv4:
        address: 1.2.3.4
  tasks:
    - copy:
        dest: ./output.txt
        content: |
          {% set trimd_hostname = ansible_hostname.split("-")[1] %}
          host_name: {{ ansible_hostname }}
          web01 host_ip: {{ ansible_eth0.ipv4.address }}
          host_peer: {{ office1[trimd_hostname].peer }}

, который производит следующее в output.txt:

host_name: debn-web01
web01 host_ip: 1.2.3.4
host_peer: 10.10.10.20

Я уже указал на опечатку в вашем вопросе, но трудно сказать, является ли это фактической ошибкой или это была просто ошибка копирования / вставки, когда вы писали вопрос.

Я хотел бы предложить другой способ организации ваших данных. Избавьтесь от переменных office1 и office2 и вместо этого используйте ansible host_vars для хранения информации.

То есть создайте host_vars/dbn-web01.yml со следующим содержимым:

myip: 10.10.10.10
peer: 10.10.10.20

И аналогично для других хостов. Тогда ваш шаблон станет просто:

host_name: {{ ansible_hostname }}
web01 host_ip: {{ ansible_eth0.ipv4.address }}
host_peer: {{ peer }}

Значение переменной peer будет любым, подходящим для конкретного хоста, на котором выполняется задача.

...