Как использовать multi-pass loop в ansible без танцев с бубном

Итак, понадобилось привязать переменную ( variable ) к отдельному хосту ( хостов около 30 ) при раскидывании конфигов по хостам ( на каждый хост свой уникальный ключ ).
Какие пути ?
1. Дублировать одинаковые таски с when. В итоге получится каша и каждый новый сервер нужно будет прописывать в этом таске.
2. Разделить все серверы по группам ( один сервер — одна группа ), для каждой группы завести свой конфиг в group_vars и через child groups рулить всем этим делом. Опять же получится громоздкая конструкция с кучей файлов и зависимостями.
3. Использовать dict в variables. Этим и займемся.

— Заводим в group_vars/all.yml наш dict ( server(1|2|3) должны строго соответствовать ansible_hostname из инвентори файла ) :

servers:
server1:
secret_key: "value1"
server2:
secret_key: "value2"
server3:
secret_key: "value3"

— Создаем темплейт с указанием ключа :

ossec-agent:
build: .
container_name: ossec-agent
hostname: ossec-agent
restart: always
privileged: true
net: host
environment:
OSSEC_SERVER: "x.x.x.x"
OSSEC_AGENT_KEY: "{{ item.value.secret_key }}"
ports:
- "514:514"
- "1514:1514"
# command: /usr/bin/supervisord -c /etc/supervisord.conf
command: /start.sh

— В тасках создаем :

- name: "put docker-compose"
template:
src: docker-compose.j2
dest: /my/path/ossec-agent/docker-compose.yml
with_dict: "{{ servers }}"
when: ansible_hostname == item.key

И вуаля, у нас работает наш loop и раскидывает ключи согласно inventory.

Tags: , ,

Leave a Reply