Pull to refresh
70.62
Слёрм
Учебный центр для тех, кто работает в IT

Ansible FAQ

Reading time6 min
Views17K

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

Tags:
Hubs:
Total votes 19: ↑17 and ↓2+16
Comments9

Articles

Information

Website
slurm.io
Registered
Founded
Employees
51–100 employees
Location
Россия
Representative
Антон Скобин