Назад | Перейти на главную страницу

Ansible: скопировать конфигурацию на текущий и другие хосты

это сложный теоретический вопрос, даже само объяснение.

я буду использовать Bacula (программное обеспечение резервного копирования сервера) в качестве примера, чтобы было понятнее.

Bacula имеет серверную и клиентскую компоненты. Для добавления нового клиента требуется файл конфигурации на сервере и на клиенте. Итак, что я хочу делать в своей роли:

Роль сервера Bacula:

  1. Настройте сервер bacula на одном хосте
  2. [для каждого клиента] Скопируйте файл конфигурации клиента для сервера на сервер
  3. [для каждого клиента] Скопируйте файл конфигурации клиента для клиента клиенту

Теперь у меня проблема с host_vars и group_vars. Я хочу, чтобы эту роль использовали все мои [debian] хосты (это группа). Итак, моя книга выглядит так:

- hosts: debian
  roles:
    - bacula
  tags:
    - bacula

Итак, когда эта роль запускается, она должна делать следующее:

  1. Очевидно, что один хост должен быть сервером, поэтому он получит полную подготовку сервера bacula, если он будет воспроизведен на хосте сервера.
  2. Если эта роль применяется ко всем остальным клиентам, должно произойти следующее:
    1. (текущий хозяин debian-client): скопировать конфигурацию в debian-client
    2. (текущий хозяин 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"