Как использовать multi-pass loop в ansible без танцев с бубном
Posted in Новости on 17 августа, 2017 by adminИтак, понадобилось привязать переменную ( 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.