Циклы в шаблонах 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