Ansible Jinja2 шаблон для цикла - PullRequest
0 голосов
/ 21 января 2020

У меня есть два linux сервера:

- server1: ip: 10.241.55.6, hostname: server1
- server2: ip: 10.242.55.7, hostname: server2

Я создал ansible файл инвентаризации с именами серверов с содержанием ниже:

[IC]
10.241.55.6
10.241.55.7

Теперь я создал это Файл шаблона инвентаризации jinja2: test.j2 со следующим содержимым:

[IC]
{% for hostip in groups['IC'] %}
{% if hostip == ansible_default_ipv4.address %}
{{ ansible_default_ipv4.address }} default_hostname={{ ansible_nodename }}
{{ ansible_default_ipv4.address }} default_hostname={{ ansible_nodename }}
{% endif %}
{% endfor %}

И я запускаю эту ansible playbook:

---
- name: Generate portal inventory file
  hosts: all
  tasks:

   - name: Generate inventory
     delegate_to: localhost
     template:
       src: inventory/test.j2
       dest: inventory/test

Команда: ansible -playbook -i инвентарь / серверы generate-inventory.yml

Конечная цель заключается в том, что ansible подключается к каждому серверу из файлов инвентаризации, а затем на основе шаблона инвентаризации jinja2 создает новый файл инвентаризации с этот формат:

[IC]
10.241.55.6 default_hostname=hostname_of_the_server_with_that_ip

и так далее ...

Проблема здесь с for для l oop состоит в том, что все записи имеют один и тот же ip сервера (хотя я должен был иметь запись для каждого из серверов с соответствующими именами хостов):

[IC]
10.241.55.6 default_hostname=server1
10.241.55.6 default_hostname=server2

Что мне здесь не хватает? Также, если есть какой-то другой лучший способ добиться этого, пожалуйста, дайте мне знать.

1 Ответ

1 голос
/ 21 января 2020

Вы используете одну и ту же переменную дважды в шаблоне ...

{{ ansible_default_ipv4.address }} default_hostname={{ ansible_nodename }}
{{ ansible_default_ipv4.address }} default_hostname={{ ansible_nodename }}

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

Может быть что-то вроде этого:

[IC]
{% for host in groups['IC'] %}
{{ hostvars[host].ansible_default_ipv4.address }} default_hostname={{ hostvars[host].ansible_nodename }}
{% endfor %}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...