Ansible - Часто Задаваемые Вопросы (FAQ)
Что такое Ansible?
Это ПО с открытым исходным кодом, написанное на Python.
Для чего он используется?
Для автоматизированного выполнения задач поставки программного обеспечения, управления конфигурацией и развертывания приложений.
Есть ли Ansible на Windows?
Нет, но системы с поддержкой WSL (Windows Subsystem for Linux) позволяют запускать дистрибутивы Linux без накладных расходов на виртуальные машины.
Ansible сложный?
Нет, это простой и эффективный инструмент.
Такие сложные задачи как подготовка сервера, управление конфигурацией программных и аппаратных пакетов, развертывание приложений на разных системах, выполняются посредством написания сценариев на человекочитаемом языке YAML. А сами сценарии сродни файлам README.
Какие у него преимущества?
-
Безагентная модель работы. Не требуется предустановка софта на удаленные серверы. Достаточно лишь иметь SSH соединение и python 2.6+.
-
Встроенные модули. Позволяют решать широкий спектр задач, так же есть возможность написать свой модуль.
-
Идемпотентность. Свойство, которое при многократном выполнении приводит к тому же результату, что и однократное выполнение.
-
Распространенность (популярность). Продукт компании 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 (не определена):
Где можно хранить переменные и какова их приоритетность?
Основные правила приоритета выглядят так: (От наиболее приоритетного к наименьшему)
-
extra-vars (Переменные передаваемые при вызове playbook’а через параметр -e "some_var=my_value"
-
role params (Переменные описанные в роли и включениях)
-
set_facts / registered vars (Переменные описанные в playbook используя set_facts и зарегистрированные переменные.)
-
include_vars (Добавляется указанием файла с переменными и списка переменных)
-
task vars - block_vars (Переменные только для задачи / блока)
-
role vars (Описываются в папке роли roles/role/vars/main.yml)
-
play vars_files / play vars_prompt (С указанием файла переменных / ручным вводом по запросу)
-
play vars (Указываются в playbook используя vars:)
-
host facts (Факты хоста)
-
host_vars (playbook – inventory)
-
group_vars (playbook – inventory - group_vars/all)
-
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
Наверняка кто-то уже делал задачу которая мне необходима, где ее найти?
Вы можете ковырять, редактировать роли под ваши нужды.