Я постоянно набираю аргументы в модули Ansible, связанные с файлами, например:
- copy:
[…]
owner: root
group: root
mode: ugo=r
Хотя может показаться безопасным предположить, что отказ от этих аргументов в пользу владения приведет к тем же результатам, что и задачи 'sudo
edly 'выполняется, я хотел бы определить эти аргументы один раз явно в области значений по умолчанию роли или переменных хоста для каждого модуля или даже группы модулей.
Есть ли способ облегчить такое определение?
Да, вы можете это сделать, если используете версию> = 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 или другого инструмента).