На протяжении долгого времени обслуживаемые сервера увеличивались и мне нужен был инструмент посредством которого я смогу следить на ними всеми, своевременно проводить обновления, массовую настройку систем со схожим функционалом, мониторить их — я же раньше все это проделывал вручную, либо писал простенькие в моем понимание скрипты для автомазиции, а они обычно устареваю (только знания bash скриптинга прокачиваю) но так дело не может продолжаться — Ubuntu — это ведь хороший конструктор. Вот и сейчас мой выбор пал из всего того, я опробовал в своих лабораторных условиях из централизованного/единого/удобного места управления на приложение Ansible. Привлекло меня тем, что на удаленные узлы не нужно ставить какие-либо агенты (а это немаловажный для меня фактор), управление же идет через удаленное безопасное соединение кой сервер имеет место быть задействован, именуемое как SSH.
Я хотел получить с помощью Ansible следующий функционал:
- Управляющий сервер
- Управление одним узлом или несколькими
- Установка пакетов
- Настройка узла(ов) согласно сценарию (т. е. Поднимаю LAMP,Fileserver,ZoneMinder,GLPI)
- Логирование за действиями на удаленных узлах
Напомню, что все дальнейшие действия я буду рассматривать только для систем Ubuntu — другие я не использую, да и не хочу использовать. Считаю что лучше быть специалистом в чем-то одном, а не во всем по не многу.
Используемая система: Ubuntu 12.04.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.