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

Ansible можно ли использовать переменную в шаблоне src

В анзибле мы пытаемся получить доступ к различным шаблонам в зависимости от переменной.

У нас есть следующие файлы шаблонов, например:

templates
    app1.conf.j2
    app2.conf.j2
    app3.conf.j2

taks
    app.yml

В задачах нам нужно скопировать файл шаблона на основе имени приложения. например: мы укажем переменную с именем instance_name для app1, app2 или app3.

Теперь, исходя из переменной, нам нужно скопировать файл приложения в / opt / ((instance_name}} / conf.d /.

мы создали задачу ansbile следующим образом, но она не работает.

- name: 'Copy {{ instance_name }} file to /opt/conf.d/ Directory'
    template:
      src: "{{ instance_name }}.conf.j2"
      dest: "/opt/{{ instance_name }}/conf.d/"
      owner: root
      group: root
      mode: 0644

     

Когда мы жестко кодируем "src" для app1.conf.j2, он работает для app1.

С этого URL https://docs.ansible.com/ansible/latest/modules/template_module.html#parameter-src он указывает, что значение может быть относительным или абсолютным путем.

Пожалуйста, дайте нам знать, возможно ли это с помощью этого метода? У нас есть около 20 приложений, и это лучший способ упростить доступную книгу, указав только переменную.

Нет никаких передовых практик, только мнения о том, насколько элегантно решение для конкретной проблемы. Особенно актуально для Ansible, учитывая гибкость в том, как он позволяет вам делать то, что вы хотите.


Роли отличные. Можно создать роль для каждой группы приложений, и каждая из них содержит необходимые шаблоны конфигурации, например roles/app1/templates/app1.conf.j2 Возможно, у него есть несколько задач и шаблонов, например, если приложение запускает какой-либо процесс через диспетчер служб, гарантирует, что брандмауэр хоста разрешает это, а также подключает что-то через некую служебную сетку.

app1's defaults/main.yml может содержать

instance_name: app1

Который затем может быть использован tasks/main.yml (некоторые параметры опущены для краткости, возможно, они были перенесены в настройки модуля по умолчанию на блоке.)

- name: 'Copy config to /opt/conf.d/'
    template:
      src: "{{ instance_name }}.conf.j2"
      dest: "/opt/{{ instance_name }}/conf.d/"

Если бы все это было в одном дереве рядом с вашим сценарием (не обязательно, в частности, роли можно было бы хранить в другом месте), это могло бы выглядеть как пример организации контента в документации:

playbook.yml
roles/
  app1/
    tasks/
      main.yml
    templates/
      app1.conf.j2
  app2/
    tasks/
      main.yml
    templates/
      app2.conf.j2 

И тогда в playbook их просто нужно перечислить:

roles:
- app1
- app2

Реализация таких ролей может повторяться, поскольку каждая роль должна делать одно и то же. Если роли отличаются только парой переменных, создайте общую роль и вызовите ее несколько раз с разными параметрами роли.

roles:
- role: appgeneric
  vars:
    instance_name: app1 
- role: appgeneric
  vars:
    instance_name: app2

Переменные для параметров модуля - это здорово, ответ на ваш вопрос - да. Тем не мение, переменные имена задач действительно не работают. Названия задач глобальны и анализируются рано, поэтому, возможно, --extra-vars cli, но не об итерации цикла или переменной хоста.

Итак, что делать, если у вас есть общая именованная роль и общая именованная задача, выполняемая через 20 развертываний приложений? Ошибки должны быть информативными, если шаблон не может загрузить файл, он сообщит вам, какое имя файла. Немного увеличиваем многословие с ansible-playbook -vv помогает понять, что происходит, но является беспорядочным и многословным. Рассмотрите возможность использования программного обеспечения для ведения журнала playbook поверх Ansible, например ARA или AWX / Tower. В отчетах указано, какое выполнение загружено, какие переменные могут предоставить контекст.