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, то выполнится только последняя команда.

Рекомендуемые программы