Статьи

Автоматизируйте все с помощью Ansible: часть первая

Это первая часть руководства из двух частей по Ansible. В этой части вы узнаете, что такое Ansible, как его установить и настроить, а также как установить локальный кластер Vagrant для его тестирования. Затем вы найдете инвентарь, модули, специальные команды, игровые книги, стратегии запуска, блоки и хранилище.

Ansible — это инструмент управления конфигурацией и оркестровки. Он работает в том же домене, что и Puppet, Chef и Saltstack. Это означает, что с помощью Ansible вы можете удаленно предоставлять целый парк удаленных серверов, устанавливать и развертывать на них программное обеспечение и отслеживать их удаленно.

Ansible — это проект с открытым исходным кодом, реализованный на Python и имеющий подключаемую архитектуру с модулями, которые могут управлять практически любой операционной системой, облачной средой и инструментом или средой системного администрирования. Вы также можете довольно легко расширить его с помощью своих собственных плагинов, если вы хотите сделать что-то особенное.

Одной из уникальных особенностей Ansible является то, что он не устанавливает никакого программного обеспечения на управляемые машины. Управляет машинами удаленно через SSH. Чтобы управлять удаленным компьютером, вам просто нужно убедиться, что ваш открытый SSH-ключ находится в файле author_keys этого компьютера.

Ansible работает на управляющей машине и может управлять серверами под управлением любой операционной системы, но управляющая машина не может быть машиной Windows на данный момент. Я буду использовать Mac OS X в этом руководстве в качестве контрольной машины.

Ansible требует Python 2.6 или 2.7. Чтобы установить его, введите:

pip install ansible

В Mac OS X рекомендуется увеличить количество дескрипторов файлов:

sudo launchctl limit maxfiles 1024 unlimited

Если вы видите ошибку типа «Слишком много открытых файлов», вам, вероятно, нужно это сделать.

Чтобы проверить правильность установки Ansible, введите ansible --version . Тебе следует увидеть:

1
2
3
4
5
ansible 2.0.0.2
 
 config file =
 
 configured module search path = Default w/o overrides

Конечно, номер версии может быть другим.

Ansible имеет файл конфигурации, который позволяет вам контролировать множество параметров. Порядок поиска:

  • ANSIBLE_CONFIG (переменная окружения)
  • ansible.cfg (в текущем каталоге)
  • .ansible.cfg (в домашнем каталоге)
  • /etc/ansible/ansible.cfg

Вы также можете переопределить определенные параметры, используя отдельные переменные среды , которые имеют приоритет над файлом конфигурации.

Проверьте документацию Ansible, чтобы узнать обо всех вариантах.

Чтобы по-настоящему понять всю мощь Ansible, вам нужно несколько серверов для управления. В этом руководстве я буду использовать кластер Vagrant из 3 виртуальных машин, но для Ansible это всего лишь несколько хостов, которыми он должен управлять. Чтобы узнать больше о Vagrant, ознакомьтесь с разделом Введение в Vagrant .

Сначала установите VirtualBox и Vagrant . Затем поместите следующее в файл с именем Vagrantfile в рабочем каталоге.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
# -*- mode: ruby -*-
 
# vi: set ft=ruby :
 
hosts = {
 
  «larry» => «192.168.88.10»,
 
  «curly» => «192.168.88.11»,
 
  «moe» => «192.168.88.12»
 
}
 
Vagrant.configure(«2») do |config|
 
  config.vm.box = «precise64»
 
  config.vm.box_url = «http://files.vagrantup.com/precise64.box»
 
 hosts.each do |name, ip|
 
    config.vm.define name do |machine|
 
      machine.vm.network :private_network, ip: ip
 
      machine.vm.provider «virtualbox» do |v|
 
        v.name = name
 
      end
 
    end
 
  end
 
end

Тогда наберите vagrant up . Vagrant создаст для вас три виртуальные машины, доступные как larry, curly и moe. Чтобы проверить, введите vagrant status . Тебе следует увидеть:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
Current machine states:
 
 
 
larry running (virtualbox)
 
curly running (virtualbox)
 
moe running (virtualbox)
 
 
 
This environment represents multiple VMs.
 
above with their current state.
 
VM, run `vagrant status NAME`.

Чтобы убедиться, что вы можете использовать SSH на хостах кластера, введите: vagrant ssh-config >> ~/.ssh/config .

Теперь вы можете использовать SSH на любом из ваших виртуальных серверов, используя их имя хоста. Например: ssh curly . Это позволит Ansible подключаться к хостам вашего кластера через SSH без каких-либо проблем с именами пользователей, паролями или ключами.

Теперь, когда у нас есть кластер, нам нужно рассказать об этом Ansible. Это делается с помощью инвентарного файла. Файл инвентаризации — это список имен хостов, организованных в группы с использованием формата файла INI. Поместите следующее в файл с именем ‘hosts’ в вашей рабочей директории.

01
02
03
04
05
06
07
08
09
10
11
[funny]
 
larry
 
 
 
[funnier]
 
curly
 
moe

Я поместил «Ларри» в группу «Веселые», а остальные хозяева в группу «Веселые». Эта организация позволит нам выполнять действия с этими группами. Вы также можете выполнять действия на отдельных хостах и ​​на всех хостах.

Ansible имеет очень модульную и расширяемую архитектуру. Все его возможности организованы в модули. Есть основные модули и дополнительные модули. Каждый модуль представляет команду, и большинство принимает аргументы. Вы можете использовать модули непосредственно в специальных командах или в книгах воспроизведения. Вы можете прочитать обо всех модулях в документации .

Пора взяться за дело. Самый простой способ использовать Ansible — запускать специальные команды. Специальные команды используют модули. Формат специальной команды:

ansible <host group> -i <inventory file> -m <module> [-a <argument 1>, ... <argument N>]

Например, чтобы увидеть, все ли хосты в вашем инвентаре работают, вы можете использовать модуль ping (без аргументов):

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
ansible all -i hosts -m ping
 
curly |
 
    «changed»: false,
 
    «ping»: «pong»
 
}
 
larry |
 
    «changed»: false,
 
    «ping»: «pong»
 
}
 
moe |
 
    «changed»: false,
 
    «ping»: «pong»
 
}

Ansible имеет много модулей для всех общих задач системного администрирования, таких как управление файлами, управление пользователями и управление пакетами, а также множество необычных задач. Но если вы не можете найти то, что вам нужно, или просто чувствуете себя более комфортно с простыми командами оболочки, вы можете использовать модуль оболочки напрямую, включая каналы. Следующая команда извлекает внутренние и внешние IP-адреса всех хостов:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
ansible all -i hosts -m shell -a ‘/sbin/ifconfig |
 
 
 
larry |
 
          inet addr:10.0.2.15 Bcast:10.0.2.255 Mask:255.255.255.0
 
          inet addr:192.168.88.10 Bcast:192.168.88.255 Mask:255.255.255.0
 
 
 
curly |
 
          inet addr:10.0.2.15 Bcast:10.0.2.255 Mask:255.255.255.0
 
          inet addr:192.168.88.11 Bcast:192.168.88.255 Mask:255.255.255.0
 
 
 
moe |
 
          inet addr:10.0.2.15 Bcast:10.0.2.255 Mask:255.255.255.0
 
          inet addr:192.168.88.12 Bcast:192.168.88.255 Mask:255.255.255.0

Специальные команды хороши, когда вы хотите быстро что-то сделать на нескольких хостах, но настоящая сила Ansible — в его плейбуках. Playbooks — это файлы YAML, в которых вы определяете наборы задач для достижения таких целей, как подготовка, настройка, развертывание и организация вашей инфраструктуры.

Давайте посмотрим на то, как выглядит типичная книга, прежде чем мы перейдем к деталям.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
 
— hosts: funnier
 
  tasks:
 
   — name: Install Nginx
 
     apt: pkg=nginx state=installed update_cache=true
 
     notify: Start Nginx
 
   — name: Install Python 3
 
     apt: pkg=python3-minimal state=installed
 
  handlers:
 
    — name: Start Nginx
 
      service: name=nginx state=started

В playbook есть раздел hosts, в котором вы указываете хосты из файла инвентаризации. В этом случае название группы «смешнее». Затем есть раздел задач с двумя задачами, которые устанавливают Nginx и Python 3. Наконец, есть раздел обработчиков, где Nginx запускается после его установки.

Вы запускаете playbook с помощью команды ansible-playbook . Вам все еще нужно предоставить файл инвентаря и книгу воспроизведения, которую вы хотите запустить. Сохраните playbook в файл с именем «playbook.yml» в вашем рабочем каталоге. Давайте попробуем:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
ansible-playbook -i hosts playbook.yml
 
 
 
PLAY ***************************************************************************
 
 
 
TASK [setup] *******************************************************************
 
ok: [moe]
 
ok: [curly]
 
 
 
TASK [Install Nginx] ***********************************************************
 
fatal: [moe]: FAILED!
 
fatal: [curly]: FAILED!
 
 
 
PLAY RECAP *********************************************************************
 
curly : ok=1 changed=0 unreachable=0 failed=1
 
moe : ok=1 changed=0 unreachable=0 failed=1

О нет. Что произошло? Ansible выдает приличное сообщение об ошибке: «Не удалось заблокировать apt для исключительной операции». Многие пьесы требуют привилегий sudo. Эта пьеса не является исключением. Чтобы запустить playbook с привилегиями sudo, просто добавьте флаг --sudo :

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
ansible-playbook -i hosts playbook.yml —sudo
 
 
 
PLAY ***************************************************************************
 
 
 
TASK [setup] *******************************************************************
 
ok: [curly]
 
ok: [moe]
 
 
 
TASK [Install Nginx] ***********************************************************
 
changed: [moe]
 
changed: [curly]
 
 
 
TASK [Install Python 3] ********************************************************
 
changed: [moe]
 
changed: [curly]
 
 
 
RUNNING HANDLER [Start Nginx] **************************************************
 
changed: [moe]
 
changed: [curly]
 
 
 
PLAY RECAP *********************************************************************
 
curly : ok=4 changed=3 unreachable=0 failed=0
 
moe : ok=4 changed=3 unreachable=0 failed=0

Ansible является идемпотентом, что означает, что если что-то уже находится в желаемом состоянии, то Ansible оставит его в покое. В выводе ansible-playbook вы можете увидеть, какие задачи были успешными или неудачными, а какие были изменены.

Давайте снова запустим ту же книгу. Ничто не должно быть изменено:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
ansible-playbook -i hosts playbook.yml —sudo
 
 
 
PLAY ***************************************************************************
 
 
 
TASK [setup] *******************************************************************
 
ok: [moe]
 
ok: [curly]
 
 
 
TASK [Install Nginx] ***********************************************************
 
ok: [curly]
 
ok: [moe]
 
 
 
TASK [Install Python 3] ********************************************************
 
ok: [curly]
 
ok: [moe]
 
 
 
PLAY RECAP *********************************************************************
 
curly : ok=3 changed=0 unreachable=0 failed=0
 
moe : ok=3 changed=0 unreachable=0 failed=0

До Ansible 2.0 игры выполнялись линейно, задача за задачей. Все целевые хосты выполнили первое задание. Только когда все узлы были выполнены с первым заданием, они могли начать второе задание.

В Ansible 2.0 добавлена ​​концепция стратегий запуска. В настоящее время существует две стратегии: «линейная» стратегия, которую я описал выше, которая является стратегией по умолчанию, и «свободная» стратегия, при которой хосты могут свободно выполнять задачи в сборнике пьес по-прежнему в порядке, но не в синхронизации с другими хостами.

Это может быть полезно, если сотни хостов должны загрузить несколько файлов с некоторых FTP-серверов. Первый хост может завершить загрузку первого файла и перейти к следующему, в то время как другие хосты все еще заняты загрузкой первого файла. К тому моменту, когда другие хосты загрузят следующий файл, первый хост уже будет готов, и будет меньше конфликтов.

Свободная стратегия кажется превосходной в большинстве ситуаций. Вы просто добавляете strategy: free пара ключ-значение в playbook.

1
2
3
4
5
6
7
— hosts: all
 
 strategy: free
 
 tasks:
 
 …

Еще одна новая особенность Ansible 2.0 — блоки. Блоки позволяют группировать задачи вместе. Это очень полезно, если у вас есть задачи, которые нужно выполнять только при определенных условиях. Раньше вам приходилось делать это для каждой задачи отдельно.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
 
— hosts: all
 
  tasks:
 
    — debug: msg=’Task 1 here’
 
      when: ansible_distribution == ‘Ubuntu’
 
 
 
    — debug: msg=’Task 2 here’
 
      when: ansible_distribution == ‘Ubuntu’
 
 
 
    — debug: msg=’Task 3 here’
 
      when: ansible_distribution == ‘Ubuntu’

С блоками вы можете сгруппировать все эти задачи отладки вместе и поставить условие «когда» на уровне блока.

01
02
03
04
05
06
07
08
09
10
11
12
13
— hosts: all
 
 tasks:
 
   — block:
 
     — debug: msg=’Task 1 here’
 
     — debug: msg=’Task 2 here’
 
     — debug: msg=’Task 3 here’
 
     when: ansible_distribution == ‘Ubuntu’

Ansible связывается с удаленными компьютерами по SSH, но в плейбуках могут содержаться такие секреты, как имя пользователя, пароли и ключи API. Поскольку вы обычно храните книги в системах контроля версий, таких как git, эта информация будет видна всем, кто имеет доступ для чтения.

Ansible помогает с программой ansible-vault, которая позволяет создавать, редактировать и повторно шифровать зашифрованные файлы. Эти файлы можно расшифровать на лету при запуске playbook, указав пароль. Если вы добавите --vault-ask-pass в ansible-playbook, он --vault-ask-pass пароль хранилища.

Кроме того, вы можете добавить --vault-password-file <password file> и Ansible прочитает пароль из вашего файла. Если вы используете файл паролей, не храните его в системе контроля версий!

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

Ansible — отличный инструмент Это легкий. Он может использоваться в интерактивном режиме со специальными командами и очень хорошо масштабируется для больших систем. У этого также есть большой импульс и большое сообщество. Если вы управляете или даже просто работаете с удаленными серверами, вам нужен Ansible.

Оставайтесь с нами для второй части.