При циклическом обходе хостов в задаче Ansible шаблон jinja не будет использовать host_vars этих хостов - PullRequest
0 голосов
/ 04 октября 2018

В Ansible у меня есть playbook с заданием, которое запускается на одном сервере nginx (т.е. nginx.example.com).Цель состоит в том, чтобы создать столько конфигурационных файлов обратного прокси, сколько необходимо (или просто: конфигурационный файл для каждого хоста).Задача включает в себя шаблон модуля.Этот один шаблон в идеале должен быть повторно использован для многих хостов.Задача:

- name: nginx proxied hosts
  template:
    src: proxy-template.j2
    dest: /etc/nginx/sites-enabled/{{ item }}
  with_items: "{{ groups['groupname'] }}"
  when: hostvars[item].nginx_proxy is defined

Эта задача пройдет через все хосты в группе имя_группы , будет использовать шаблон proxy-template.j2 и создаст файл конфигурации /etc/nginx/sites-enabled/random.example.com.

Поскольку host_vars / random.example.com имеет конфигурацию ниже yaml:

nginx_proxy:
  target_fqdn: random.example.com
  target_resource: http://10.10.0.65
  server_ip: 10.10.0.10

Когда ansible создает файл конфигурации для этого хоста, я ожидаю, что он примет значения из этого файла хоста yaml vars вhost_vars / random.example.com

одна из строк в proxy-template.j2: server_name {{ vars.nginx_proxy.target_fqdn }};

Проблема в том, что Ansible может успешно проверить, есть ли у хоста атрибут nginx_proxy (в host_vars/random.example.com), он не использует переменные хостов в шаблоне jinja.Ansible либо не выполнит шаг для этого хоста, либо примет переменные сервера nginx, если они указаны в host_vars (в host_vars / nginx.example.com), который должен быть.

Два результата:

  1. host_vars / nginx.example.com и host_vars / random.example.com имеют определенные переменные nginx_proxy.оба имеют разные значения.

    Результат: На сервере nginx созданы файлы /etc/nginx/sites-enabled/nginx.example.com и /etc/nginx/sites-enabled/random.example.com.Но оба файла содержат переменные сервера nginx.Файл random имеет значения файла nginx.

  2. только для host_vars / random.example.com определены nginx_proxy переменные.

    Результат: ANSIBLE завершается ошибкой с элементом

    item ":" random.example.com "," msg ":" AnsibleUndefinedVariable: 'объект dict' не имеет атрибута 'nginx_proxy' "

TLDRansible проверит, имеет ли какой-либо хост nginx_proxy в host_vars, но будет использовать только host_vars хоста nginx для шаблонов. А если host_vars / nginx.example.com не имеет vgin nginx_proxy, то произойдет сбой.

{"изменено": false," item ":" random.example.com "," msg ":" AnsibleUndefinedVariable: 'объект dict' не имеет атрибута 'nginx_proxy' "}

1 Ответ

0 голосов
/ 04 октября 2018

vars (который вы не должны использовать, во всяком случае, для этого vars lookup ) не то же самое, что hostvars[item].Вы проверяете hostvars в условии, но используете vars в шаблоне.

Вы должны использовать server_name {{ hostvars[item].nginx_proxy.target_fqdn }}; в своем шаблоне.


Объяснение

Ansible реализует сам цикл хоста, а vars относится к хосту, на котором выполняется задача.

Таким образом, вы запускаете задачу дважды на каждом хосте:

В первом случае:

  • Вкл. random.example.com вы запускаете для random.example.com и nginx.example.com

    Ansible использует значение nginx_proxy из random.example.com (хоствыполняется

  • Включено nginx.example.com вы запускаете для random.example.com и nginx.example.com

    Ansible использует значение nginx_proxy из nginx.example.com (хоствыполнено в)


Во втором случае:

  • Вкл random.example.com вы бежите за random.example.com (nginx.example.com - этопропущено)

    Ansible использует nginx_proxy значение, определенное в random.example.com (хост, на котором выполняется)

  • Вкл. nginx.example.com, который вы запускаете для random.example.com (nginx.example.com пропущено)

    Ansible пытается использовать nginx_proxy значение, определенное в nginx.example.com(хост выполняется), но он не работает.

...