Skip to content

Latest commit

 

History

History
533 lines (403 loc) · 27.1 KB

README.md

File metadata and controls

533 lines (403 loc) · 27.1 KB

Ansible

Упражнения по Ansible

Name Topic Objective & Instructions Solution Comments
Моя первая задача Задачи Упражнение Решение
Задача обновления и модернизации Задачи Упражнение Решение
My First Playbook Playbooks Exercise Solution

Ansible Self Assessment

Опишите каждый из следующих компонентов Ansible, включая взаимосвязь между ними:
  • Task
  • Inventory
  • Module
  • Play
  • Playbook
  • Role

Task - обращение к определенному модулю Ansible

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

Inventory - Файл инвентаря определяет хосты и/или группы хостов, на которых выполняются задачи Ansible. Файл инвентаризации может быть в одном из многих форматов, в зависимости от того, какие плагины инвентаризации у вас установлены. Наиболее распространенными форматами являются INI и YAML.

Play - Одна или несколько задач, выполняемых на данном узле (узлах).

Playbook - Одна или несколько пьес. Каждая пьеса может быть выполнена на одном или разных хостах

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

Чем Ansible отличается от других инструментов автоматизации? (например, Chef, Puppet и т.д.)

Ansible - это:

  • Без агентов
  • Минимальные требования к запуску (Python и SSH) и простота в использовании
  • Режим по умолчанию - "push" (поддерживается также режим "pull").
  • Фокус на простоте и легкости в использовании
Правда или ложь? Ansible следует парадигме изменяемой инфраструктуры

Верно. При подходе с неизменяемой инфраструктурой вы будете заменять инфраструктуру, а не модифицировать ее.< br> Ansible скорее следует парадигме изменяемой инфраструктуры, которая позволяет изменять конфигурацию различных компонентов, но этот подход не идеален и имеет свои недостатки, такие как "дрейф конфигурации", когда различные компоненты могут достичь разного состояния по разным причинам.

Правда или ложь? Ansible использует декларативный стиль для описания ожидаемого конечного состояния

Ложь. В нем используется процедурный стиль.

Какую автоматизацию вы бы не стали делать с помощью Ansible и почему?

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

Как перечислить все модули и как посмотреть подробности о конкретном модуле?

  1. Онлайн-документы по Ansible
  2. ansible-doc -l для получения списка модулей и ansible-doc [имя_модуля] для получения подробной информации о конкретном модуле

Ansible - инвентаризация

Что такое файл инвентаризации и как его определить?

Файл инвентаризации определяет хосты и/или группы хостов, на которых выполняются задачи Ansible.

Пример файла инвентаризации:

192.168.1.2
192.168.1.3
192.168.1.4

[web_servers].
190.40.2.20
190.40.2.21
190.40.2.22

Что такое динамический инвентарный файл? Когда его можно использовать?

Файл динамической инвентаризации отслеживает хосты из одного или нескольких источников, таких как облачные провайдеры и системы CMDB.

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

Ansible - Переменные

Измените следующую задачу, чтобы вместо значения "zlib" использовалась переменная, а в случае, если переменная не определена, по умолчанию использовалась переменная "zlib".
- имя: Установить пакет
  пакет:
    имя: "zlib"
    состояние: настоящее

- имя: Установить пакет
  пакет:
    name: "{{ имя_пакета|default('zlib') }}".
    состояние: настоящее

Как сделать переменную "use_var" необязательной?
- имя: Установить пакет
  пакет:
    имя: "zlib"
    состояние: настоящее
    использовать: "{{ use_var }}"

С "default(omit)"

- имя: Установить пакет
  пакет:
    имя: "zlib"
    состояние: настоящее
    использование: "{{ use_var|default(omit) }}".

Каким будет результат следующей пьесы?
---
- имя: Печать информации о моем хосте
  хосты: localhost
  gather_facts: 'нет'
  задачи:
      - имя: Печать имени хоста
        отладка:
            msg: "Это я, {{ ansible_hostname }}".

Получив написанный код, всегда тщательно проверяйте его. Если ваш ответ: "Это не сработает", то вы правы. Мы используем факт (ansible_hostname), который является собранной информацией с хоста, на котором мы работаем. Но в данном случае мы отключили сбор фактов (gather_facts: no), поэтому переменная будет неопределена, что приведет к ошибке.

В этом случае будет использоваться значение '2017': `{{ lookup('env', 'BEST_YEAR') | default('2017', true) }}`?

когда переменная окружения 'BEST_YEAR' пуста или ложна.

Если значение некоторой переменной равно 1, вы хотите использовать значение "один", в противном случае - "два". Как бы вы это сделали?

{{ (certain_variable == 1) | ternary("one", "two") }}.

Значением некоторой переменной, которую вы используете, является строка "True". Вы бы хотели, чтобы это значение было булевым. Как бы вы привели его?

{{ some_string_var | bool }}.

Вы хотите запускать сборник пьес Ansible только на определенной младшей версии вашей ОС, как вам этого добиться?
Для чего используется директива "become" в Ansible?

Анзибль использует become, become_userи become_methodдирективы для достижения привилегий. Вы можете применить их ко всей пьесе или сборнику пьес, установить их во включенную сборник пьес или установить для конкретной задачи.

Что такое факты? Как увидеть все факты об определенном хозяине?
Каким будет результат выполнения следующего задания? Как это исправить?
- хосты: localhost
  задачи:
      - имя: Установить zlib
        пакет:
          имя: zlib
          состояние: настоящее

С какими передовыми практиками Ansible вы знакомы? Назовите хотя бы три
Объяснение схемы каталогов роли Ansible
Для чего используются "блоки" в Ansible?
Как вы обрабатываете ошибки в Ansible?
Вы хотите запускать определенную команду, если задание не выполняется. Как этого добиться?
Напишите playbook для установки 'zlib' и 'vim' на всех хостах, если файл '/tmp/mario' существует в системе.
---
- хозяева: все
  вары:
      mario_file: /tmp/mario
      список_пакетов:
          - 'zlib'
          - 'vim'
  задачи:
      - имя: Проверка наличия файла mario
        стат:
            путь: "{{ mario_file }}".
        регистр: mario_f

      - имя: Установить zlib и vim, если существует файл mario
        стать: "да"
        пакет:
            name: "{{ item }}"
            состояние: настоящее
        with_items: "{{ список_пакетов }}"
        когда: mario_f.stat.exists

Напишите одну задачу, которая проверяет, что все файлы в переменной files_list существуют на хосте
- имя: Убедитесь, что все файлы существуют
  утверждать:
    это:
      - item.stat.exists
  цикл: "{{ список_файлов }}"

Напишите playbook для развертывания файла '/tmp/system_info' на всех хостах, кроме группы контроллеров, со следующим содержимым
Я <HOSTNAME> и моя операционная система - <OS>

Замените < HOSTNAME> и < OS> фактическими данными для конкретного узла, на котором вы работаете

Книга воспроизведения для развертывания файла system_info

---
- имя: Развернуть файл /tmp/system_info
  хосты: все:!контроллеры
  задачи:
      - имя: Развернуть /tmp/system_info
        шаблон:
            src: system_info.j2
            dest: /tmp/system_info

Содержание шаблона system_info.j2

# {{ ansible_managed }}
Я {{ ansible_hostname }} и моя операционная система {{ ansible_distribution }}.

Переменная 'whoami' определена в следующих местах:
  • роль по умолчанию -> whoami: mario
  • дополнительные vars (переменные, которые вы передаете в Ansible CLI с помощью -e) -> whoami: toad
  • факты о хостах -> whoami: luigi
  • переменные инвентаря (неважно, какого типа) -> whoami: browser

В соответствии с приоритетом переменной, какая из них будет использоваться?


Правильный ответ - "жаба".

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

В контексте нашего вопроса, порядок будет следующим: дополнительные переменные (всегда переопределяют любую другую переменную) -> факты хоста -> переменные инвентаря -> роли по умолчанию (самые слабые).

Ниже приведен порядок приоритетов от наименьшего к наибольшему (последние перечисленные переменные выигрывают в приоритетности):

  1. значения командной строки (например, "-u user")
  2. роль по умолчанию [1]
  3. файл инвентаризации или группа скриптов vars [2]
  4. инвентаризация group_vars/all [3]
  5. playbook group_vars/all [3]
  6. инвентаризация group_vars/* [3]
  7. playbook group_vars/* [3]
  8. файл инвентаризации или скрипт host vars [2]
  9. инвентаризация host_vars/* [3]
  10. playbook host_vars/* [3]
  11. host facts / cached set_facts [4]
  12. игровые вары
  13. воспроизвести vars_prompt
  14. воспроизвести vars_files
  15. параметры роли (определяются в файле role/vars/main.yml)
  16. переменные блока (только для задач в блоке)
  17. переменные задачи (только для задачи)
  18. include_vars
  19. set_facts / registered vars
  20. параметры роли (и include_role)
  21. включать параметры
  22. дополнительные параметры (всегда имеют приоритет)

Полный список можно найти в PlayBook Variables . Также обратите внимание, что существует значительная разница между Ansible 1.x и 2.x.

< резюме> Для каждого из следующих утверждений определите, является ли оно истинным или ложным:
  • Модуль - это набор задач
  • Лучше использовать оболочку или команду вместо конкретного модуля
  • Факты хозяина переопределяют переменные игры
  • Роль может включать в себя следующее: vars, meta и обработчики.
  • Динамическая инвентаризация создается путем извлечения информации из внешних источников
  • Лучше всего использовать отступ в 2 пробела вместо 4.
  • 'notify' используется для запуска обработчиков
  • Этот "hosts: all:!controllers" означает 'запускать только на хостах группы контроллеров
Объясните разницу между вилками и серией и дросселем.

Serial - это как запуск плейбука для каждого хоста по очереди, ожидая завершения всего плейбука перед переходом к следующему хосту. forks=1 означает запуск первой задачи в пьесе на одном хосте перед запуском той же задачи на следующем хосте, так что первая задача будет запущена на каждом хосте, прежде чем будет затронута следующая задача. По умолчанию в ansible значение fork равно 5.

[по умолчанию]
вилы = 30
- хосты: веб-серверы
  серийный: 1
  задачи:
    - имя: ...

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

задачи:
- команда: /path/to/cpu_intensive_command
  дроссель: 1

Что такое ansible-pull? Чем он отличается от работы ansible-playbook?
Что такое Ansible Vault?
< резюме> Продемонстрируйте каждое из следующих действий с помощью Ansible:
  • Условия
  • Петли

Что такое фильтры? Есть ли у вас опыт написания фильтров?
Напишите фильтр для капитализации строки
def cap(self, string):
    return string.capitalize()

Вы хотите запускать задачу только в том случае, если предыдущая задача что-то изменила. Как этого добиться?
Что такое плагины обратного вызова? Чего можно достичь с помощью плагинов обратного вызова?
Что такое Ansible Collections?
В чем разница между `include_task` и `import_task`?
< резюме> Файл '/tmp/exercise' включает следующее содержимое
Гоку = 9001
Вегета = 5200
Транки = 6000
Готенкс = 32

С одним заданием переключите содержание на:

Гоку = 9001
Вегета = 250
Магистрали = 40
Готенкс = 32

- название: Изменить уровни саянов
  lineinfile:
    dest: /tmp/exercise
    regexp: "{{ item.regexp }}".
    строка: "{{ item.line }}"
  с_предметами:
    - { regexp: '^Vegeta', line: 'Vegeta = 250' }
    - { regexp: '^Trunks', line: 'Trunks = 40' }
    ...

Ansible - исполнение и стратегия

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

Ложь. Ansible выполнит одну задачу на всех хостах перед переходом к следующей задаче в пьесе. На сегодняшний день по умолчанию используется 5 форков.< br>. В Ansible это поведение описывается как "стратегия", и его можно настраивать.

Что такое "стратегия" в Ansible? Что такое стратегия по умолчанию?

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

Какие стратегии Ansible вам знакомы?
  • Линейная: стратегия по умолчанию в Ansible. Выполните каждое задание на всех хостах, прежде чем продолжить.
  • Бесплатно: Для каждого ведущего выполните все задания до конца пьесы как можно быстрее
  • Отладка: Выполнение заданий в интерактивном режиме
Для чего используется ключевое слово < code>serial?

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

Например:

- название: Некоторая игра
  хосты: базы данных
  серийный: 4

Если у вашей группы 8 хостов. Он запустит всю пьесу на 4 хостах, а затем ту же пьесу на других 4 хостах.

Тестирование Ansible

Как вы тестируете свои проекты на базе Ansible?
Что такое молекула? Как она работает?
Вы запускаете тесты Ansible и получаете сообщение "idempotence test failed". Что это значит? Почему idempotence важна?

Ansible - Отладка

Как узнать тип данных определенной переменной в одном из плейбуков?

"{{ some_var | type_debug }}".

Ansible - Коллекции

Что такое коллекции в Ansible?