Ansible FAQ

от автора

Мы уже ознакомились с тем, что нужно знать перед началом работы с 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


ссылка на оригинал статьи https://habr.com/ru/company/southbridge/blog/659217/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *