Зарегистрируйтесь для доступа к 15+ бесплатным курсам по программированию с тренажером

Регистрация результата Основы автоматизации в 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 "Hello, from web server!"
_________________________
< Hello, from web server! >
-------------------------
        \   ^__^
         \  (oo)\_______
            (__)\       )\/\
                ||----w |
                ||     ||
  1. Добавьте в начало плейбука с установкой Nginx
  2. Зарегистриуйте результат выполнения команды cowsay в переменную cowsay_result.
  3. Модифицируйте шаблон templates/index.html.js2 и добавьте вывод команды cowsay на страницу. Чтобы результат на странице был сформатирован, оберните его в теги <pre><code>
  4. Залейте изменения на 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

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

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

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

Ошибки, сложный материал, вопросы >
Нашли опечатку или неточность?

Выделите текст, нажмите ctrl + enter и отправьте его нам. В течение нескольких дней мы исправим ошибку или улучшим формулировку.

Что-то не получается или материал кажется сложным?

Загляните в раздел «Обсуждение»:

  • задайте вопрос. Вы быстрее справитесь с трудностями и прокачаете навык постановки правильных вопросов, что пригодится и в учёбе, и в работе программистом;
  • расскажите о своих впечатлениях. Если курс слишком сложный, подробный отзыв поможет нам сделать его лучше;
  • изучите вопросы других учеников и ответы на них. Это база знаний, которой можно и нужно пользоваться.

Об обучении на Хекслете

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

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

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

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

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

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

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

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

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

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

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

Даю согласие на обработку персональных данных, соглашаюсь с «Политикой конфиденциальности» и «Условиями оказания услуг»