You are here

Ansible: hosts и ansible.cfg. Lesson 1

Linux: 

Ansible с чего начать? Первые уроки: hosts и ansible.cfg

Уважаемые читатели, в данной статье разберем основы при работе с Ansible. Материал будет интересен в первую очередь новичкам. Для начала рекомендуем также прочитать данные 2 статьи:

* Здесь мы не будем затрагивать вопрос установки, и настройки SSH соединения с серверами (об этом есть материал выше).

1. Ansible - что это и для чего? Разбираем основы
Если вы только установили Ansible, необходимо перейти в его каталог и проверить содержимое:

  1. # переходим
  2. cd /etc/ansible/
  3. # проверяем содержимое и права
  4. ls -la
  5. drwxr-xr-x 3 root root 4096 сен 18 12:22 .
  6. drwxr-xr-x 122 root root 4096 окт 10 15:03 ..
  7. -rw-r--r-- 1 root root 20340 сен 15 13:58 ansible.cfg
  8. -rw-r--r-- 1 root root 615 сен 18 12:22 hosts

Немного теории
Ansible - это система управления конфигурациями, написанная на Python. Более простым языком: это универсальный инструмент позволяющий выполнять некий структурированный список команд (написанный на языке YML, в виде скрипта) на нескольких серверах.
Если у вас несколько серверов 5...100, то при попытке даже простого обновления пакетов, вы потеряете уйму времени на подключение к каждому из этих серверов по отдельности. Ansible дает универсальное средство решить данную проблему, как? читаем дальше!

2. Настройка файла hosts под наши сервера
Прежде всего нам надо настроить список наших серверов, на которые мы будем отправлять наши данные. Для этого заходим в файл hosts:

  1. sudo nano hosts

Содержимое файла hosts будем примерно таким:

  1. # Ex 1: Ungrouped hosts, specify before any group headers.
  2.  
  3. #green.example.com
  4. #192.168.0.8
  5.  
  6. # Ex 2: A collection of hosts belonging to the 'webservers' group
  7.  
  8. #[webservers]
  9. #alpha.example.org
  10. #192.168.1.100
  11. ...

Допустим у нас есть сервера c IP 192.168.0.10 и 192.168.0.20 (локальный). Добавим наши сервера в файл выше и укажем данные для подключения к ним (пояснения прямо в коде):

  1. ...
  2. # Ex 2: A collection of hosts belonging to the 'webservers' group
  3. ...
  4. [debi_servers]
  5. #можно просто указать сервер, его IP
  6. 192.168.0.10
  7. #можно присвоить имя, указать пользователя и его пароль
  8. debi ansible_host=192.168.0.20 ansible_user=debiuser ansible_pass=password123
  9. ...

Пример заполнения выше, с данными пользователя, не совсем корректный. Лучше использовать SSH. О том как его настроить, ссылка на статью в самом начале. Смотрим где у нас находится ключ SSH:

  1. # из корня домашней папки переходим в папку с ключами
  2. cd .ssh
  3. # проверяем содержание
  4. ls -la
  5. итого 28
  6. drwx------ 2 debuser debuser 4096 окт 9 16:34 .
  7. drwxr-xr-x 18 debuser debuser 4096 окт 10 15:02 ..
  8. -rw------- 1 debuser debuser 399 сен 11 12:02 id_ed25519
  9. -rw-r--r-- 1 debuser debuser 95 сен 11 12:02 id_ed25519.pub
  10. # смотрим путь до ключа
  11. pwd
  12. /home/debuser/.ssh

Вносим эти данные в наш файл hosts:

  1. [debi_servers]
  2. #убрали один сервер и добавили ссылку на SSH ключ
  3. debi ansible_host=192.168.0.20 ansible_user=debiuser ansible_ssh_private_key_file=/home/debuser/.ssh/id_ed25519

Можно попробывать подключиться к серверу. Есть один момент, при подключении первый раз к серверу он спросит отпечаток: "Are you sure you want to continue connecting (yes/no)". После подтверждения, он больше не спрашивает. Но если вы подключаетесь первый раз к 100 серверам, то придеться отвечать по каждому. Простая команда для примера:

  1. ansible -i hosts all -m ping
  2. The authenticity of ...
  3. ... Are you sure you want to continue connecting (yes/no)
  4. debi | SUCCESS => {
  5. "changed": false,
  6. "ping": "pong"
  7. }

Чтобы отменить проверку отпечатка на каждый сервер и не прописывать файл сервера, заполняем файл ansible.cfg. Обычно эти значения уже есть в шаблоне, надо только их раскомментировать:

  1. [defaults]
  2. # строчка которая указывает файл с серверами по умолчанию
  3. inventory = /etc/ansible/hosts
  4. # строчка которая отменяет проверку первичного подключения (yes/no)
  5. host_key_checking = false

Повторяем команду выше, но уже сокращенный вариант:

  1. # all - все сервера из файла, -m модуль
  2. ansible all -m ping
  3. debi | SUCCESS => {
  4. "changed": false,
  5. "ping": "pong"
  6. }

3. Создаем файл inventory или hosts

Объединение серверов в группы:
Допустим у вас много серверов: сервера баз, сервера приложений, сервера итогового проекта PROD. Тогда это можно записать в файл hosts в разных вариантах:

  1. # все сервера ниже входят в группу all
  2.  
  3. 192.168.0.12
  4. 192.168.0.14
  5.  
  6. [debi_servers]
  7. debi ansible_host=192.168.0.20 ansible_user=debiuser ansible_ssh_private_key_file=/home/debuser/.ssh/id_ed25519
  8. debi2 ansible_host=192.168.0.32 ansible_user=debiuser ansible_ssh_private_key_file=/home/debuser/.ssh/id_ed25519
  9.  
  10. # тестовый пред прод сервер баз
  11. [staging_DB]
  12. 192.168.0.1
  13. 192.168.0.2
  14.  
  15. # тестовый пред прод сервер баз 2 (обратите внимание на индекс DB и db, это разные группы)
  16. [staging_db]
  17. 192.168.0.3
  18. 192.168.0.4
  19.  
  20. # тестовый пред прод сервер приложений
  21. [staging_APP]
  22. 192.168.0.5
  23. 192.168.0.6
  24.  
  25. # тестовый пред прод сервер приложений
  26. [prod_APP]
  27. 192.168.0.7
  28. 192.168.0.8
  29.  
  30. # сервер базы PROD
  31. [prod_DB]
  32. 192.168.0.15
  33. 192.168.0.16
  34.  
  35. # Объединим группы серверов в одну более крупную
  36. [staging_ALL:children]
  37. staging_DB
  38. staging_db
  39. staging_APP
  40.  
  41. # группа которая объединяет все DB
  42. [DB_ALL:children]
  43. staging_DB
  44. staging_db
  45. prod_DB

Тем самым, вот так просто вы можем составлять группы, а в созданные группы еще группы. Это удобно, главное не переборщить.

Объединение общих данных для серверов:
Теперь объединим данные для авторизации для серверов debi:

Было:

  1. ...
  2. [debi_servers]
  3. debi ansible_host=192.168.0.20 ansible_user=debiuser ansible_ssh_private_key_file=/home/debuser/.ssh/id_ed25519
  4. debi2 ansible_host=192.168.0.32 ansible_user=debiuser ansible_ssh_private_key_file=/home/debuser/.ssh/id_ed25519
  5. ...

Стало:

  1. ...
  2. [debi_servers]
  3. debi ansible_host=192.168.0.20
  4. debi2 ansible_host=192.168.0.32
  5. ...
  6. # так как у нас одинаковые пользователи и ключи, переносим их в отдельный блок
  7. [debi_servers:vars]
  8. ansible_user=debiuser
  9. ansible_ssh_private_key_file=/home/debuser/.ssh/id_ed25519
  10. ...

Свободные переменные для серверов:

  1. ...
  2. # Объединим группы серверов в одну более крупную
  3. [staging_ALL:children]
  4. staging_DB
  5. staging_db
  6. staging_APP
  7. ...
  8. # staging_ALL - группа выше, параметру message присвоили значение Help. Это значение можно применять в рамках всей нашей группы "staging_ALL"
  9. [staging_ALL:vars]
  10. message=Help
  11. ...


Просмотреть переменные, группы и сервера:

  1. # Фрагмент выполнения команды
  2. ansible-inventory --list
  3. {
  4. "_meta": {
  5. "hostvars": {
  6. "debi": {
  7. "ansible_host": "192.168.0.20",
  8. "ansible_ssh_private_key_file": "/home/debuser/.ssh/id_ed25519",
  9. "ansible_user": "debiuser"
  10. }
  11. }
  12. },
  13. "all": {
  14. "children": [
  15. "test_server",
  16. "ungrouped"
  17. ]
  18. },
  19. "test_server": {
  20. "hosts": [
  21. "debi"
  22. ]
  23. },
  24. "ungrouped": {}
  25. }
  26. ...

Или в виде графа:

  1. # фрагмент
  2. ansible-inventory --graph
  3. @all:
  4. |--@test_server:
  5. | |--debi
  6. |--@ungrouped:
  7. ...

4. Выносим общие переменные из файла hosts
В пункте 3 мы вынесли общие переменные с данными пользователя в отдельный блок. Но на практике, такие данные более професионально выносить в отдельный файл. Это мы сейчас и сделаем:

Было:

  1. ...
  2. [debi_servers]
  3. debi ansible_host=192.168.0.20
  4. debi2 ansible_host=192.168.0.32
  5. ...
  6. # так как у нас одинаковые пользователи и ключи, переносим их в отдельный блок
  7. [debi_servers:vars]
  8. ansible_user=debiuser
  9. ansible_ssh_private_key_file=/home/debuser/.ssh/id_ed25519
  10. ...

Проверям что у нас в каталоге Ansible:

  1. ls -la
  2. drwxr-xr-x 3 root root 4096 окт 14 13:21 .
  3. drwxr-xr-x 122 root root 4096 окт 14 10:34 ..
  4. -rw-r--r-- 1 root root 20340 сен 15 13:58 ansible.cfg
  5. -rw-r--r-- 1 root root 670 окт 14 13:21 hosts

Создаем директорию group_vars и переходим в неё:

  1. sudo mkdir group_vars
  2. ls -la
  3. drwxr-xr-x 4 root root 4096 окт 14 14:07 .
  4. drwxr-xr-x 122 root root 4096 окт 14 10:34 ..
  5. -rw-r--r-- 1 root root 20340 сен 15 13:58 ansible.cfg
  6. drwxr-xr-x 2 root root 4096 окт 14 14:07 group_vars
  7. -rw-r--r-- 1 root root 670 окт 14 13:21 hosts
  8. cd group_vars

Создаем файл с нашим именем группы серверов debi_servers:

  1. nano debi_servers

Внутри прописываем:

  1. # знак "="меняем на ":", это важно!
  2. ansible_user : debiuser
  3. ansible_ssh_private_key_file : /home/debuser/.ssh/id_ed25519
  4. # добавим данные: для какого сервера и имя автора
  5. environment : PROD
  6. owner : Kostya

Сохраняем. В файле hosts эти строчки полностью стираете:

  1. [debi_servers:vars]
  2. ansible_user=debiuser
  3. ansible_ssh_private_key_file=/home/debuser/.ssh/id_ed25519

Стало:

Стал чистый файл hosts который содержит только сервера и группы серверов. Все данные с vars теперь в отдельном файле, расположенном в директории group_vars. Так и должно быть, это более профессиональное написание.

На этом статья заканчивается, продолжение читаем в следующих статьях!

Источник: http://linuxsql.ru