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
Наверняка кто-то уже делал задачу которая мне необходима, где ее найти?
Вы можете ковырять, редактировать роли под ваши нужды.