Зарегистрируйтесь, чтобы продолжить обучение

Регистрация результата Основы автоматизации в Ansible

Представьте себе ситуацию, когда результат вывода одной таски, нужно использовать в другой. Например, добавить в 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 странице.

  1. Добавьте команду установки пакета cowsay
  2. Зайдите по ssh на один из серверов. Запустите команду cowsay с сообщением:

    cowsay "This is server server_name!"
    _________________________
    < This is server server_name! >
    -------------------------
            \   ^__^
             \  (oo)\_______
                (__)\       )\/\
                    ||----w |
                    ||     ||
    
  3. Добавьте в начало плейбука с установкой Nginx

  4. Зарегистриуйте результат выполнения команды cowsay в переменную cowsay_result.

  5. Модифицируйте шаблон templates/index.html.j2 и добавьте вывод команды cowsay на страницу. Чтобы результат на странице был сформатирован, оберните его в теги <pre><code>

  6. Залейте изменения на 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>

Дополнительные материалы

  1. Регистрация переменных / Документация Ansible

Аватары экспертов Хекслета

Остались вопросы? Задайте их в разделе «Обсуждение»

Вам ответят команда поддержки Хекслета или другие студенты

Для полного доступа к курсу нужен базовый план

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

Получить доступ
1000
упражнений
2000+
часов теории
3200
тестов

Открыть доступ

Курсы программирования для новичков и опытных разработчиков. Начните обучение бесплатно

  • 130 курсов, 2000+ часов теории
  • 1000 практических заданий в браузере
  • 360 000 студентов
Отправляя форму, вы принимаете «Соглашение об обработке персональных данных» и условия «Оферты», а также соглашаетесь с «Условиями использования»

Наши выпускники работают в компаниях:

Логотип компании Альфа Банк
Логотип компании Aviasales
Логотип компании Yandex
Логотип компании Tinkoff

Используйте Хекслет по-максимуму!

  • Задавайте вопросы по уроку
  • Проверяйте знания в квизах
  • Проходите практику прямо в браузере
  • Отслеживайте свой прогресс

Зарегистрируйтесь или войдите в свой аккаунт

Отправляя форму, вы принимаете «Соглашение об обработке персональных данных» и условия «Оферты», а также соглашаетесь с «Условиями использования»