Переменные словаря
Словарь хранит данные в парах ключ-значение.Обычно словари используются для хранения сопутствующих данных,таких как информация,содержащаяся в идентификаторе или профиле пользователя.
Определение переменных как словари key:value
Более сложные переменные можно определить с помощью словарей YAML.Словарь YAML сопоставляет ключи к значениям.Например:
foo: field1: one field2: two
Ключ ссылки:переменные словаря значений
Когда вы используете переменные,определяемые как словарь key:value (также называемый хэшем),вы можете использовать отдельные,специфические поля из этого словаря,используя либо нотацию в скобках,либо точечную нотацию:
foo foo.field1
Оба этих примера ссылаются на одно и то же значение («один»). Обозначение скобок всегда работает. Точечная запись может вызвать проблемы, потому что некоторые ключи конфликтуют с атрибутами и методами словарей Python. Используйте скобки, если вы используете ключи, которые начинаются и заканчиваются двумя символами подчеркивания (которые зарезервированы для специальных значений в python) или являются одними из известных общедоступных атрибутов:
, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , значения , .
Connecting to hosts: behavioral inventory parameters
As described above, setting the following variables control how Ansible interacts with remote hosts.
Host connection:
Note
Ansible does not expose a channel to allow communication between the user and the ssh process to accept a password manually to decrypt an ssh key when using the ssh connection plugin (which is the default). The use of is highly recommended.
- ansible_connection
-
Connection type to the host. This can be the name of any of ansible’s connection plugins. SSH protocol types are , or . The default is smart. Non-SSH based types are described in the next section.
General for all connections:
- ansible_host
-
The name of the host to connect to, if different from the alias you wish to give to it.
- ansible_port
-
The connection port number, if not the default (22 for ssh)
- ansible_user
-
The user name to use when connecting to the host
- ansible_password
-
The password to use to authenticate to the host (never store this variable in plain text; always use a vault. See )
Specific to the SSH connection:
- ansible_ssh_private_key_file
-
Private key file used by ssh. Useful if using multiple keys and you don’t want to use SSH agent.
- ansible_ssh_common_args
-
This setting is always appended to the default command line for sftp, scp,
and ssh. Useful to configure a for a certain host (or
group). - ansible_sftp_extra_args
-
This setting is always appended to the default sftp command line.
- ansible_scp_extra_args
-
This setting is always appended to the default scp command line.
- ansible_ssh_extra_args
-
This setting is always appended to the default ssh command line.
- ansible_ssh_pipelining
-
Determines whether or not to use SSH pipelining. This can override the setting in .
- ansible_ssh_executable (added in version 2.2)
-
This setting overrides the default behavior to use the system ssh. This can override the setting in .
Privilege escalation (see for further details):
- ansible_become
-
Equivalent to or , allows to force privilege escalation
- ansible_become_method
-
Allows to set privilege escalation method
- ansible_become_user
-
Equivalent to or , allows to set the user you become through privilege escalation
- ansible_become_password
-
Equivalent to or , allows you to set the privilege escalation password (never store this variable in plain text; always use a vault. See )
- ansible_become_exe
-
Equivalent to or , allows you to set the executable for the escalation method selected
- ansible_become_flags
-
Equivalent to or , allows you to set the flags passed to the selected escalation method. This can be also set globally in in the option
Remote host environment parameters:
- ansible_shell_type
-
The shell type of the target system. You should not use this setting unless you have set the
to a non-Bourne (sh) compatible shell. By default commands are
formatted using -style syntax. Setting this to or will cause commands
executed on target systems to follow those shell’s syntax instead.
- ansible_python_interpreter
-
The target host python path. This is useful for systems with more
than one Python or not located at /usr/bin/python such as *BSD, or where /usr/bin/python
is not a 2.X series Python. We do not use the /usr/bin/env mechanism as that requires the remote user’s
path to be set right and also assumes the python executable is named python, where the executable might
be named something like python2.6. - ansible_*_interpreter
-
Works for anything such as ruby or perl and works just like .
This replaces shebang of modules which will run on that host.
New in version 2.1.
- ansible_shell_executable
-
This sets the shell the ansible controller will use on the target machine,
overrides in which defaults to
/bin/sh. You should really only change it if is not possible
to use /bin/sh (in other words, if /bin/sh is not installed on the target
machine or cannot be run from sudo.).
Examples from an Ansible-INI host file:
some_host ansible_port=2222 ansible_user=manager aws_host ansible_ssh_private_key_file=/home/example/.ssh/aws.pem freebsd_host ansible_python_interpreter=/usr/local/bin/python ruby_module_host ansible_ruby_interpreter=/usr/bin/ruby.1.9.3
Специальные теги:всегда и никогда
Ansible reserves two tag names for special behavior: always and never. If you assign the tag to a task or play, Ansible will always run that task or play, unless you specifically skip it ( ).
Например:
tasks: - name: Print a message ansible.builtin.debug: msg: "Always runs" tags: - always - name: Print a message ansible.builtin.debug: msg: "runs when you use tag1" tags: - tag1
Warning
Сбор фактов по умолчанию помечен тегом «всегда». Он пропускается, только если вы применяете тег, а затем используете другой тег в —tags или тот же тег в —skip-tags .
Warning
Задача проверки спецификации аргумента роли по умолчанию помечена тегом «всегда». Эта проверка будет пропущена, если вы —skip-tags always используете —skip-tags .
Новинка в версии 2.5.
Если вы назначите тег задаче или игре, Ansible пропустит эту задачу или воспроизведение, если вы специально этого не запросите ( ).
Например:
tasks: - name: Run the rarely-used debug task ansible.builtin.debug: msg: '` showmevar `' tags:
Редко используемая задача отладки в приведенном выше примере запускается только тогда, когда вы специально запрашиваете теги или .
Comparing loop and with_*
-
The keywords rely on — even is a lookup.
-
The keyword is equivalent to , and is the best choice for simple loops.
-
The keyword will not accept a string as input, see .
-
Generally speaking, any use of covered in can be updated to use .
-
Be careful when changing to , as performed implicit single-level flattening. You may need to use with to match the exact outcome. For example, to get the same output as:
with_items - 1 - 2,3 - 4
you would need
loop "{{ 1, 2, 3], 4 | flatten(1) }}"
Any with_* statement that requires using lookup within a loop should not be converted to use the loop keyword. For example, instead of doing:
loop "{{ lookup('fileglob', '*.txt', wantlist=True) }}"
it’s cleaner to keep
Создание плейбука
Создаем файл для playbook:
vi /etc/ansible/play.yml
—
— hosts: redhat-servers
become:
true
become_method:
su
become_user:
root
remote_user:
ansible
roles:
— epel
— nginx
— hosts: debian-servers
become:
true
become_method:
sudo
become_user:
root
remote_user:
ansible
roles:
— nginx
* где:
- — — начало файла YAML. Данный формат имеет строгую структуру — важен каждый пробел;
- hosts — группа хостов, к которым будут применяться правила плейбука (если мы хотим, чтобы правила применялись ко всем хостам, указываем hosts: all);
- become — указывает на необходимость эскалации привилегий;
- become_method — метод эскалации привилегий;
- become_user — пользователь под которым мы заходим с помощью become_method;
- remote_user — пользователь, под которым будем подключаться к удаленным серверам;
- roles — список ролей, которые будут применяться для плейбука.
* В данном случае мы задействуем нашу группы хостов, которые создали в самом начале; повышаем привилегии методом su под пользователем root (su — root) для группы redhat-servers и методом sudo для debian-servers; подключение к серверам выполняется от пользователя ansible; используем созданную нами роль nginx (саму роль мы создадим позже). Для систем RPM сначала выполним роль epel — она будет отвечать за установку репозитория EPEL, так как в стандартном репозитории nginx нет.
Стоит отдельно уделить внимание вопросу повышения привилегий. IT-среды могут применять разные политики относительно безопасности
Например, на серверах CentOS, по умолчанию, нет sudo и повышать привилегии нужно с помощью su. В Ubuntu наоборот — по умолчанию есть sudo, а su не работает, так как пароль на root не устанавливается. В данном случае есть несколько путей при работе с Ansible:
- Как в нашем примере, разделить группы хостов на разные семейства операционных систем и применять к ним разные методы повышения привилегий. Чтобы данный плейбук корректно отработал, учетная запись, под которой идет удаленное подключение к серверу (в нашем примере ansible) должна иметь такой же пароль, как у пользователей root на серверах семейства Red Hat. Данный метод удобен с точки зрения отсутствия необходимости приводить к единому виду безопасность серверов разного семейства. Однако, с точки зрения безопасности лучше, чтобы пароли у root и ansible были разные.
- Использовать метод для создания плейбука, как описан выше, но запускать его с ключом —limit, например, ansible-playbook —limit=debian-servers … — таким образом, мы запустим отдельные задания для каждого семейства операционных систем и сможем ввести индивидуальные пароли для каждого случая.
- Мы можем на всех серверах deb установить пароль для пользователя root, таким образом, получив возможность для become_method: su.
- И наконец, можно для серверов Red Hat установить sudo и проходить become с помощью метода sudo.
Где установить переменные
Вы можете определять переменные в различных местах, например, в инвентаре, в сборниках игр, в повторно используемых файлах, в ролях и в командной строке. Ansible загружает все возможные переменные, которые он находит, затем выбирает переменную для применения на основе .
Определение переменных в инвентаризации
Вы можете определить разные переменные для каждого отдельного хоста или установить общие переменные для группы хостов в вашем инвентаре. Например, если все машины в группе используют boston.ntp.example.com в качестве сервера NTP, вы можете установить переменную группы. На странице « есть подробные сведения о настройке и в инвентаре.
Определение переменных в пьесе
Вы можете определить переменные непосредственно в playbook play:
- hosts: webservers vars: http_port: 80
Когда вы определяете переменные в пьесе,они видны только задачам,выполняемым в этой пьесе.
Определение переменных в включаемых файлах и ролях
Вы можете определять переменные в файлах многоразовых переменных и / или в многоразовых ролях. Когда вы определяете переменные в повторно используемых файлах переменных, чувствительные переменные отделяются от playbooks. Такое разделение позволяет хранить свои плейбуки в программном обеспечении контроля версий и даже делиться плейбуками без риска раскрытия паролей или других конфиденциальных и личных данных. Для получения информации о создании повторно используемых файлов и ролей см. .
Этот пример показывает,как можно включить переменные,определенные во внешнем файле:
--- - hosts: all remote_user: root vars: favcolor: blue vars_files: - /vars/external_vars.yml tasks: - name: This is just a placeholder ansible.builtin.command: /bin/echo foo
Содержимое каждого файла переменных представляет собой простой YAML словарь.Например:
--- somevar: somevalue password: magic
Note
Вы можете хранить переменные для каждого хоста и для группы в аналогичных файлах. Чтобы узнать об организации переменных, см. .
Определение переменных во время выполнения
Вы можете определять переменные при запуске своей playbook, передавая переменные в командной строке с помощью (или ). Вы также можете запросить ввод пользователя с помощью (см. ). Когда вы передаете переменные в командной строке, используйте одну строку в кавычках, содержащую одну или несколько переменных, в одном из форматов ниже.
формат ключ=значение
Значения, переданные с использованием синтаксиса , интерпретируются как строки. Используйте формат JSON, если вам нужно передать нестроковые значения, такие как логические значения, целые числа, числа с плавающей запятой, списки и т. Д.
ansible-playbook release.yml --extra-vars "version=1.23.45 other_variable=foo"
JSON-строковый формат
ansible-playbook release.yml --extra-vars '{"version":"1.23.45","other_variable":"foo"}' ansible-playbook arcade.yml --extra-vars '{"pacman":"mrs","ghosts":}'
При передаче переменных с помощью необходимо экранировать кавычки и другие специальные символы как для разметки (например, JSON), так и для оболочки:
ansible-playbook arcade.yml --extra-vars "{\"name\":\"Conan O\'Brien\"}" ansible-playbook arcade.yml --extra-vars '{"name":"Conan O'\\\''Brien"}' ansible-playbook script.yml --extra-vars "{\"dialog\":\"He said \\\"I just can\'t get enough of those single and double-quotes"\!"\\\"\"}"
Если у вас много специальных символов,используйте JSON или YAML файл,содержащий определения переменных.
Разное
В данном разделе будет рассказано о дополнительных опциях, которые позволяют менять поведение выполнения задач, добавляет функциональности или все то, для чего не найдена отдельная подходящая категория.
1. Шифрование строки.
С помощью ansible-vault мы можем шифровать файлы и папки. Это позволит нам хранить секреты не в открытом виде. Данные расшифровываются в момент выполнения задач.
Данной командой мы получаем шифрованную строку:
ansible-vault encrypt_string
Система запросит ввести дважды пароль и предложит ввести строку, которую нужно зашифровать. После мы должны нажать 2 раза Ctrl + D — мы получим строку, которая начинается с !Vault и различные символы.
Для того, чтобы в момент выполнения задачи ansible расшифровал данные, при запуске плейбука мы должны указать ключ —ask-vault-pass:
ansible-playbook … —ask-vault-pass
Об ansible-vault: https://docs.ansible.com/ansible/latest/user_guide/vault.html.
2. Игнорировать ошибки.
Если ansible столкнется с ошибкой при выполнении задачи, работа плейбука будет завершена. Иногда, нужно пропустить ошибку при выполнении определенной задачи, чтобы выполнение было продолжено. Для этого существует опция ignore.
а) чтобы пропустить ошибки выполнения, в настройка задачи используем:
— name: Bad Task
…
ignore_errors: yes
б чтобы игнорировать ошибки при подключении к хосту:
— name: Bad Task
…
ignore_unreachable: yes
3. Начинать выполнение с определенной задачи.
При выполнении отладки, полезно запустить плейбук, но начать выполнение с определенной задачи. Остальные пропустить.
Это можно сделать с помощью опции —start-at-task:
ansible-playbook … —start-at-task=»Start Job»
* в данном примере плейбук начнет выполнять задания с задачи Start Job.
4. Завершить выполнение плейбука после определенной задачи.
С помощью данной конструкции:
— meta: end_play
5. Зависимые роли.
С помощью файла meta/main.yml в роли мы можем определить пред-роль, от которой зависит выполнение текущей роли. Для этого настраивается опция dependencies:
dependencies:
— role: pred
6. Вставка роли и ее задач.
Позволяет в процессе выполнения задачи подключить роль. Делается при помощи include_role:
— name: «Include Other Role»
include_role:
name: other_role
А это пример, как подключить роль и сделать так, чтобы все ее задачи выполнились на определенном хосте:
— name: «Include Other Role»
include_role:
name: other_role
apply:
delegate_to: «` deploy_vm`.`instance`.`ipv4 `»
7. Повторы при выполнении задачи.
Мы можем управлять цикличностью выполнения задач с помощью retries (количиство повторов), delay (задержка в секундах).
Рассмотрим пример повтора выполнения задачи при возникновении ошибки:
— name: Run anything command
command: /foo/bar/cmd
register: result
retries: 3
delay: 60
until: result is not failed
* в данном примере мы будем выполнять команду /foo/bar/cmd пока ее выполнение не закончится без ошибок. Количество повторов будет равен 3 с интервалом в 60 секунд.
Небольшой пример на странице .
8. Резервное копирование базы данных MySQL/MariaDB.
Работа с базой данных возможно с помощью коллекции mysql.mysql_db. Она не идет в комплекте к ansible и нам необходимо ее установить командой:
ansible-galaxy collection install community.mysql
Резервное копирование можно выполнить так:
— name: Dump mysql databases
community.mysql.mysql_db:
state: dump
name:
— db1
— db2
target: /tmp/dump.sql
* в данном примере мы создадим 2 дампа из баз db1 и db2 и сохраним результат в файл /tmp/dump.sql.
О mysql_db: https://docs.ansible.com/ansible/latest/collections/community/mysql/mysql_db_module.html.
9. Объединение задач в блоки.
Это позволит установить общие свойства и условие для нескольких задач. Такая форма записи уменьшит количиство строк и упростит восприятие.
Синтаксис записи:
— name: Block Name
block:
— name: Task 1
…
— name: Task 2
…
— name: Task 3
…
when: ansible_facts == ‘CentOS’
become: true
become_user: root
ignore_errors: yes
* в данном примере будет выполнены 3 задачи, если выполнится одно условие, которое описывается не для задач, а для блока.
О block: https://docs.ansible.com/ansible/latest/user_guide/playbooks_blocks.html.
10. Перебор массива.
Предположим, нам нужно перебрать все элементы массива в шаблоне. Это можно сделать конструкцией:
{% for host in my_hosts %}
server «` host `»
{% endfor %}
* в данном примере мы сделаем перебор по переменной my_hosts. Для каждого элемента массива будет создана строка со значением server <значение переменной>.
Переменные регистрации
Вы можете создавать переменные из вывода задачи Ansible с помощью ключевого слова задачи . Вы можете использовать зарегистрированные переменные в любых последующих задачах вашей игры. Например:
- hosts: web_servers tasks: - name: Run a shell command and register its output as a variable ansible.builtin.shell: /usr/bin/foo register: foo_result ignore_errors: true - name: Run a shell command using output of the previous task ansible.builtin.shell: /usr/bin/bar when: foo_result.rc == 5
For more examples of using registered variables in conditions on later tasks, see . Registered variables may be simple variables, list variables, dictionary variables, or complex nested data structures. The documentation for each module includes a section describing the return values for that module. To see the values for a particular task, run your playbook with .
Зарегистрированные переменные хранятся в памяти.Вы не можете кэшировать зарегистрированные переменные для использования в будущих воспроизведениях.Зарегистрированные переменные действительны только на хосте в течение оставшейся части текущего проигрывания.
Зарегистрированные переменные — это переменные уровня хоста. Когда вы регистрируете переменную в задаче с циклом, зарегистрированная переменная содержит значение для каждого элемента в цикле. Структура данных, помещенная в переменную во время цикла, будет содержать атрибут , то есть список всех ответов от модуля. Более подробный пример того, как это работает, см. В разделе « » об использовании регистра с циклом.
Note
Если задача не выполняется или пропускается, Ansible по-прежнему регистрирует переменную с ошибкой или пропущенным статусом, если только задача не пропущена на основе тегов. См. Раздел для получения информации о добавлении и использовании тегов.
Background
I have been learning and heavily refactoring a playbook and role for some time. Initially I tested by specifying tags, but continued refactoring and testing just by limiting specific test hosts to run the plays against. Now that I’ve converted the main playbook and role to use and statements I found that I am also affected by the bug noted here and on : the tasks with tags specified within included role/tasks file no longer run when I specify a tag at the command-line (e.g., )
I encountered this with Ansible 2.7.1, but updated to 2.7.2 and confirmed that the issue is still present.
I’ve attempted to strip the playbook/role down to the essentials, but still clearly convey the intent.
Обновление сертификата
Так как большинство современных сервисов требуют для своей работы сертификат, рассмотрим пример централизованного их обновления.
Предположим, что у нас есть сертификат wildcard и необходимо его копировать на все серверы компании. Если серверов много, делать это вручную при очередном его обновлении неудобно.
И так, создаем новую роль:
ansible-galaxy init Update_Certs
Открываем на редактирование файл с заданиями:
vi Update_Certs/tasks/main.yml
—
— name: Register System Services
service_facts:
register: services_state
— name: Create Directories For Certs
file:
path: ‘/etc/ssl/dmoks’
state: directory
owner: root
group: root
mode: 0755
— name: Copy Cert File If Different
copy:
src: «` item `»
dest: /etc/ssl/dmosk
remote_src: no
mode: 0644
owner: root
group: root
with_fileglob:
— files/*
notify:
— reload httpd
— reload nginx
— reload apache2
* будут выполняться следующие задачи:
- Register System Services — получаем список всех служб, которые работают на целевом компьютере
- Create Directories For Certs — создаем каталог /etc/ssl/dmoks, в который будем копировать сертификаты
- Copy Cert File If Different — копируем сертификаты в целевой каталог. Если были изменения в любом из файлов, по очереди запускаем 3 задачи в handlers для перезагрузки сервисов. Здесь нам нужно самостоятельно перечислить все службы, которые вам нужно перезагружать.
Открываем на редактирование файл в каталоге handlers:
vi Update_Certs/handlers/main.yml
Добавим строки:
—
— name: reload httpd
systemd:
name: httpd
state: restarted
when:
services_state.ansible_facts.services.state == ‘running’
ignore_errors: yes
— name: reload nginx
systemd:
name: nginx
state: restarted
when:
services_state.ansible_facts.services.state == ‘running’
ignore_errors: yes
— name: reload apache2
systemd:
name: apache2
state: restarted
when:
services_state.ansible_facts.services.state == ‘running’
ignore_errors: yes
* в задачах, в случае изменения сертификатов, мы выполняем задания reload httpd, reload nginx и reload apache2. Все задания описаны в данном файле. В данном примере мы проверяем, что сервисы запущены и если это так, перезапускаем их. Нам необходимо перезапускать все службы, которые используют сертификаты (в противном случае, обновленные сертификаты не будут использоваться). При необходимости дописать службы, делаем это по аналогии.
В каталог Update_Certs/files/ помещаем наши сертификаты — все содержимое данного каталога будет копироваться на целевые компьютеры в каталог /etc/ssl/dmosk.
Создаем файл для плейбука:
vi start_role.yml
—
— hosts: test_servers
user: dmosk
become: true
become_method: su
become_user: root
roles:
— Update_Certs
* в данном примере мы запускаем выполнение роли Update_Certs на серверы из группы test_servers.
Запускаем созданный плейбук:
ansible-playbook start_role.yml -kK
Registering variables with a loop
You can register the output of a loop as a variable. For example
- name Register loop output as a variable ansible.builtin.shell "echo{{ item }}" loop - "one" - "two" register echo
When you use with a loop, the data structure placed in the variable will contain a attribute that is a list of all responses from the module. This differs from the data structure returned when using without a loop.
{ "changed" true, "msg" "All items completed", "results" { "changed" true, "cmd" "echo \"one\" ", "delta" "0:00:00.003110", "end" "2013-12-19 12:00:05.187153", "invocation" { "module_args" "echo \"one\"", "module_name" "shell" }, "item" "one", "rc" , "start" "2013-12-19 12:00:05.184043", "stderr" "", "stdout" "one" }, { "changed" true, "cmd" "echo \"two\" ", "delta" "0:00:00.002920", "end" "2013-12-19 12:00:05.245502", "invocation" { "module_args" "echo \"two\"", "module_name" "shell" }, "item" "two", "rc" , "start" "2013-12-19 12:00:05.242582", "stderr" "", "stdout" "two" } }
Subsequent loops over the registered variable to inspect the results may look like
- name Fail if return code is not 0 ansible.builtin.fail msg "Thecommand({{ item.cmd }})didnothaveareturncode" when item.rc != 0 loop "{{ echo.results }}"
During iteration, the result of the current item will be placed in the variable.
Introduction¶
While it is possible to write a playbook in one very large file (and you might start out learning playbooks this way),
eventually you’ll want to reuse files and start to organize things.
At a basic level, including task files allows you to break up bits of
configuration policy into smaller files. Task includes pull in tasks from other
files. Since handlers are tasks too, you can also include handler files from
the ‘handler’ section.
See Playbooks if you need a review of these concepts.
Playbooks can also include plays from other playbook files. When that is done, the plays will be inserted into the playbook to form
a longer list of plays.
When you start to think about it – tasks, handlers, variables, and so on – begin to form larger concepts. You start to think about modeling
what something is, rather than how to make something look like something. It’s no longer “apply this handful of THINGS to these hosts”, you say “these hosts are dbservers” or “these hosts are webservers”. In programming, we might call that “encapsulating” how things work. For instance,
you can drive a car without knowing how the engine works.
Roles in Ansible build on the idea of include files and combine them to form clean, reusable abstractions – they allow you to focus
more on the big picture and only dive down into the details when needed.
We’ll start with understanding includes so roles make more sense, but our ultimate goal should be understanding roles – roles
are great and you should use them every time you write playbooks.
Часть 3: Захват вывода с помощью регистров в Ansible
Некоторые задачи не отображают никаких результатов при запуске playbook. Например, выполнение команд на ваших управляемых узлах с использованием команд , оболочки или необработанных модулей не будет отображать никаких выходных данных при запуске playbook.
Вы можете использовать регистр для захвата вывода задачи и сохранения его в переменной. Это позволяет вам использовать вывод задачи в другом месте книги, просто обращаясь к зарегистрированной переменной.
Следующий файл register-playbook.yml показывает вам, как записать вывод задачи в зарегистрированной переменной, а затем отобразить его содержимое:
$ cat register-playbook.yml --- - name: Register Playbook hosts: proxy tasks: - name: Run a command command: uptime register: server_uptime - name: Inspect the server_uptime variable debug: var: server_uptime - name: Show the server uptime debug: msg: "` server_uptime`.`stdout `"
Playbook запускается с выполнения команды uptime на хостах группы прокси (node1) и регистрирует выходные данные команды в переменной server_uptime.
Затем вы используете модуль отладки вместе с параметром var module для проверки переменной server_uptime. Обратите внимание, что здесь не нужно заключать переменную в фигурные скобки. Наконец, последняя задача в playbook показывает вывод (stdout) зарегистрированной переменной server_uptime
Наконец, последняя задача в playbook показывает вывод (stdout) зарегистрированной переменной server_uptime.
Запустите playbook, чтобы увидеть все это в действии:
$ ansible-playbook register-playbook.yml PLAY ********************************************** TASK ********************************************************* ok: TASK *********************************************************** changed: TASK ************************************** ok: => { "server_uptime": { "changed": true, "cmd": , "delta": "0:00:00.004221", "end": "2020-10-29 05:04:36.646712", "failed": false, "rc": 0, "start": "2020-10-29 05:04:36.642491", "stderr": "", "stderr_lines": [], "stdout": " 05:04:36 up 3 days, 6:56, 1 user, load average: 0.24, 0.07, 0.02", "stdout_lines": } } TASK ************************************************** ok: => { "msg": " 05:04:36 up 3 days, 6:56, 1 user, load average: 0.24, 0.07, 0.02" } PLAY RECAP ********************************************************************* node1 : ok=4 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
Обратите внимание, что зарегистрированная переменная server_uptime на самом деле является словарем, содержащим множество других ключей помимо ключа stdout. Она также содержит другие ключи, такие как rc (код возврата), start (время выполнения команды), end (время завершения команды), stderr (любые ошибки) и т
д.