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

Могу ли я определить глобальные значения по умолчанию для задач модуля Ansible?

Я постоянно набираю аргументы в модули Ansible, связанные с файлами, например:

- copy:
    […]
    owner: root
    group: root
    mode: ugo=r

Хотя может показаться безопасным предположить, что отказ от этих аргументов в пользу владения приведет к тем же результатам, что и задачи 'sudoedly 'выполняется, я хотел бы определить эти аргументы один раз явно в области значений по умолчанию роли или переменных хоста для каждого модуля или даже группы модулей.

Есть ли способ облегчить такое определение?

Да, вы можете это сделать, если используете версию> = 2.6. Это можно сделать с помощью module_defaults ключевое слово.

Пример использования выглядит так:

- hosts: localhost
  gather_facts: no
  module_defaults:
    file:
      owner: foobar
  tasks:
    - file:
        path: /tmp/defaults_test
        state: touch

Параметры требуются при каждом вызове модуля. Это единственный способ ввода модуля.

При копировании нескольких файлов в задачу вы можете перебирать список.

- copy:
    src: "{{item}}"
    dest: "/etc/logrotate.d/{{item}}"
    owner: root
    group: root
    mode: ugo=r
  with_items:
  - foo
  - bar

Вы можете определить переменные для этих параметров, но вам все равно нужно использовать их при каждом вызове модуля. Это позволяет вам переопределить значение сразу во многих местах.

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

К счастью, вы не можете, и ваш запрос непоследователен из-за того, как вы используете слово «явно».

Фактически вы хотите "определить эти аргументы один раз, чтобы они применялись неявно".

А с другой стороны, Ansible требует указания значений параметров. явно.

Хотя может показаться безопасным предположить, что исключение этих аргументов в пользу владения приведет к тому же результату, что и задачи выполняются "sudoedly",

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

В простейшем случае файл уже существует, а Ansible изменяет только его содержимое. В этом случае он не будет неявно фиксировать разрешения / владение.


Лучшее, что вы можете сделать, - это явно указать необходимые параметры в задачах.

Если вы хотите иметь некоторую гибкость, используйте переменные, определенные в одном месте:

vars:
  my_owner: root
  my_group: root
  my_mode: ugo=r
tasks: 
  - copy:
      […]
      owner: "{{ my_owner }}"
      group: "{{ my_group }}"
      mode: "{{ my_mode }}"

Еще одна важная вещь, о которой следует помнить, заключается в том, что исторически не все модули вели себя одинаково в отношении прав доступа к файлам. А именно некоторые модули (url если я правильно помню) устанавливайте явно указанные разрешения только тогда, когда они действительно создали / изменили файл, в противном случае оставив разрешения без изменений.

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