Определение
args:
— это директива, позволяющая “распаковывать” аргументы со значениями в модуль, чаще всего мы передаем лишь значение по уже ранее предопределенным аргументам (что-то вроде **kwargs
в питоне)
Что это значит? Покажу на практике:
- name: Create file
ansible.builtin.command: touch some_file
args:
chdir: /tmp/
creates: /tmp/some_file
Полностью идентична таске:
- name: Create file
ansible.builtin.command:
cmd: touch some_file
chdir: /tmp/
creates: /tmp/some_file
Но в первом варианте мы передаем команду как строку и места куда бы добавить chdir
и creates
попросту не остается
Приведу еще несколько полезных примеров:
args:
и loop:
Используя args:
и loop:
(или with_X
) можно делать таски более компактными, например:
# Без args:
- name: Remove Qemu-NAT line and add DNS server to resolv.conf
ansible.builtin.lineinfile:
path: /etc/resolv.conf
state: "{{ item.state }}"
line: "{{ item.line }}"
loop:
- { state: absent, line: nameserver 10.0.2.3 }
- { state: present, line: nameserver 192.0.2.1 }
# Используя args:
- name: Remove Qemu-NAT line and add DNS server to resolv.conf
ansible.builtin.lineinfile:
path: /etc/resolv.conf
args: "{{ item }}"
loop:
- { state: absent, line: nameserver 10.0.2.3 }
- { state: present, line: nameserver 192.0.2.1 }
args:
и default(omit)
Можно делать разные наборы аргументов для каждого элемента словаря аналогично поведению default(omit):
:
# Без args:
- name: Install deb pkgs
ansible.builtin.apt:
deb: http://192.0.2.1/repo/somepackage-x86_64.deb
state: present
- name: Install pkgs on arm host
ansible.builtin.apt:
name:
- firefox
- chromium
- libreoffice
update_cache: true
state: present
install_recommends: false
# Используя args:
- name: Install pkgs
ansible.builtin.apt:
state: present
args: "{{ item }}"
loop:
- deb: http://192.0.2.1/repo/somepackage-x86_64.deb
- name:
- firefox
- chromium
- libreoffice
update_cache: true
install_recommends: false
В отличие от register:
, set_fact:
является модулем, а следовательно переменная из set_fact
будет принадлежать лишь хосту, который был выбран для run_once:
, но я напомню, что set_fact
может передаваться между различными play’ями (подробнее в посте про set_fact)
- name: A simple example
hosts: all
tasks:
- name: Run this ask only on one of the hosts
ansible.builtin.set_fact:
sample_variable: Played on {{ ansible_host }}
run_once: true
# Эта таска упадет с ошибкой на всех других хостах
- name: Try to show it on all hosts
ansible.builtin.debug:
var: sample_variable
Безопасность
Однако стоит учитывать, что использовать переменные в таком случае (если вы пишете роль или коллекцию) может быть небезопасно, потому что можно будет легко переопределить аргументы и значения (https://docs.ansible.com/ansible/devel/reference_appendices/faq.html#when-is-it-unsafe-to-bulk-set-task-arguments-from-a-variable)