Основы Ansible Playbook

AnsibleAnsibleBeginner
Практиковаться сейчас

💡 Этот учебник переведен с английского с помощью ИИ. Чтобы просмотреть оригинал, вы можете перейти на английский оригинал

Введение

В этом лабораторном занятии вы узнаете основы Ansible playbooks (плейбуков Ansible). Ansible playbooks - это файлы в формате YAML, которые описывают набор задач, которые должны быть выполнены на удаленных хостах. Они являются основными строительными блоками для сложных рабочих процессов автоматизации ИТ-инфраструктуры. Вы создадите свой первый playbook, поймете его структуру и узнаете, как его выполнить. К концу этого лабораторного занятия у вас будет практический опыт написания и запуска Ansible playbooks, который послужит основой для более продвинутого использования Ansible.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL linux(("Linux")) -.-> linux/FileandDirectoryManagementGroup(["File and Directory Management"]) ansible(("Ansible")) -.-> ansible/InventoryManagementGroup(["Inventory Management"]) ansible(("Ansible")) -.-> ansible/PlaybookEssentialsGroup(["Playbook Essentials"]) linux(("Linux")) -.-> linux/BasicFileOperationsGroup(["Basic File Operations"]) linux/BasicFileOperationsGroup -.-> linux/touch("File Creating/Updating") linux/FileandDirectoryManagementGroup -.-> linux/mkdir("Directory Creating") ansible/InventoryManagementGroup -.-> ansible/host_variables("Set Host Variables") ansible/PlaybookEssentialsGroup -.-> ansible/playbook("Execute Playbook") subgraph Lab Skills linux/touch -.-> lab-390426{{"Основы Ansible Playbook"}} linux/mkdir -.-> lab-390426{{"Основы Ansible Playbook"}} ansible/host_variables -.-> lab-390426{{"Основы Ansible Playbook"}} ansible/playbook -.-> lab-390426{{"Основы Ansible Playbook"}} end

Создание своего первого playbook

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

Сначала создадим новый файл с именем first_playbook.yml в директории /home/labex/project:

nano /home/labex/project/first_playbook.yml

Эта команда открывает текстовый редактор nano. Если вы не знакомы с nano, не беспокойтесь - это простой текстовый редактор. Вы можете вводить текст прямо в него.

Теперь добавьте следующее содержимое в файл:

---
- name: My First Playbook
  hosts: localhost
  connection: local
  tasks:
    - name: Create a directory
      file:
        path: /home/labex/project/test_directory
        state: directory
        mode: "0755"

    - name: Create a file
      copy:
        content: "Hello from Ansible!"
        dest: /home/labex/project/test_directory/hello.txt

Разберем этот playbook, чтобы понять каждую его часть:

  • Символы --- вверху файла отмечают начало файла в формате YAML. YAML - это формат, используемый для Ansible playbooks.
  • name: My First Playbook - это описательное имя для этого play (этапа выполнения). Это помогает вам понять, что делает этот playbook.
  • hosts: localhost указывает, что этот playbook будет выполняться на локальной машине. В реальной ситуации вы можете указать здесь удаленные хосты.
  • connection: local сообщает Ansible выполнить playbook локально, а не использовать SSH. Это полезно для тестирования и для задач, которые должны выполняться непосредственно на узле управления Ansible.
  • tasks: за которым следует список задач, которые должны быть выполнены. Каждая задача представляет собой действие, которое вы хотите, чтобы Ansible выполнил.
  • Каждая задача имеет name для описания. Это помогает вам понять, что делает каждая задача и упрощает устранение неполадок.
  • В задачах используются модули Ansible:
    • Модуль file используется для создания директории.
    • Модуль copy используется для создания файла с определенным содержимым.

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

Сохраните и выйдите из редактора. В nano вы можете сделать это, нажав Ctrl+X, затем Y, а затем Enter.

Теперь запустим этот playbook. В терминале введите:

ansible-playbook /home/labex/project/first_playbook.yml

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

PLAY [My First Playbook] ******************************************************

TASK [Gathering Facts] *********************************************************
ok: [localhost]

TASK [Create a directory] ******************************************************
changed: [localhost]

TASK [Create a file] ***********************************************************
changed: [localhost]

PLAY RECAP *********************************************************************
localhost                  : ok=3    changed=2    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

Этот вывод показывает, что Ansible успешно выполнил наши задачи. Статус "changed" указывает, что Ansible внес изменения в систему (создал директорию и файл).

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

ls -l /home/labex/project/test_directory
cat /home/labex/project/test_directory/hello.txt

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

Понимание структуры playbook

Теперь, когда вы создали и запустили свой первый playbook (плейбук), давайте углубимся в его структуру. Понимание структуры playbook является важным для написания более сложных автоматизационных задач в будущем.

Ansible playbooks состоят из одного или нескольких plays (этапов выполнения), и каждый play состоит из нескольких ключевых элементов. Отредактируем наш файл first_playbook.yml, чтобы добавить комментарии, объясняющие каждую часть:

nano /home/labex/project/first_playbook.yml

Обновите содержимое следующим образом:

---
## Playbook starts with three dashes
- name: My First Playbook ## Name of the play
  hosts: localhost ## Target host(s) for this play
  connection: local ## Connection type (local in this case)

  tasks: ## List of tasks to be executed
    - name: Create a directory ## Name of the first task
      file: ## The 'file' module is used for this task
        path: /home/labex/project/test_directory ## Path of the directory to create
        state: directory ## Desired state (create the directory)
        mode: "0755" ## Permissions for the directory

    - name: Create a file ## Name of the second task
      copy: ## The 'copy' module is used for this task
        content: "Hello from Ansible!" ## Content to be written to the file
        dest: /home/labex/project/test_directory/hello.txt ## Destination path for the file

Сохраните и выйдите из редактора.

Эта версия playbook с комментариями помогает понять структуру и назначение каждого элемента. Вот несколько важных моментов, которые стоит запомнить:

  1. Playbook может содержать несколько plays, каждый из которых начинается с дефиса (-). В данном случае у нас только один play.
  2. Каждый play нацеляется на определенные хосты и определяет список задач. Поле hosts указывает, на каких машинах должен выполняться play.
  3. Задачи используют модули Ansible (например, file и copy) для выполнения действий. Ansible имеет множество встроенных модулей для различных целей.
  4. Каждая задача должна иметь описательное имя. Это помогает понять, что делает задача, и упрощает устранение неполадок.
  5. Отступы важны в файлах YAML. Убедитесь, что ваш playbook имеет правильные отступы. Неправильные отступы могут вызвать ошибки при запуске playbook.

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

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

Понимание этих базовых структур поможет вам в будущем создавать более сложные playbooks.

Добавление переменных в playbooks

Переменные делают ваши playbooks (плейбуки) более гибкими и повторно используемыми. Они позволяют вам писать playbooks, которые могут адаптироваться к различным сценариям без необходимости изменения самого playbook. Изменим наш playbook, чтобы использовать переменные.

Отредактируйте файл first_playbook.yml:

nano /home/labex/project/first_playbook.yml

Обновите содержимое следующим образом:

---
- name: My First Playbook
  hosts: localhost
  connection: local
  vars:
    dir_path: /home/labex/project/test_directory
    file_content: "Hello from Ansible! The time is {{ ansible_date_time.iso8601 }}"

  tasks:
    - name: Create a directory
      file:
        path: "{{ dir_path }}"
        state: directory
        mode: "0755"

    - name: Create a file
      copy:
        content: "{{ file_content }}"
        dest: "{{ dir_path }}/hello.txt"

    - name: Display file content
      debug:
        msg: "The content of the file is: {{ file_content }}"

Разберем изменения и новые элементы в этом обновленном playbook:

  1. Мы добавили раздел vars для определения переменных. Именно здесь вы можете задать значения, которые будут использоваться несколько раз в вашем playbook.

  2. dir_path и file_content теперь являются переменными. Мы можем легко изменить эти значения в одном месте, чтобы повлиять на несколько задач.

  3. Мы используем синтаксис {{ }} для обращения к переменным. Это сообщает Ansible заменить переменную ее значением.

  4. Мы использовали встроенную переменную Ansible ansible_date_time.iso8601 для включения текущей временной метки. Ansible предоставляет множество таких переменных, которые вы можете использовать в своих playbooks.

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

Использование переменных делает этот playbook более гибким. Например, если вы хотите изменить путь к директории, вам нужно будет изменить его только в разделе vars, а не в каждой задаче.

Сохраните и выйдите из редактора.

Теперь запустим обновленный playbook:

ansible-playbook /home/labex/project/first_playbook.yml

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

PLAY [My First Playbook] ******************************************************

TASK [Gathering Facts] *********************************************************
ok: [localhost]

TASK [Create a directory] ******************************************************
ok: [localhost]

TASK [Create a file] ***********************************************************
changed: [localhost]

TASK [Display file content] ****************************************************
ok: [localhost] => {
    "msg": "The content of the file is: Hello from Ansible! The time is 2023-06-09T12:34:56Z"
}

PLAY RECAP *********************************************************************
localhost                  : ok=4    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

Фактическая временная метка будет отличаться при каждом запуске playbook.

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

Итоги

В этом лабораторном занятии вы узнали основы Ansible playbooks (плейбуков Ansible). Вы перешли от создания своего первого простого playbook к пониманию его структуры и использованию переменных для того, чтобы сделать свои playbooks более динамическими и повторно используемыми.

Основные выводы из этого лабораторного занятия:

  1. Ansible playbooks пишутся в формате YAML и описывают набор задач, которые должны быть выполнены на указанных хостах.
  2. Playbook состоит из одного или нескольких plays (этапов выполнения), каждый из которых содержит список задач.
  3. Задачи используют модули Ansible для выполнения действий на целевых хостах. В этом лабораторном занятии мы использовали модули file, copy и debug.
  4. Переменные можно определять и использовать в playbooks для повышения гибкости и повторного использования. Они обозначаются с помощью синтаксиса {{ }}.
  5. Модуль debug полезен для отображения информации во время выполнения playbook, что может помочь при устранении неполадок.
  6. Правильные отступы важны в файлах YAML и Ansible playbooks.

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

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

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