Представьте себе ситуацию, когда результат вывода одной таски, нужно использовать в другой. Например, добавить в cron список домашних директорий пользователя. Для выполнения такой операции в Ansible существует механизм, который называется регистрация результата:
- hosts: all
gather_facts: no
tasks:
- ansible.builtin.shell: ls /Users
register: home_dirs
- name: add home dirs to cron
ansible.builtin.cron:
name: "backup_dirs"
minute: "0"
hour: "5,2"
job: "backup /home/{{ item }}"
with_items: home_dirs.stdout_lines
- ansible.builtin.debug:
var: home_dirs.stdout_lines
С помощью ключа register
, можно записать результат работы модуля shell
в переменную с произвольным именем, например, home_dirs
. И использовать эту переменную в другой задаче, при вызове модуля cron
.
Распечатаем содержимое переменной home_dirs
. Для этого нам подойдет модуль debug
, который позволяет делать вывод значений:
- hosts: all
gather_facts: no
tasks:
- ansible.builtin.shell: ls /Users
register: home_dirs
# - name: add home dirs to cron
# ansible.builtin.cron: name="backup_dirs" minute="0" hour="5.2" job="backup /home/{{ item }}"
# loop: home_dirs.stdout_lines
- name: print home_dirs variable
ansible.builtin.debug:
var: home_dirs
ansible-playbook playbook.yml -i inventory.ini
TASK: [print home_dirs variable] ****************
ok: [localhost] => {
"var": {
"home_dirs": {
"changed": true,
"cmd": "ls /Users",
"delta": "0:00:00.011196",
"end": "2020-08-11 15:20:12.739441",
"failed": false,
"rc": 0,
"start": "2020-08-11 15:20:12.728245",
"stderr": "",
"stderr_lines": [],
"stdout": "Guest\nShared\nkirill"
"stdout_lines": [
"Guest",
"Shared",
"kirill"
]
}
}
}
home_dirs
- это хеш, внутри которого содержится информация о таске: выполнена ли задача, сколько времени заняло ее выполнение, какой модуль использовался и, самое главное, содержимое stderr
и stdout
. Причем stdout
представлен в двух форматах: в виде строки и списка. Списочный формат позволяет использовать результат в цикле, что мы и сделали в первоначальном плейбуке.
Еще один пример:
- hosts: all
gather_facts: no
tasks:
- ansible.builtin.command: 'false'
register: result
ignore_errors: yes
- ansible.builtin.command: echo 'ehu'
when: not result.failed
- ansible.builtin.command: uptime
when: result.failed
Здесь модуль command
вызывает функцию false
. Результат работы модуля регистрируется в переменную result
. Строго говоря, функция возвращает не нулевой статус, поэтому плейбук должен завершиться с ошибкой и не выполняться дальше. На самом деле так и происходит. Но вывод ошибки можно подавить с помощью ignore_errors
. Этот ключ позволяет продолжить выполнение плейбука вне зависимости от успешности выполнения команды.
Дальше идет два варианта развития событий. Нужная команда выполняется по условию. И поскольку result.failed: true
, то выполнится только последняя команда.
Самостоятельная работа
Зарегистрируем результат выполнения команды в переменную, а саму переменную выведем на HTML странице.
- Добавьте команду установки пакета
cowsay
Зайдите по ssh на один из серверов. Запустите команду
cowsay
с сообщением:cowsay "This is server server_name!" _________________________ < This is server server_name! > ------------------------- \ ^__^ \ (oo)\_______ (__)\ )\/\ ||----w | || ||
Добавьте в начало плейбука с установкой Nginx
Зарегистриуйте результат выполнения команды
cowsay
в переменнуюcowsay_result
.Модифицируйте шаблон templates/index.html.j2 и добавьте вывод команды
cowsay
на страницу. Чтобы результат на странице был сформатирован, оберните его в теги<pre><code>
Залейте изменения на Github
В результате получится следующая страница:
<html lang="en"><head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Hello World!</title>
</head>
<body>
<h1>Hello World!</h1>
<h2>THIS IS SERVER UBUNTU-S-1VCPU-1GB-FRA1-02!</h2>
<pre><code> _____________________________
/ This is server \
\ ubuntu-s-1vcpu-1gb-fra1-02! /
-----------------------------
\ ^__^
\ (oo)\_______
(__)\ )\/\
||----w |
|| ||</code></pre>
<small>Deployed at: Пт 24 дек 2021 15:26:10</small>
</body></html>
Дополнительные материалы
Остались вопросы? Задайте их в разделе «Обсуждение»
Вам ответят команда поддержки Хекслета или другие студенты
Для полного доступа к курсу нужен базовый план
Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.