Как записать вывод ansible в файл

Обновлено: 30.06.2024

Это руководство по стилю шпаргалки содержит краткую справку о командах и методах, обычно используемых при работе с Ansible. Для получения общего представления об Ansible и о том, как его установить и настроить, пожалуйста, ознакомьтесь с нашим руководством по установке и настройке Ansible на Ubuntu 18.04.

Как использовать это руководство:

  • Это руководство представлено в формате шпаргалки с автономными фрагментами командной строки.
  • Переходите к любому разделу, который имеет отношение к задаче, которую вы пытаетесь выполнить.
  • Когда вы видите highlighted text в этом руководстве команды, имейте в виду, что этот текст должен относиться к хостам, именам пользователей и IP-адресам из вашего собственного инвентаря.

Глоссарий

В настоящем руководстве в основном используются следующие специфические для ansible термины:

  • Управляющая машина / узел: система, в которой установлен и сконфигурирован Ansible для подключения и выполнения команд на узлах.
  • Узел: сервер, управляемый Ansible.
  • Файл инвентаризации: файл, содержащий информацию о серверах, на которых обычно находятся элементы управления Ansible /etc/ansible/hosts .
  • Playbook: файл, содержащий ряд задач, которые должны быть выполнены на удаленном сервере.
  • Роль: коллекция книг воспроизведения и других файлов, имеющих отношение к такой цели, как установка веб-сервера.
  • Игра: полный пробег ansible. Пьеса может иметь несколько сборников пьес и ролей, включенных из одного сборника пьес, который действует как точка входа.

Если вы хотите практиковать команды, используемые в этом руководстве, с рабочим учебником Ansible playbook, вы можете использовать этот учебник из нашего руководства по автоматизации начальной настройки сервера с помощью Ansible на Ubuntu 18.04. Вам понадобится по крайней мере один сервер для использования в качестве узла.

Тестирование подключения к узлам

Чтобы проверить, что Ansible может подключать и запускать команды и книги воспроизведения на ваших узлах, вы можете использовать следующую команду:

ping Модуль проверит, есть ли у вас действительные учетные данные для подключения к узлам, определенным в вашем файле инвентаризации, в дополнение к проверке того, может ли Ansible запускать скрипты Python на удаленном сервере. Ответ pong назад означает, что Ansible готов запускать команды и PlayBook на этом узле

Подключение от имени другого пользователя

По умолчанию Ansible пытается подключиться к узлам в качестве текущего системного пользователя, используя соответствующую пару клавиш SSH. Чтобы подключиться как другой пользователь, добавьте команду с

флагом и именем предполагаемого пользователя:

То же самое справедливо и для ansible-playbook:

Использование пользовательского ключа SSH

Если вы используете пользовательский SSH-ключ для подключения к удаленным серверам, вы можете предоставить его во время выполнения с

Эта опция также действительна для ansible-playbook:

Использование аутентификации на основе пароля

Если вам нужно использовать аутентификацию на основе пароля для подключения к узлам, вам нужно добавить эту опцию

к вашей команде Ansible.

Это позволит Ansible запрашивать пароль пользователя на удаленном сервере, к которому вы пытаетесь подключиться в качестве:

Эта опция также действительна для ansible-playbook:

Предоставление sudo пароля

Эта опция также действительна для ansible-playbook :

Использование пользовательского файла инвентаризации

Файл инвентаризации по умолчанию обычно находится по адресу /etc/ansible/hosts , но вы также можете использовать эту -i опцию, чтобы указать на пользовательские файлы инвентаризации при запуске команд Ansible и PlayBook. Это полезно для настройки запасов по каждому проекту, которые могут быть включены в системы контроля версий, такие как Git:

Тот же вариант действителен и для ansible-playbook :

Использование динамического файла инвентаризации

Ansible поддерживает сценарии инвентаризации для построения динамических файлов инвентаризации. Это полезно, если ваш инвентарь колеблется, а серверы часто создаются и уничтожаются.

Вы можете найти несколько сценариев инвентаризации с открытым исходным кодом в официальном репозитории Ansible GitHub. После загрузки нужного скрипта на вашу машину управления Ansible и настройки любой необходимой информации — например, учетных данных API — вы можете использовать исполняемый файл в качестве пользовательского инвентаря с любой командой Ansible, поддерживающей эту опцию.

Следующая команда использует сценарий инвентаризации DigitalOcean от Ansible с ping командой для проверки подключения ко всем текущим активным серверам:

Для получения более подробной информации о том, как использовать динамические файлы инвентаризации, пожалуйста, обратитесь к официальной документации Ansible.

Выполнение специальных команд

Чтобы выполнить команду на узле, используйте -a опцию, за которой следует команда, которую вы хотите запустить, в кавычках.

Это будет выполняться uname -a на всех узлах в вашем инвентаре:

Кроме того, с помощью этой опции можно запускать ansible модули -m . Следующая команда установит пакет vim on server1 из вашего инвентаря:

Прежде чем вносить изменения в узлы, вы можете провести тестовый прогон, чтобы предсказать, как ваша команда повлияет на серверы. Это можно сделать, включив --check опцию:

Запуск Playbook

Чтобы запустить playbook и выполнить все задачи, определенные в нем, используйте ansible-playbook команду:

Чтобы перезаписать параметр hosts по умолчанию в playbook и ограничить выполнение определенной группой или хостом, включите этот параметр -l в свою команду:

Получение информации

Эта опция --list-tasks используется для перечисления всех задач, которые будут выполняться игрой без внесения каких-либо изменений на удаленные серверы:

Точно так же можно перечислить все хосты, которые будут затронуты игрой, не выполняя никаких задач на удаленных серверах:

Вы можете использовать теги, чтобы ограничить выполнение пьесы. Чтобы перечислить все теги, доступные в игре, используйте опцию --list-tags :

Контроль Выполнения Playbook

Вы можете использовать эту опцию --start-at-task , чтобы определить новую точку входа для вашего playbook. Затем Ansible пропустит все, что предшествует указанной задаче, выполнив оставшуюся часть воспроизведения с этого момента. Этот параметр требует допустимого имени задачи в качестве аргумента:

Этот параметр можно использовать только для выполнения задач, связанных с определенными тегами --tags . Например, если вы хотите выполнять только задачи, помеченные как nginx или mysql , вы можете использовать:

Если вы хотите пропустить все задачи, которые находятся под определенными тегами, используйте --skip-tags . Следующая команда будет выполнена myplaybook.yml , пропуская все задачи, помеченные как mysql :

Использование Ansible Vault для хранения конфиденциальных данных

Если ваши Ansible playbook имеют дело с конфиденциальными данными, такими как пароли, ключи API и учетные данные, важно обеспечить безопасность этих данных с помощью механизма шифрования. Ansible обеспечивает ansible-vault шифрование файлов и переменных.

Несмотря на то, что можно зашифровать любой файл данных Ansible, а также двоичные файлы, его чаще всего используют ansible-vault для шифрования переменных файлов, содержащих конфиденциальные данные. После шифрования файла с помощью этого инструмента вы сможете выполнить, отредактировать или просмотреть его содержимое, только предоставив соответствующий пароль, определенный при первом шифровании файла.

Создание нового зашифрованного файла

Вы можете создать новый зашифрованный файл Ansible с помощью:

Эта команда будет выполнять следующие действия:

      • Во-первых, он предложит вам ввести новый пароль. Вам нужно будет вводить этот пароль всякий раз, когда вы получаете доступ к содержимому файла, будь то для редактирования, просмотра или просто запуска PlayBook или команд, использующих эти значения.
      • Затем он откроет редактор командной строки по умолчанию, чтобы вы могли заполнить файл нужным содержимым.
      • Наконец, когда вы закончите редактирование, ansible-vault сохраните файл как зашифрованные данные.

      Шифрование существующего файла Ansible

      Для шифрования существующего файла Ansible можно использовать следующий синтаксис:

      Это запросит у вас пароль, который вам нужно будет вводить всякий раз, когда вы получаете доступ к файлу credentials.yml .

      Просмотр содержимого зашифрованного файла

      Если вы хотите просмотреть содержимое файла, который ранее был зашифрован, ansible-vault и вам не нужно изменять его содержимое, вы можете использовать:

      При этом вам будет предложено ввести пароль, который вы выбрали при первом шифровании файла ansible-vault .

      Редактирование зашифрованного файла

      Чтобы отредактировать содержимое файла, который ранее был зашифрован с помощью Ansible Vault, выполните команду:

      При этом вам будет предложено ввести пароль, который вы выбрали при первом шифровании файла credentials.yml ansible-vault . После проверки пароля откроется редактор командной строки по умолчанию с незашифрованным содержимым файла, что позволит вам внести необходимые изменения. Когда вы закончите, вы можете сохранить и закрыть файл, как обычно, и обновленное содержимое будет сохранено в виде зашифрованных данных.

      Расшифровка Зашифрованных Файлов

      Если вы хотите навсегда вернуть файл, который ранее был зашифрован, ansible-vault в его незашифрованную версию, вы можете сделать это с помощью этого синтаксиса:

      При этом вам будет предложено ввести тот же пароль, который использовался при первом шифровании файла credentials.yml ansible-vault . После проверки пароля содержимое файла будет сохранено на диске в виде незашифрованных данных.

      Использование Нескольких Паролей Хранилища

      Ansible поддерживает несколько паролей хранилища, сгруппированных по различным идентификаторам хранилища. Это полезно, если вы хотите иметь специальные пароли хранилища для различных сред, таких как среды разработки, тестирования и производства.

      Чтобы создать новый зашифрованный файл с помощью пользовательского идентификатора хранилища, включите эту --vault-id опцию вместе с меткой и местоположением, где ansible-vault можно найти пароль для этого хранилища. Метка может быть любым идентификатором , а расположение может быть любым prompt , что означает, что команда должна предложить вам ввести пароль или действительный путь к файлу паролей.

      Это создаст новый идентификатор хранилища с именем dev , который будет использоваться prompt в качестве источника пароля. Комбинируя этот метод с файлами групповых переменных, вы сможете иметь отдельные хранилища ansible для каждой среды приложения:

      Мы использовали dev и prod в качестве идентификаторов хранилищ, чтобы продемонстрировать, как можно создавать отдельные хранилища для каждой среды, но вы можете создать столько хранилищ, сколько захотите, и вы можете использовать любой идентификатор по вашему выбору в качестве идентификатора хранилища.

      Теперь, чтобы просмотреть, отредактировать или расшифровать эти файлы, вам нужно будет предоставить тот же идентификатор хранилища и источник пароля вместе с ansible-vault командой:

      Использование файла паролей

      Если вам нужно автоматизировать процесс подготовки серверов с помощью Ansible с помощью стороннего инструмента, вам понадобится способ предоставить пароль хранилища без запроса на него. Вы можете сделать это, используя файл пароля ansible-vault С.

      Файл пароля может быть обычным текстовым файлом или исполняемым скриптом. Если файл является исполняемым скриптом, то выходные данные, созданные этим скриптом, будут использоваться в качестве пароля хранилища. В противном случае необработанное содержимое файла будет использоваться в качестве пароля хранилища.

      Чтобы использовать файл паролей ansible-vault , вам необходимо указать путь к файлу паролей при выполнении любой из команд vault:

      Ansible не делает различия между содержимым, которое было зашифровано с помощью prompt файла паролей или файла паролей в качестве источника паролей, если входной пароль один и тот же. На практике это означает, что можно зашифровать файл с помощью prompt , а затем использовать файл пароля для хранения того же пароля, который используется с этим prompt методом. Верно и обратное: вы можете зашифровать содержимое с помощью файла паролей, а затем использовать этот prompt метод, предоставляя тот же пароль по запросу Ansible.

      Для большей гибкости и безопасности вместо того, чтобы хранить пароль хранилища в обычном текстовом файле, вы можете использовать скрипт Python для получения пароля из других источников. Официальный репозиторий Ansible содержит несколько примеров сценариев хранилища, которые можно использовать для справки при создании пользовательского сценария, соответствующего конкретным потребностям вашего проекта.

      Запуск Playbook с данными, зашифрованными через Ansible Vault

      Всякий раз когда вы запускаете playbook, который использует данные, ранее зашифрованные через ansible-vault , вам нужно будет предоставить пароль хранилища для вашей команды playbook.

      Если вы использовали параметры по умолчанию и prompt источник пароля при шифровании данных, используемых в этом сборнике воспроизведения, вы можете использовать этот параметр --ask-vault-pass , чтобы сделать Ansible запрос пароля:

      Если вы использовали файл пароля вместо запроса пароля, то вам следует использовать эту опцию --vault-password-file :

      Если вы используете данные, зашифрованные под идентификатором хранилища, вам нужно будет предоставить тот же идентификатор хранилища и источник пароля, который вы использовали при первом шифровании данных:

      Если вы используете файл паролей с вашим идентификатором хранилища, вы должны указать метку, а затем полный путь к файлу паролей в качестве источника паролей:

      Если ваша игра использует несколько хранилищ, вы должны указать --vault-id параметр для каждого из них, не в определенном порядке:

      Отладка

      Если вы столкнулись с ошибками при выполнении команд Ansible и PlayBook, это хорошая идея, чтобы увеличить детализацию вывода, чтобы получить больше информации о проблеме. Вы можете сделать это, включив -v опцию в команду:

      Если вам нужно больше деталей, вы можете использовать -vvv , и это увеличит многословность вывода. Если вы не можете подключиться к удаленным узлам через Ansible, используйте -vvvv для получения информации об отладке соединения:

      Вывод

      В этом руководстве рассматриваются некоторые наиболее распространенные команды Ansible, которые можно использовать при подготовке серверов, например, как выполнять удаленные команды на узлах и как запускать PlayBook с использованием различных пользовательских настроек.

      Существуют и другие варианты команд и флаги, которые могут оказаться полезными для вашего рабочего процесса Ansible. Чтобы получить обзор всех доступных опций, можно воспользоваться командой help:

      Oct 26, 2015 18:53 · 541 words · 3 minute read ansible

      В предыдущей статье мы успешно установили и проверили работоспособность системы управления конфигурациями Ansible , а так же написали и выполнили первый набор инструкций (playbook). Давайте разберемся с результатами его выполнения!

      GATHERING FACTS — это первая задача, которая по умолчанию присутствует в любом наборе инструкций. Как видим из названия задачи, ее цель — сбор метаданных об удаленных хостах в форме переменных (например ip-адреса, имени хоста, установленной ОС). Полученные данные могут быть использованы в следующих задачах, описанных в playbook.

      Посмотреть переменные и их значения можно командой:

      Дальше в выводе следуют задачи, описанные в секции task: набора инструкций и результаты их выполнения:

      • TASK: [Install package nginx] — установка web-сервера nginx ;
      • TASK: [Starting service nginx] — запуск web-сервера nginx .

      Первая задача выполнена с изменениями, о чем свидетельствует состояние changed — все верно, раньше web-сервера nginx в системе не было, теперь он установлен.

      Вторая задача выполнена без изменений, так как web-сервер nginx автоматически запускается после установки.

      Для сравнения результатов вывода, запустим данный набор инструкций еще раз:

      Видим, что результаты выполнения задачи Install package nginx отличаются от предыдущего запуска playbook.

      Последняя секция в выводе результатов выполнения набора инструкций — PLAY RECAP . Здесь присутствуют четыре параметра:

      • ok — количество выполняемых задач (включая задачу GATHERING FACTS );
      • changed — количество измененных состояний на удаленном хосте;
      • unreachable — количество хостов, которые были недоступны по время выполнения набора инструкций;
      • failed — количество невыполненных задач на удаленном хосте. Подробности выполнения набора инструкций (playbook) можно увидеть с помощью вывода отладочной информации одного из трех доступных уровней ( -v , -vv и -vvv соответственно).

      Также для отладки часто выводят переменные, полученные с удаленных хостов при выполнении задачи GATHERING FACTS , для этого достаточно в playbook добавить такую задачу:

      Результатом выполнения такого набора инструкций будет:

      Запустить только конкретную задачу из playbook можно командой:

      Весьма полезной является возможность вызывать набор инструкций из другого набора инструкций. Хороший пример — обновление установленных пакетов в ОС. Для этого создадим playbook update_os.yml со следующим содержанием:

      Этот playbook можно включить как задачу в набор инструкций install_nginx.yml , который мы создавали в предыдущей статье:

      И теперь, перед установкой web-сервера nginx на удаленных хостах будут обновлены установленные пакеты.

      В следующей статье рассмотрим использование условий и переменных в наборах инструкций.

      Инструкция представляет из себя шпаргалку по работе с Ansible. У автора не стоит задачи подробного пояснения всех операций — только описание задачи и пример того, как ее можно решить с помощью ansible. Для более подробного описания я постараюсь указать ссылки на официальную документацию. Также в данную шпаргалку не войдут все возможные действия, которые можно выполнить с помощью данной системы — только популярные и те, с которыми приходилось сталкиваться самому автору. По мере возможности, их список будет пополняться.

      Для удобства, мы попробуем разбить примеры на операции, которые логически можно объединить в одну группу.

      Получение информации

      Сюда войдут примеры, которые позволят собирать информацию, выводить ее на экран, помогать в отладке и всякое такое.

      1. Показать информацию об удаленной системе, на которой запускается ansible.

      Выполняется с помощью модуля debug, который должен показать содержимое ansible_facts:

      - name: Print all available facts
      ansible.builtin.debug:
      var: ansible_facts

      * ansible_facts содержит массив данных с информацией о системе. Однако, функция сборки информации может быть отключена (так как на ее работу тратится, относительно, много времени) в настройках плейбука с помощью опции gather_facts: false — в этом случае, значение нужно изменить на true.

      Также мы можем обратиться к конкретному элементу массива ansible_facts, получив информацию о конкретной настройке или опции:

      * например, имя компьютера.

      2. Отображение на экран переменной.

      Выше мы уже использовали debug для отображения переменной — принцип тот же:

      * при выполнении задачи на экране мы увидим значение переменной variable. Обратите внимание, что запись ansible.builtin.debug и debug — это одно и то же, то есть, ansible.builtin можно не писать.

      3. Сохранение результата в переменную.

      Выполняется с помощью register:

      - name: Run a shell command and register its output as a variable
      shell: command
      register: command_result

      * в данном примере мы запишем в переменную command_result все то, что мы получили с помощью команды command.

      Вывести на экран содержимое можно с помощью debug:

      - name: Show Value of Variable
      debug:
      var: command_result.stdout

      * обратите внимание, что мы выводим не все содержимое, а только stdout, то есть то, что должна была вывести в консоль команда.

      4. Получить список сервисов.

      Для этого существует service_facts:

      - name: Populate service facts
      ansible.builtin.service_facts:

      - name: Print all available facts
      ansible.builtin.debug:
      var: ansible_facts.services

      * цель достигается двумя задачами. В первой мы собираем информацию о сервисах с помощью service_facts, второй — выводим на экран содержимое.

      Проверки и условия

      В данную группу войдут действия, которые помогут нам ограничить выполнение задач.

      1. Проверка на пустую папку.

      Задачи сводится к двум операциям:

      • получении списка файлов в целевом каталоге (например, с помощью команды ls) и регистрации полученного значения в переменную с помощью register.
      • проверка содержимого переменной, которую мы получили на шаге 1 с помощью when.

      Пример будет таким:

      - name: Register Contents of PGDATA Folder
      shell: ls /var/lib/postgresql/11/main
      register: pg_contents

      - name: Init PostgreSQL DB
      shell: /opt/pgpro/std-11/bin/pg-setup initdb
      environment:
      PGDATA: "/var/lib/postgresql/11/main"
      when: pg_contents["stdout_lines"] | length == 0

      2. Проверить, определена ли переменная.

      Для этого используется опция is defined (определена) или is not defined (не определена):

      when: pgpro is defined

      when: pgpro is not defined

      * в данном примере мы проверим наличие переменной pgpro. На практике такая проверка имеет значение, так как если мы попробуем выполнить действия с несуществующей переменной, Ansible нам вернет ошибку.

      В официальной документации про это сказано в статье о when (ссылка выше).

      3. Выполнение команды, если сервис в рабочем состоянии.

      Нам необходимо получить информацию о службах с помощью service_facts, после чего можно уже делать проверку с помощью when:

      - name: Populate service facts
      ansible.builtin.service_facts:

      - name: Stop Service If Running One
      shell: systemctl stop apache2
      when: ansible_facts.services["apache2.service"] is defined and ansible_facts.services["apache2.service"].state == "running"

      * в данном примере мы проверим, есть ли служба apache2 и запущена ли она. Если это так, то мы ее останавливаем.

      Подробнее о service_facts можно прочитать в документации (ссылка выше в разделе 4. Получить список сервисов).

      Установки пакетов, модулей и расширений

      В данном разделе мы коснемся всего, что приводит к установке чего бы то ни было. А именно:

      • Установки пакетов в систему.
      • Загрузки исходников.
      • Установке дополнительных модулей.
      • Распаковке архивов.

      Рассмотрим это подробнее.

      1. Установка модуля в nodejs.

      Установка модулей в nodejs выполняется с помощью npm. Для него в ansible есть отдельная функция:

      - name: Install nodejs modules.
      npm:
      name: newman
      global: yes

      * в данном примере будет выполнена установка newman, которая будет доступна всем проектам (опция global).

      2. Загрузка из GIT.

      Выполняется с помощью модуля git:

      * в данном примере мы сделаем клон репозитория в каталог /tmp/docker-compose.

      3. Распаковка архива.

      Выполняется с помощью unarchive:

      * в данном примере мы распакуем исходник для nginx в каталог /tmp. Обратите внимание на две вещи:

      • Мы используем переменную nginx_ver. Данная переменная должна быть определена при запуске плейбука, или в инвентарном файле, или в var, или в default.
      • Опция creates позволит не выполнять операцию, если существует файл /tmp/nginx->.tar.gz.

      Настройка системы

      В данном разделе мы рассмотрим процессы, которые больше подходят для категории настройки системы.

      1. Добавить задание в cron.

      Выполняется с помощью модуля cron:

      * в данном примере мы создадим задание для запуска команды /scripts/command.sh каждый день, каждые 6 часов.

      2. Добавить публичный ключ хоста в known_hosts.

      Делается с помощью known_hosts. Пример из официальной документации:

      3. Создание новых SSH-ключей для сервера.

      Создание ключей реализуется с помощью модуля openssh_keypair:

      * в данном примере мы создадим 4 ключа разных типов: dsa, ecdsa, ed25519, rsa. Так как у каждого из них свои требования к размеру, перечень представлен в виде двумерного массива. Ключи будут созданы в каталоге /etc/ssh/.

      4. Создание системной учетной записи.

      Для этого есть модуль user. У него много опций, но для создания системной учетной записи нам достаточно:

      - name: Create User Consul
      user:
      name: consul
      system: yes
      comment: "Consul Agent"

      * в данном примере будет создана учетная запись consul.

      5. Работа с systemd.

      Для данной настройки есть одноименный модуль systemd. Рассмотрим варианты его использования.

      а) перечитать конфигурацию (необходимо делать каждый раз, когда мы меняем настройки юнита):

      - name: systemd reload
      systemd:
      daemon_reload: yes

      б) разрешить сервис (автозапуск):

      - name: mysql enable
      systemd:
      name: mysql
      enabled: yes

      * для сервиса mysql.

      в) перезапустить сервис:

      - name: mysql reload
      systemd:
      name: mysql
      state: restarted

      * для сервиса mysql.

      6. Настройка брандмауэра.

      Выполняется разными модулями в зависимости от используемой системы управления netfilter:

      Рассмотрим небольшие примеры.

      - name: Block specific IP
      iptables:
      chain: INPUT
      source: 8.8.8.8
      jump: DROP

      Добавить 80 порт:

      Добавить порты с циклом:

      Работа с папками и файлами

      Рассмотрим задачи, которые помогут нам создавать, копировать и работать с файлами.

      1. Создание каталогов и файлов.

      Создание файлов и каталогов выполняется с помощью модуля file.

      а) для каталога в качестве state указываем directory:

      б) для создания файла указываем убираем опцию state (или даем ей значение file):

      - name: Create File
      file:
      path: "/var/www/site1/index.php"
      owner: www-data
      group: www-data
      mode: 0644

      * в данном примере мы созданим файл index.php в каталоге /var/www/site1.

      2. Копирование файлов из каталога.

      Для копирования данных мы используем модуль copy:

      - name: Copy Cert File If Different
      copy:
      src: ">"
      dest: /etc/ssl/dmosk
      remote_src: no
      mode: 0644
      owner: root
      group: root
      with_fileglob:
      - files/*

      * в данном примере мы прочитаем все содержимое каталога files на компьютере с ansible, и скопируем его в каталог /etc/ssl/dmosk на целевом компьютере.

      3. Используем шаблон.

      Копирование из шаблона отличается от копирования из файла тем, что в шаблоне могут использоваться переменные, которые будет заменяться их значениями в момент копирования. Для самого процесса копирования из шаблона используется модуль template:

      - name: Create Config for Consul Agent
      template:
      src: templates/consul/config.json.j2
      dest: /etc/consul.d/config.json

      * в данном примере мы возьмом шаблон templates/consul/config.json.j2 на компьютере ansible и разместим его в по пути /etc/consul.d/config.json на целевом компьютере.

      4. Удалить последние 30 файлов.

      Задача решается в два этапа:

      • ищем содержимое целевого каталога.
      • сотритуем список найденных по времени изменения файлов и удаляем все, что идут после определенного числа объектов.

      Поиск выполняем с помощью модуля find, удаление — file:

      - name: "Get list of backup files"
      find:
      paths: "/backup"
      file_type: file
      register: founds

      * в данном примере мы ищем файлы в каталоге /backup, после чего сортируем найденное и удаляем по списку все файлы, которые идут после 30-го.

      Для этого используется модуль uri. Простой пример:

      * в данном примере мы скачаем файл с ресурса, где требуется аутентификация по токену, который передается в заголовке. Заголовки мы передаем с помощью параметра headers. Также мы задаем права на загруженный файл и делаем в качестве владельца пользователя и группу dmosk.

      Виртуализация VMware

      Работа с виртуальными машинами на платформе VMware выполняется с помощью модуля vmware_guest.

      Мы рассмотрим несколько примеров.

      1. Базовое подключение.

      Для выполнения действий над виртуальными машинами мы должны подключиться к хосту VMware. Для этого используем данные строки:

      * параметр validate_certs, выставленный в no, позволит избежать ошибки, если у нас на хосте используется самоподписанный сертификат (как правило, так и есть).

      2. Переименовать виртуальную машину.

      Для выполнения действия нам нужно знать идентификатор виртуальной машины:

      * где uuid — идентификатор виртуальной машины; name — новое имя виртуальной машины.

      3. Конвертировать виртуальную машину в шаблон.

      Для этого нужно просто задать признак is_template:

      Разное

      В данном разделе будет рассказано о дополнительных опциях, которые позволяют менять поведение выполнения задач, добавляет функциональности или все то, для чего не найдена отдельная подходящая категория.

      1. Шифрование строки.

      С помощью ansible-vault мы можем шифровать файлы и папки. Это позволит нам хранить секреты не в открытом виде. Данные расшифровываются в момент выполнения задач.

      Данной командой мы получаем шифрованную строку:

      Система запросит ввести дважды пароль и предложит ввести строку, которую нужно зашифровать. После мы должны нажать 2 раза Ctrl + D — мы получим строку, которая начинается с !Vault и различные символы.

      Для того, чтобы в момент выполнения задачи ansible расшифровал данные, при запуске плейбука мы должны указать ключ --ask-vault-pass:

      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. Завершить выполнение плейбука после определенной задачи.

      С помощью данной конструкции:

      5. Зависимые роли.

      С помощью файла meta/main.yml в роли мы можем определить пред-роль, от которой зависит выполнение текущей роли. Для этого настраивается опция dependencies:

      dependencies:
      - role: pred

      6. Вставка роли и ее задач.

      Позволяет в процессе выполнения задачи подключить роль. Делается при помощи include_role:

      - name: "Include Other Role"
      include_role:
      name: other_role

      А это пример, как подключить роль и сделать так, чтобы все ее задачи выполнились на определенном хосте:

      7. Замены в строке.

      Замены выполняются с помощью модуля replace:

      * в данном примере мы добавляем комментарий к строке server.address=127.0.0.1.

      8. Повторы при выполнении задачи.

      Мы можем управлять цикличностью выполнения задач с помощью 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 секунд.

      Favorite

      Добавить в избранное

      Главное меню » Linux » Ansible. Переменные, факты и регистры Ansible

      (2 оценок, среднее: 5,00 из 5)

      Краткое руководство: Как установить и настроить ansible в Linux для автоматизации

      В ваших управляемых системах всегда будет много различий. По этой причине вам необходимо научиться работать с переменными Ansible.

      В этой статье вы узнаете, как определять переменные Ansible и ссылаться на них. Вы также узнаете, как использовать факты Ansible для получения информации о ваших управляемых узлах.

      Кроме того, вы также узнаете, как использовать регистры для записи вывода задачи.

      Часть 1: Работа с переменными в Ansible

      Начнем сначала с переменных. Имейте в виду, что все это записано в вашем YML-файле.

      Определение и ссылка на переменные

      Вы можете использовать ключевое слово vars для определения переменных непосредственно внутри playbook.

      Например, вы можете определить переменную fav_color и установить ее значение на желтый следующим образом:

      Как теперь использовать (ссылаться) на переменную fav_color? Ansible использует систему шаблонов Jinja2 для работы с переменными.

      Чтобы получить значение переменной fav_color ; вам нужно окружить его парой фигурных скобок следующим образом:

      Обратите внимание, что если ваша переменная является первым элементом (или единственным элементом) в строке, то использование кавычек обязательно, как показано ниже:

      Теперь давайте напишем книгу с именем variables-playbook.yml, которая объединит все это вместе:

      Мы использовали модуль отладки вместе с параметром модуля msg, чтобы распечатать значение переменной fav_color.

      Теперь запустите playbook, и вы увидите, что ваш любимый цвет отображается следующим образом:

      Создание списков и словарей

      Вы также можете использовать списки и словари для определения многозначных переменных. Например, вы можете определить список с именем port_nums и установить его значение следующим образом:

      Вы также могли использовать следующий способ определения port_nums, что эквивалентно:

      Вы можете распечатать все значения в port_nums следующим образом:

      Вы также можете получить доступ к определенному элементу списка:

      Обратите внимание, что вы используете индекс (позицию) для доступа к элементам списка.

      Вы также можете определить словарь с именем users следующим образом:

      Есть два разных способа доступа к элементам словаря:

      Обратите внимание, что вы используете ключ для доступа к элементам словаря.

      Теперь вы можете запустить playbook, чтобы отобразить второй элемент в port_nums и показать uid bob:

      Включая внешние переменные

      Точно так же, как вы можете импортировать (или включать) задачи в playbook. То же самое можно сделать и с переменными. То есть в playbook вы можете включать переменные, определенные во внешнем файле.

      Чтобы продемонстрировать, давайте создадим файл с именем myvars.yml , который содержит наш port_nums список и пользователей словаря:

      Теперь вы можете использовать ключевое слово vars_files в вашем файле variables-playbook.yml, чтобы включить переменные в myvars.yml следующим образом:

      Имейте в виду, что vars_files выполняет предварительную обработку и загружает переменные прямо в начале playbook. Вы также можете использовать модуль include_vars для динамической загрузки ваших переменных в playbook:

      Получение пользовательского ввода

      Вы можете использовать ключевое слово vars_prompt, чтобы предложить пользователю установить значение переменной во время выполнения.

      Читать Как создать высокоэффективную рекламу в сети?

      Обратите внимание, что я использовал private: no, чтобы вы могли видеть свой ввод на экране по мере его ввода; по умолчанию он скрыт.

      Теперь запустите playbook и введите свое имя:

      Установка переменных хоста и группы

      Вы можете установить переменные, специфичные для ваших управляемых хостов. Поступая так, вы можете создавать гораздо более эффективные playbooks, поскольку вам не нужно писать повторяющиеся задачи для разных узлов или групп.

      Для демонстрации отредактируйте файл инвентаризации так, чтобы управляемые узлы были сгруппированы в следующие три группы:

      Теперь создадим переменные, специфичные для ваших управляемых узлов; Во- первых, вам нужно создать каталог с именем host_vars. Затем внутри host_vars вы можете создать файлы переменных с именами файлов, соответствующими именам хостов вашего узла:

      Теперь давайте создадим книгу с именем motd.yml, которая демонстрирует, как работают host_vars :

      Потрясающие! Точно так же вы можете создать каталог group_vars, а затем включить все связанные с группой переменные в имя файла, которое соответствует имени группы, как показано ниже:

      Мы позволили вам создать playbook, который работает на всех узлах; каждый узел установит пакет, заданный в соответствующей групповой переменной узла pkg.

      Понимание приоритета переменных

      Как вы уже видели; Переменные Ansible могут быть установлены на разных уровнях (или уровнях).

      Если одна и та же переменная установлена на разных уровнях; самый конкретный уровень получает приоритет. Например, переменная, установленная на уровне воспроизведения, имеет приоритет над той же переменной, установленной на уровне хоста ( host_vars ).

      Чтобы продемонстрировать это, давайте создадим книгу с именем variable-Priordence.yml, которая содержит следующий контент:

      Обратите внимание на то, что значение «CentOS» в командной строке fav_distro имеет приоритет над значением «Ubuntu» в fav_distro.

      Часть 2: Сбор и демонстрация фактов

      Вы можете получить или обнаружить переменные, которые содержат информацию о ваших управляемых хостах. Эти переменные называются фактами, и Ansible использует модуль настройки для сбора этих фактов. IP-адрес одного из ваших управляемых узлов является примером факта.

      Вы можете запустить следующую специальную команду, чтобы собрать и показать все факты о node1:

      Это только часть всех фактов, связанных с node1, которые вы увидите на своем терминале. Обратите внимание, как факты хранятся в словарях или списках, и все они принадлежат словарю ansible_facts.

      По умолчанию модуль настройки автоматически вызывается плейбуками для обнаружения фактов. Возможно, вы заметили, что обнаружение фактов происходит с самого начала, когда вы запускаете любой из ваших playbooks:

      Вы можете отключить сбор фактов, установив для параметра gather_facts логическое значение false прямо в заголовке воспроизведения следующим образом:

      Читать 5 причин, почему ремонт ноутбуков может быть сложнее и дороже

      Если вы снова запустите motd.yaml playbook; он пропустит сбор фактов:

      Таким же образом вы показываете значение переменной; вы также можете использовать, чтобы показать ценность факта. В следующем сборнике show-fact.yml показана ценность нескольких фактов на node1 :

      Теперь запустите playbook, чтобы отобразить значения фактов:

      Создание постоянных фактов

      Вы можете создать свои собственные пользовательские факты. Для этого вы можете использовать модуль set_fact для временного добавления фактов или каталог /etc/ansible/facts.d для добавления постоянных фактов на ваши управляемые узлы.

      Мы собираемся показать вам, как добавить постоянные факты к вашим управляемым узлам. Это трехэтапный процесс:

      1. Создайте файл фактов на вашем контрольном узле.
      2. Создайте каталог /etc/ansible/facts.d на управляемом узле (ах).
      3. Скопируйте файл фактов (шаг 1) с управляющего узла на ваш управляемый (ые) узел (ы).

      Итак, сначала давайте создадим файл cool.fact на вашем управляющем узле, который включает некоторые интересные факты:

      Обратите внимание, что имя файла фактов должно иметь расширение.fact.

      На втором этапе вы собираетесь использовать файловый модуль для создания и каталог /etc/ansible/facts.d на управляемом узле (ах). И , наконец , на третьем этапе, вы собираетесь использовать копию модуль для копирования cool.fact файла из узла управления для управляемого узла (ов).

      В следующем сборнике custom-fact.yml сочетаются шаги 2 и 3:

      Теперь запустите playbook:

      В cool теперь постоянно часть NODE1 фактов; вы можете проверить с помощью следующей специальной команды:

      Теперь вы можете отобразить факт octupus в учебнике следующим образом:

      Часть 3: Захват вывода с помощью регистров в Ansible

      Некоторые задачи не отображают никаких результатов при запуске playbook. Например, выполнение команд на ваших управляемых узлах с использованием команд , оболочки или необработанных модулей не будет отображать никаких выходных данных при запуске playbook.

      Playbook запускается с выполнения команды uptime на хостах группы прокси (node1) и регистрирует выходные данные команды в переменной server_uptime.

      Затем вы используете модуль отладки вместе с параметром var module для проверки переменной server_uptime. Обратите внимание, что здесь не нужно заключать переменную в фигурные скобки.

      Запустите playbook, чтобы увидеть все это в действии:

      Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.

      Читайте также: