Централизованное управление узлами через Ansible

Posted by

На протяжении долгого времени обслуживаемые сервера увеличивались и мне нужен был инструмент посредством которого я смогу следить на ними всеми, своевременно проводить обновления, массовую настройку систем со схожим функционалом, мониторить их — я же раньше все это проделывал вручную, либо писал простенькие в моем понимание скрипты для автомазиции, а они обычно устареваю (только знания bash скриптинга прокачиваю) но так дело не может продолжаться — Ubuntu — это ведь хороший конструктор. Вот и сейчас мой выбор пал из всего того, я опробовал в своих лабораторных условиях из централизованного/единого/удобного места управления на приложение . Привлекло меня тем, что на удаленные узлы не нужно ставить какие-либо агенты (а это немаловажный для меня фактор), управление же идет через удаленное безопасное соединение кой сервер имеет место быть задействован, именуемое как SSH.

Я хотел получить с помощью Ansible следующий функционал:

  • Управляющий сервер
  • Управление одним узлом или несколькими
  • Установка пакетов
  • Настройка узла(ов) согласно сценарию (т. е. Поднимаю LAMP,Fileserver,ZoneMinder,GLPI)
  • Логирование за действиями на удаленных узлах

Напомню, что все дальнейшие действия я буду рассматривать только для систем Ubuntu — другие я не использую, да и не хочу использовать. Считаю что лучше быть специалистом в чем-то одном, а не во всем по не многу.

Используемая система: .5 Server amd64

ekzorchik@srv-mon:~$ uname -a && lsb_release -a

Linux srv-mon 3.13.0-32-generic #57~precise1-Ubuntu SMP Tue Jul 15 03:51:20 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux

No LSB modules are available.

Distributor ID: Ubuntu

Description: Ubuntu 12.04.5 LTS

Release: 12.04

Codename: precise

Все системы обновлены до самого последнего состояния в рамках текущего релиза.

  • srv-mon → 192.168.1.176 (Это будет управляющая система с Ansible на борту)
  • srv-agent → 192.168.1.175 (Ubuntu Server)
  • srv-host → 192.168.1.173 (Ubuntu Desktop)

Перехожу к разворачиванию Ansible на управляющей системе:

ekzorchik@srv-mon:~$ sudo apt-get install software-properties-common python-software-properties -y

ekzorchik@srv-mon:~$ sudo dpkg-reconfigure python-software-properties

ekzorchik@srv-mon:~$ sudo apt-add-repository ppa:ansible/ansible

ekzorchik@srv-mon:~$ sudo apt-get update && sudo apt-get install ansible sshpass -y

ekzorchik@srv-mon:~$ sudo ansible --version

ansible 2.1.1.0

config file = /etc/ansible/ansible.cfg

configured module search path = Default w/o overrides

В основе комплекса Ansible лежит приложение которое управляет конфигурациями удаленных узлов с текущего.

По мануалу выделяю для себя следующее:

  • /etc/ansible/hosts — Default inventory file
  • /usr/share/ansible/ — Default module library
  • /etc/ansible/ansible.cfg — Config file, used if present
  • ~/.ansible.cfg — User config file, overrides the default config if present
  • The following environment variables may be specified.
  • ANSIBLE_HOSTS — Override the default ansible hosts file
  • ANSIBLE_LIBRARY — Override the default ansible module library path
  • ANSIBLE_CONFIG — Override the default ansible config file

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

ekzorchik@srv-mon:~$ sudo mv /etc/ansible/hosts /etc/ansible/hosts.default

Теперь создаю свой собственный конфигурационный файл описания хостов:

ekzorchik@srv-mon:~$ sudo nano /etc/ansible/hosts

[precise]

192.168.1.175

Работа Ansible с удалёнными серверами по умолчанию предполагает, что у вас имеется настроенное SSH-подключение с авторизацией по RSA-ключам. Как настроить авторизацию по ключам следует смотреть данную заметку:

На сервере с Ansible переключаемся на пользователя (в моем случае учетная запись ekzorchik), под которым будем выполнять подключение, а затем создаем RSA-ключ:

ekzorchik@srv-mon:~$ ssh-keygen -t rsa -b 2048

Далее на удаленной системе настраиваем авторизацию по ключам:

ekzorchik@srv-mon:~$ ssh -l ekzorchik 192.168.1.175 -p 22

ekzorchik@srv-serv:~$ sudo nano /etc/ssh/sshd_config

RSAAuthentication yes

PubkeyAuthentication yes

AuthorizedKeysFile %h/.ssh/authorized_keys

#PasswordAuthentication yes

Сохраняю внесенные изменения, а после на системе где разворачиваю Ansible копирую публичный ключ на удаленную систему:

ekzorchik@srv-mon:~$ ssh-copy-id -i /home/ekzorchik/.ssh/id_rsa.pub ekzorchik@192.168.1.175

Пробую подключиться:

ekzorchik@srv-mon:~$ ssh 192.168.1.175

Last login: Mon Aug 15 18:34:06 2016 from 192.168.1.176

ekzorchik@srv-agent:~$ uname -a

Linux srv-agent 3.13.0-32-generic #57~precise1-Ubuntu SMP Tue Jul 15 03:51:20 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux

подключение проходит, теперь проверим состояние узла с Ansible сервера:

ekzorchik@srv-mon:~$ sudo ansible precise -m ping

The authenticity of host ‘192.168.1.175 (192.168.1.175)’ can’t be established.

ECDSA key fingerprint is 83:e7:2d:db:ea:68:96:3e:3c:d1:45:46:57:bf:34:af.

Are you sure you want to continue connecting (yes/no)? yes

192.168.1.175 | UNREACHABLE! => {

«changed»: false,

«msg»: «Failed to connect to the host via ssh.»,

«unreachable»: true

}

Так что у нас, ошибка, а почему? А потому, что самый главный конфигурационный файл ansible не знает где у нас лежит приватный ключ:

ekzorchik@srv-mon:~$ sudo nano /etc/ansible/ansible.cfg

ansible_managed = Ansible managed: {file} modified on %Y-%m-%d %H:%M:%S by {uid} on {host}

remote_port = 22

#private_key_file = /path/to/file

private_key_file = /home/ekzorchik/.ssh/id_rsa

host_key_checking = False

remote_user = ekzorchik

Сохраняю внесенные изменения и проверяю заново:

ekzorchik@srv-mon:~$ sudo ansible precise -m ping

192.168.1.175 | SUCCESS => {

«changed»: false,

«ping»: «pong»

}

либо же в /etc/ansible/hosts указываем данные с которыми подключаться к системе без использования ключей:

ekzorchik@srv-mon:~$ sudo nano /etc/ansible/hosts

[desktop]

192.168.1.173

ekzorchik@srv-mon:~$ sudo nano /etc/ansible/hosts

[desktop]

192.168.1.173 ansible_ssh_user=ekzorchik ansible_ssh_pass=712mbddr@

отменяем/комментируем изменения в ansible.conf: private_key_file & remote_user, после пробуем подключиться;

ekzorchik@srv-mon:~$ sudo ansible desktop -m ping

192.168.1.173 | SUCCESS => {

«changed»: false,

«ping»: «pong»

}

конечно могут быть случаи когда авторизацию по ключам не будет возможности использовать, у Вас будет только внешний/внутренний IP адрес, учетная записи и пароль от нее, тогда:

ekzorchik@srv-mon:~$ sudo apt-get install sshpass -y

ekzorchik@srv-mon:~$ sudo ansible precise -m ping -k -u root

SSH password:

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

ekzorchik@srv-mon:~$ ansible precise -m ping -k -u ekzorchik

SSH password:

192.168.1.175 | FAILED => Could not make dir /home/ekzorchik/.ansible/cp: [Errno 13] Permission denied: ‘/home/ekzorchik/.ansible/cp’

если такая ошибка, то значит нет прав на создание, поэтому задействуем sudo:

ekzorchik@srv-mon:~$ sudo ansible precise -m ping -k -u ekzorchik

SSH password: 712mbddr@

192.168.1.175 | success >> {

«changed»: false,

«ping»: «pong»

}

, теперь по ключам:

  • -m → модуль который задействует Ansible (command,shell,script,include,include_vars,add_host,group_by,set_fact,raw,meta)
  • -k запросить пароль, вместо использования RSA-ключей;
  • -u использовать заданное имя пользователя

Отлично работает, я же, все дальнейшие действия буду рассматривать когда на удаленном хосте я авторизуюсь по ключам так возвращаю в боевое использовать закомментированные ключи в ansible.conf: private_key_file & remote_user и указание только IP-адресов систем для которых я создал группы для управления:

[precise]

192.168.1.175

[desktop]

192.168.1.173

Проверить версию удаленной системы:

ekzorchik@srv-mon:~$ sudo ansible precise,desktop -m shell -a 'uname -a'

192.168.1.173 | UNREACHABLE! => {

«changed»: false,

«msg»: «Failed to connect to the host via ssh.»,

«unreachable»: true

}

192.168.1.175 | SUCCESS | rc=0 >>

Linux srv-agent 3.13.0-32-generic #57~precise1-Ubuntu SMP Tue Jul 15 03:51:20 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux

,ага а вот на систему где стоит ось Ubuntu 12.04.5 Desktop amd64 публичный ключ я не скопировал, исправляюсь:

ekzorchik@srv-mon:~$ ssh-copy-id -i /home/ekzorchik/.ssh/id_rsa.pub ekzorchik@192.168.1.173

Теперь двигаюсь дальше с приведение примеров удаленного извлечения посредством Ansible различной информации с подконтрольных систем:

  • Вывести текущий IP адрес и Шлюз:

ekzorchik@srv-mon:~$ sudo ansible precise -m shell -a 'ip r'

192.168.1.175 | SUCCESS | rc=0 >>

default via 192.168.1.9 dev eth0 metric 100

192.168.1.0/24 dev eth0 proto kernel scope link src 192.168.1.175

, где:

  • shell — значит выполнить команду в консоли удаленного сервера
  • a — команда на удаленной системе
  • Вывести всю информацию по системам(е):

ekzorchik@srv-mon:~$ sudo ansible precise -m setup

192.168.1.175 | SUCCESS => {

«ansible_facts»: {

«ansible_all_ipv4_addresses»: [

«192.168.1.175»

],

«ansible_all_ipv6_addresses»: [

«fe80::a00:27ff:fea3:5d16»

],

«ansible_architecture»: «x86_64»,

«ansible_bios_date»: «12/01/2006»,

«ansible_bios_version»: «VirtualBox»,

«ansible_cmdline»: {

«BOOT_IMAGE»: «/vmlinuz-3.13.0-32-generic»,

«ro»: true,

«root»: «/dev/mapper/srv—agent—vg-root»

},

и т. д. Вывод обрезаю.

теперь попробую установить пакет на удаленной системе — увы неудача.

ekzorchik@srv-mon:~$ sudo ansible precise -m shell -a 'apt-get install htop'

192.168.1.175 | FAILED | rc=100 >>

E: Could not open lock file /var/lib/dpkg/lock — open (13: Permission denied)

E: Unable to lock the administration directory (/var/lib/dpkg/), are you root?

ekzorchik@srv-mon:~$ sudo nano /etc/ansible/hosts

[all:vars]

ansible_sudo_pass=712mbddr@

Вот так происходит установка приложения (,ключ -vvv -это для вывода на консоль делализированной информации для отладки полезно, в ниже следующих командах данную информацию я не привожу, т. к. в рамках данной заметки она избыточна)

ekzorchik@srv-mon:~$ sudo ansible precise -s -m shell -a 'apt-get install htop -y -qq' -vvv

Using /etc/ansible/ansible.cfg as config file

192.168.1.175 | SUCCESS | rc=0 >>

Selecting previously unselected package htop.

(Reading database … 52442 files and directories currently installed.)

Unpacking htop (from …/htop_1.0.1-1_amd64.deb) …

Processing triggers for man-db …

Setting up htop (1.0.1-1) …

Проверяю, а действительно ли пакет установлен был в системе:

ekzorchik@srv-mon:~$ sudo ansible precise -s -m shell -a 'dpkg -l | grep htop' -vvv

192.168.1.175 | SUCCESS | rc=0 >>

ii htop 1.0.1-1 interactive processes viewer

А чтобы удалить, к примеру пакет htop из системы:

ekzorchik@srv-mon:~$ sudo ansible precise -s -m shell -a 'apt-get remove htop -y -qq' -vvv

Using /etc/ansible/ansible.cfg as config file

192.168.1.175 | SUCCESS | rc=0 >>

(Reading database … 52452 files and directories currently installed.)

Removing htop …

Processing triggers for man-db …

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