Мы уже ознакомились с тем, что нужно знать перед началом работы с Ansible.Теперь давайте разберем самые Часто Задаваемые Вопросы, или сокращенно FAQ. Они помогут вам глубже понять тонкости и принцип работы с Ansible. На ранних этапах можете использовать эту статью как некую шпаргалку.

Содержание

Что такое 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 (не определена):

Где можно хранить переменные и какова их приоритетность?

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

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

Комментарии (7)


  1. andreymal
    05.04.2022 19:40
    +4

    системы с поддержкой WSL (Windows Subsystem for Linux) позволяют запускать дистрибутивы Linux без накладных расходов на виртуальные машины.

    WSL2 является виртуальной машиной


    when: path_var.stat.exists is not defined

    Это условие будет всегда ложным, потому что переменная exists определена всегда, даже если файл не существует (тогда она будет иметь значение false)
    Правильно так: when: not path_var.stat.exists


    А ещё странно, что в тексте статьи отсутствует таск с собственно модулем stat


    1. JumpinCarrot
      05.04.2022 19:55

      Обожаю, когда писатели инструкций сами не проверяют свои решения! Особенно когда быстро нужно найти "шпаргалку" по какой-либо теме.


      1. icCE
        05.04.2022 20:17
        +1

        нравится формат хостов в ini формате, хотя он уже давно не рекомендуется, а рекомендуется yml. Еще волшебно проверка существовании папки, если она там должна быть, то просто создайте ее .


  1. hbrsck
    06.04.2022 14:05

    Уж лучше бы рассказали про AWX Operator


  1. TimsTims
    06.04.2022 15:08
    +5

    Нет, это простой и эффективный инструмент... на человекочитаемом языке YAML... сродни файлам README.

    Ха. YAML нифига не человекочитаемый, а скорее беспощадный к любому огреху. Поставили лишний пробел или табуляцию? Получаете ошибку. Затесался лишний нечитаемый символ? Ошибка. Не поставили двоеточие? Ловите ошибку. Ах поставили двоеточие? Снова ловите ошибку, ведь вы забыли про отступы. Когда надо ставить двоеточие? Вроде всегда, но заранее не знаешь, нужно внимательно читать доки. Всё равно не работает? Наверное, нужно поставить тирэ, ведь это новый элемент списка. Теперь работает? Вроде ошибок не выдаёт, но кажется снова отступы забыли поставить...

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

    И если тот же json можно легко проверить на валидацию, то в yaml почти любой вариант будет валидный, но ты заранее не знаешь, всё ли ты сделал правильно. От этого его правильность можно проверять, только запуская чекер в самом ansible , а не каким-то встроенным плагином (по кр.мере я не нашел).


    1. poxvuibr
      06.04.2022 17:07
      +4

      Ха. YAML нифига не человекочитаемый, а скорее беспощадный к любому огреху.

      Плюс комментарию, плюс в карму!


      Сначала был XML, в котором всё было понятно и только иногда случались холивары по поводу того, что тут поставить — атрибут или вложенный тег. И было куча инструментов. И DTD и XSL, всё было отлично. Но нам казалось, что это всё слишком многословно. Так оно, конечно и было, но всё же в формате были предусмотрены даже комментарии.


      Потом появился JSON. Я помню, сильно радовался. Он казался таким элегантным, таким программистским, таким понятным. И не надо было ставить закрывающие теги, всё обходилось закрывающей фигурной скобкой. Я считал, что он идеален. И только потом выяснилось, что комментарии там не предусмотрены, валидация сложная, потому что типизации считай нет и ещё были какие-то проблемы. И ссылок не было предусмотрено, объекты приходилось копировать или придумывать велосипеды. Но по крайней мере там нельзя было полностью всё сломать, поставив лишний пробел. Однако и он показался нам слишком избыточным


      И вот сделали YML. Про него в предыдущем комментарии неплохо написано. Хотя кто знает, может дело в том, что с xml и json я провёл гораздо больше времени )).


  1. AVX
    07.04.2022 15:54
    +1

    И ни в одном курсе по ansible не затрагивается вопрос управления windows серверами. А ведь там куча нюансов - многие из них описаны в документации, но часть надо где-то искать и спрашивать (службы, порты, версии powershell и ОС...)

    Если контроллер (сервер) с ansible в домене, и я подключусь к нему по ssh доменным пользователем, можно ли выполнить плейбук без указания в нём (или ещё где-то) учётных данных (юзер, пасс)? Чтобы выполнился с моими учётными данными на всех указанных windows серверах (в домене).

    Что значит "выполняются параллельно"? То есть если я укажу в инвентори 1000 серверов, на них ansible отправит разом команды? А сам контроллер от этого кони не двинет? А 10к, а 70к? И в каком порядке: 1 таск на все серверы, потом второй на все серверы...; или же все таски разом на все серверы отправляются. Или этим можно как-то управлять, скажем, ограничить количество одновременных коннектов. У нас, например, легко может "возбудиться" система контроля трафика или что-то ещё (их несколько). Да и если задания связаны будут со скачиванием чего-то, то массовое скачивание обернётся проблемами.

    что-то ещё было, забыл уже.