Мы уже ознакомились с тем, что нужно знать перед началом работы с Ansible.Теперь давайте разберем самые Часто Задаваемые Вопросы, или сокращенно FAQ. Они помогут вам глубже понять тонкости и принцип работы с Ansible. На ранних этапах можете использовать эту статью как некую шпаргалку.
Содержание
Что такое Ansible?
Это ПО с открытым исходным кодом, написанное на Python.
Для чего он используется?
Для автоматизированного выполнения задач поставки программного обеспечения, управления конфигурацией и развертывания приложений.
Есть ли Ansible на Windows?
Нет, но системы с поддержкой WSL (Windows Subsystem for Linux) позволяют запускать дистрибутивы Linux без накладных расходов на виртуальные машины.
Ansible сложный?
Нет, это простой и эффективный инструмент.
Такие сложные задачи как подготовка сервера, управление конфигурацией программных и аппаратных пакетов, развертывание приложений на разных системах, выполняются посредством написания сценариев на человекочитаемом языке YAML. А сами сценарии сродни файлам README.
Какие у него преимущества?
Безагентная модель работы. Не требуется предустановка софта на удаленные серверы. Достаточно лишь иметь SSH соединение и python 2.6+.
Встроенные модули. Позволяют решать широкий спектр задач, так же есть возможность написать свой модуль https://habr.com/ru/company/southbridge/blog/646147/
Идемпотентность. Свойство, которое при многократном выполнении приводит к тому же результату, что и однократное выполнение.
Распространенность (популярность). Продукт компании RedHat. Поддерживается большим числом вендоров.
Ansible – язык программирования? Или каков синтаксис сценариев?
Все сценарии Ansible пишутся на YAML - это формат файла, напоминающий JSON, но намного проще для восприятия человеком.
Строки можно не заключать в кавычки, даже если они содержат пробелы, но рекомендуется в случае использования двойных фигурных скобок, которые используются для подстановки значений переменных.
Пример: "{{ somevar }}"Булевы выражения. Ansible достаточно гибкая система в отношении значений «истина» и «ложь».
Истина в YAML (true, Тгuе, TRUE, yes, Yes, YES, on, On, ON y, Y)
Ложь в YAML (false, False, FALSE, no, No, NO, off, Off, OFF, n, N)
Списки в YAML похожи на массивы в JSON и Ruby или списки в Python. И оформляются с помощью дефиса.
- ntp
- wget
- curl
Табуляция или пробелы? Спецификация YAML обязует использовать только пробелы.
Как работает Ansible?
Он устанавливает параллельные SSH-соединения и выполняет задачи по списку на всех хостах
А где этот список хостов?
В так называемом инвентаре, файле hosts
Пример:
node1 ansible_host=172.16.10.11
node2 ansible_host=172.16.10.12
node3 ansible_host=172.16.10.13
[first-group]
node1 ansible_host=172.16.10.11
node2 ansible_host=172.16.10.12
[second-group]
node3 ansible_host=172.16.10.13
Как сохранить результат команды в переменную?
С помощью модуля register
- name: Run some command and register output as variable
shell: command
register: command_result
Как проверить определена ли переменная?
Для этого используется опция is defined (определена) или is not defined (не определена):
Где можно хранить переменные и какова их приоритетность?
Основные правила приоритета выглядят так: (От наиболее приоритетного к наименьшему)
0. extra-vars (Переменные передаваемые при вызове playbook’а через параметр -e "some_var=my_value"
1. role params (Переменные описанные в роли и включениях)
2. set_facts / registered vars (Переменные описанные в playbook используя set_facts и зарегистрированные переменные.)
3. include_vars (Добавляется указанием файла с переменными и списка переменных)
4. task vars - block_vars (Переменные только для задачи / блока)
5. role vars (Описываются в папке роли roles/role/vars/main.yml)
6. play vars_files / play vars_prompt (С указанием файла переменных / ручным вводом по запросу)
7. play vars (Указываются в playbook используя vars:)
8. host facts (Факты хоста)
9. host_vars (playbook – inventory)
10. group_vars (playbook – inventory - group_vars/all)
11. role defaults (Описываются в папке роли roles/role/defaults/main.yml)
Как вывести содержимое исполненной команды?
С помощью модуля debug
- name: Show command output
debug:
var: command_result.stdout
Как проверить существует ли файл?
С помощью модуля stat
- name: Print a debug message
debug:
msg: "Path doesn't exist"
when: path_var.stat.exists is not defined
Как запускать задачи на разных ОС и различных версиях?
С помощью встроенных переменных ansible_os_family и ansible_distribution_major_version
В следующем примере запустится задача task1 в системах на основе Debian версии 10 и task2 на основе RedHat версии 8.
- name: Run task1 if OS is Debian 10
…
when: ansible_os_family == "Debian" and ansible_distribution_major_version == "10"
- name: Run task2 if OS is Red Hat 8
…
when: ansible_os_family == "RedHat" and ansible_distribution_major_version == "8"
Как добавить репозиторий?
- name: "Add chrome deb repository"
apt_repository:
repo: deb http://dl.google.com/linux/chrome/deb/ stable main
state: present
Удалить – написать absent в state
Как установить конкретной версию пакета используя pip3?
- name: Install specific bottle version with pip3
pip:
name: bottle==0.12.19
executable: pip3
Как склонировать в определенную папку только ветку master из github?
- name: Example clone of a single branch
git:
repo: https://github.com/ansible/ansible-examples.git
dest: /src/ansible-examples
single_branch: yes
version: master
Как создать системную учетную запись?
- name: Create consul user
user:
name: consul
system: yes
comment: "Consul Agent"
Как запустить и поставить службу на автозагрузку?
- name: Start and Enable httpd
systemd:
name: httpd.service
state: started
enabled: yes
Как скопировать файл с заданными правами?
- name: Copy file with owner and permission
copy:
src: /mine/ntp.conf
dest: /etc/ntp.conf
owner: user
group: user
mode: '0644'
Как скачать и разархивировать файл в директорию?
- name: Download and Unarchive file to directory
unarchive:
src: https://example.com/example.zip
dest: /usr/local/bin
remote_src: yes
Как запустить docker контейнер c healtcheck’ом в Ansible?
- name: Start container with healthstatus
docker_container:
name: nginx-proxy
image: nginx:1.20
state: started
healthcheck:
# Check if nginx server is healthy by curl'ing the server.
# If this fails or timeouts, the healthcheck fails.
test: ["CMD", "curl", "--fail", "http://nginx.host.com"]
interval: 1m30s
timeout: 10s
retries: 3
start_period: 30s
Как запустить playbook с определенной задачи?
С помощью ключа --start-at-task
ansible-playbook playbook.yml --start-at-task="Configure Nginx"
Как запускать / пропускать несколько задач одной тематики?
Задать tags: в плейбуке и использовать ключ --tags при запуске
ansible-playbook playbook.yml --tags=nginx,mysql
Пропускать задачи аналогично, задав tags в плейбуке и использовав --skip-tags при запуске
ansible-playbook playbook.yml --skip-tags=mysql
Сталкиваюсь с ошибками. Как детальнее узнать в чем проблема?
Используя ключ -v при запуске. (Для более детального вывода использовать -vvvv)
ansible-playbook playbook.yml -v
Наверняка кто-то уже делал задачу которая мне необходима, где ее найти?
https://galaxy.ansible.com. Вы можете ковырять, редактировать роли под ваши нужды.
Источники изучения Ansible
Книга «Запускаем Ansible» Мозер Рене, Хоштейн Лорин на русском.
Свободные источники: Google и YouTube.
Наш потоковый курс «Ansible: Infrastructure as Code» без сухой теории, с реальной практикой, мемами и чатом для участников. Вас ждут 8 тем, 38 уроков, 10 часов видеолекций, 78 тестовых и 46 практических заданий, 36 часов стендов для выполнения практик. Старт обучения уже 13 апреля.
Комментарии (7)
TimsTims
06.04.2022 15:08+5Нет, это простой и эффективный инструмент... на человекочитаемом языке YAML... сродни файлам README.
Ха. YAML нифига не человекочитаемый, а скорее беспощадный к любому огреху. Поставили лишний пробел или табуляцию? Получаете ошибку. Затесался лишний нечитаемый символ? Ошибка. Не поставили двоеточие? Ловите ошибку. Ах поставили двоеточие? Снова ловите ошибку, ведь вы забыли про отступы. Когда надо ставить двоеточие? Вроде всегда, но заранее не знаешь, нужно внимательно читать доки. Всё равно не работает? Наверное, нужно поставить тирэ, ведь это новый элемент списка. Теперь работает? Вроде ошибок не выдаёт, но кажется снова отступы забыли поставить...
И вот все эти миллион мучений просто из-за чертовски придирчивого синтаксиса. И вместо того, чтобы тратить время на логику и правильный деплой - время тратится на борьбу с синтаксисом.
И если тот же json можно легко проверить на валидацию, то в yaml почти любой вариант будет валидный, но ты заранее не знаешь, всё ли ты сделал правильно. От этого его правильность можно проверять, только запуская чекер в самом ansible , а не каким-то встроенным плагином (по кр.мере я не нашел).
poxvuibr
06.04.2022 17:07+4Ха. YAML нифига не человекочитаемый, а скорее беспощадный к любому огреху.
Плюс комментарию, плюс в карму!
Сначала был XML, в котором всё было понятно и только иногда случались холивары по поводу того, что тут поставить — атрибут или вложенный тег. И было куча инструментов. И DTD и XSL, всё было отлично. Но нам казалось, что это всё слишком многословно. Так оно, конечно и было, но всё же в формате были предусмотрены даже комментарии.
Потом появился JSON. Я помню, сильно радовался. Он казался таким элегантным, таким программистским, таким понятным. И не надо было ставить закрывающие теги, всё обходилось закрывающей фигурной скобкой. Я считал, что он идеален. И только потом выяснилось, что комментарии там не предусмотрены, валидация сложная, потому что типизации считай нет и ещё были какие-то проблемы. И ссылок не было предусмотрено, объекты приходилось копировать или придумывать велосипеды. Но по крайней мере там нельзя было полностью всё сломать, поставив лишний пробел. Однако и он показался нам слишком избыточным
И вот сделали YML. Про него в предыдущем комментарии неплохо написано. Хотя кто знает, может дело в том, что с xml и json я провёл гораздо больше времени )).
AVX
07.04.2022 15:54+1И ни в одном курсе по ansible не затрагивается вопрос управления windows серверами. А ведь там куча нюансов - многие из них описаны в документации, но часть надо где-то искать и спрашивать (службы, порты, версии powershell и ОС...)
Если контроллер (сервер) с ansible в домене, и я подключусь к нему по ssh доменным пользователем, можно ли выполнить плейбук без указания в нём (или ещё где-то) учётных данных (юзер, пасс)? Чтобы выполнился с моими учётными данными на всех указанных windows серверах (в домене).
Что значит "выполняются параллельно"? То есть если я укажу в инвентори 1000 серверов, на них ansible отправит разом команды? А сам контроллер от этого кони не двинет? А 10к, а 70к? И в каком порядке: 1 таск на все серверы, потом второй на все серверы...; или же все таски разом на все серверы отправляются. Или этим можно как-то управлять, скажем, ограничить количество одновременных коннектов. У нас, например, легко может "возбудиться" система контроля трафика или что-то ещё (их несколько). Да и если задания связаны будут со скачиванием чего-то, то массовое скачивание обернётся проблемами.
что-то ещё было, забыл уже.
andreymal
WSL2 является виртуальной машиной
Это условие будет всегда ложным, потому что переменная
exists
определена всегда, даже если файл не существует (тогда она будет иметь значениеfalse
)Правильно так:
when: not path_var.stat.exists
А ещё странно, что в тексте статьи отсутствует таск с собственно модулем
stat
JumpinCarrot
Обожаю, когда писатели инструкций сами не проверяют свои решения! Особенно когда быстро нужно найти "шпаргалку" по какой-либо теме.
icCE
нравится формат хостов в ini формате, хотя он уже давно не рекомендуется, а рекомендуется yml. Еще волшебно проверка существовании папки, если она там должна быть, то просто создайте ее .