devops
February 6, 2021

Циклы в шаблонах Ansible

Наконец-то дошёл до задачи с Ansible, которая заставила меня чуть более подробно изучить работу шаблонов Jinja. В какой-то момент моих серверов стало очень много, а доступом к ним нужно было поделиться с коллегами, поэтому было решено генерировать конфигурацию для ssh-клиента из inventory. За основу я взял этот пост, как наиболее подходящий для решения задачи, и написал роль для ansible-galaxy - https://github.com/woodyart/ansible-ssh-config

Проблема

Основная сложность была в том, чтобы разобраться во встроенных типах Ansible и в том, как правильно на их основе строить шаблоны. Например, можно получить список хостов с помощью groups['all'], но это будет просто список, без свойств. Чтобы получить доступ к переменным хоста, нужно воспользоваться конструкцией hostvars[item]['foobar']. Про эти магические переменные говорится в документации, но у меня, как обычно, было очень мало времени, чтобы хорошо вчитываться. К тому же это не давало ответа о том, как применять эту магию в шаблонах jinja. Хотя, на самом деле, и это есть в документации, но мой путь лежал через stackoverflow, гугление, слёзы и страдание.

С самим шаблоном Jinja особых проблем не возникло - в процессе поиска информации мне попались отличные примеры, которые помогли понять возможности языка, например, встроенные фильтры. Единственное, что не понравилось - внешний вид языка, перегруженный скобками.

Как запускать

Создать в своём проекте файл requirements.yml со следующим содержимым

- src: git@github.com:woodyart/ansible-ssh-config.git
  version: main
  name: ssh_client_config

Добавить в свой плейбук роль

- name: Generate SSH Client Config
  hosts: localhost
  connection: local
  gather_facts: no
  roles: ssh_client_config
  tags: ssh

Установить роль с помощью ansible-galaxy

ansible-galaxy install -r requirements.yml

Запустить плейбук

ansible-playbook -i inventory main.yml --tags ssh