Возможно ли как-то создать шаблон обработчика ansible? - PullRequest
1 голос
/ 10 апреля 2020

Я столкнулся с проблемой, что мне нужно определить набор похожих обработчиков в ansible, которые отличаются только по имени.

Позвольте привести пример. Вот некоторые задачи :

# tasks/main.yml
- name: Install config of OpenVPN instance 1
  notify: restart openvpn-1
  ...
- name: Install config of OpenVPN instance 2
  notify: restart openvpn-2
  ...
# Multiple more of that pattern.

Вы можете подумать, что каждый экземпляр имеет немного отличную конфигурацию, которую можно здесь обработать.

Хорошо. Преклоните обработчики :

# handlers/main.yml
- name: restart openvpn-1
  systemd:
    name: openvpn-server@instance1
    state: restarted
- name: restart openvpn-2
  systemd:
    name: openvpn-server@instance2
    state: restarted
# ...

Вы видите, что это довольно дублированный код (не очень хорошо).

Я думал о том, чтобы сделать что-то вроде:

# Handler template or so
- name: restart-openvpn-{{ item }}
  systemd:
    name: openvpn-server@instance{{ item }}
    state: restarted
  loop:
    - "1"
    - "2"
    # ...

Это не работает, я попробовал.

Я нашел этот пост , но здесь он работает не так идеально, так как предполагает выполнение задачи в loop. Вместо этого у меня есть набор отдельных задач, которые запускают отдельные экземпляры обработчиков. Также это уже в роли.

Итак, короткий вопрос: как я могу создать шаблон обработчика, чтобы избежать избыточности кода?

1 Ответ

0 голосов
/ 10 апреля 2020

Ваш код работает.

Например, я воспользовался двумя услугами и попросил их перезапустить, используя ваш подход:

- hosts: localhost
  connection: local
  become: true

  tasks:
    - name: restart-{{ item }}
      systemd:
        name: "{{ item }}.service"
        state: restarted
      loop:
        - "whoopsie"
        - "wpa_supplicant"

O / P:

PLAY RECAP **********
localhost                  : ok=2 

Основное отличие от вашего кода: добавьте кавычки.

Согласно Ansible Документация по использованию переменных:

Синтаксис YAML требует, чтобы при запуске значение {{ foo }} вы заключаете в кавычки всю строку, так как он хочет быть уверен, что вы не пытаетесь запустить словарь YAML. Это описано в документации Синтаксис YAML .

Это не сработает:

- hosts: app_servers
  vars:
      app_path: {{ base_path }}/22

Сделайте так, и все будет в порядке:

- hosts: app_servers
  vars:
       app_path: "{{ base_path }}/22"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...