это сложный теоретический вопрос, даже само объяснение.
я буду использовать Bacula
(программное обеспечение резервного копирования сервера) в качестве примера, чтобы было понятнее.
Bacula имеет серверную и клиентскую компоненты. Для добавления нового клиента требуется файл конфигурации на сервере и на клиенте. Итак, что я хочу делать в своей роли:
Роль сервера Bacula:
Теперь у меня проблема с host_vars
и group_vars
. Я хочу, чтобы эту роль использовали все мои [debian]
хосты (это группа). Итак, моя книга выглядит так:
- hosts: debian
roles:
- bacula
tags:
- bacula
Итак, когда эта роль запускается, она должна делать следующее:
debian-client
): скопировать конфигурацию в debian-client
debian-client
): скопировать конфигурацию в debian-server
Есть идеи, как я мог это сделать?
Для меня это действительно сложно объяснить, поэтому, если что-то из вышеперечисленного неясно, пожалуйста, дайте мне знать, чтобы я мог внести ясность.
Обновить:
Спасибо @Konstantin Suvorov delegate_to
ответил на это: https://docs.ansible.com/ansible/playbooks_delegation.html#delegation
Примерно так:
инвентарь:
[debian]
host1
host2
host3 bacula_role=server
host4
host5
играть:
- hosts: debian
vars:
bacula_server: "{{ (ansible_play_hosts | map('extract',hostvars) | selectattr('bacula_role','defined') | selectattr('bacula_role','equalto','server') | first).inventory_hostname }}"
tasks:
- debug: msg="Install server"
when: inventory_hostname == bacula_server
# client block
- block:
- debug: msg="Template server-side client config"
delegate_to: bacula_server
- debug: msg="Template client config"
when: inventory_hostname != bacula_server
# end of block
Заменить debug
операторы с некоторым реальным модулем (например, apt
/template
) и добавьте некоторую обработку ошибок, если не хосты с bacula_role=server
существует.
Если у вас много задач по установке сервера / клиента, вы можете разделить их на bacula_server.yml
и bacula_client.yml
без when
заявления, но включите их с:
- include: "bacula_{{ bacula_role | default('client') }}.yml"