Рассмотрим как выполняется установка Ansible на Centos 7 и разберем основы работы с Ansible.
Ansible ставится на машину, которая будет являться мастером, с неё будут отправляться команды. Их пакет будет выполнять подключаясь к нодам по ssh (про ssh авторизацию по ключу).
На клиентах, таким образом, нужен только системный пользователь и публичный ключ SSH, сгенерированный на мастере.
Ansible на Centos 7 — установка и начало работы
Пакет устанавливается из репозитория epel. Прежде всего, убедимся в том, что репозиторий подключен
yum repolist | grep epel
* epel: mirror.yandex.ru
epel/x86_64 Extra Packages for Enterprise Linux 7 — x86_64 12746
Список пакетов можно просмотреть выполнив rpm -qa, из него выборка делается grep
rpm -qa | grep ansible
Если пакета нет вывод будет пуст.
Установим ansible
yum install ansible
Complete!
Добавляем системного пользователя
useradd -d /home/admin -m ansadmin-s /bin/bash
Для него нужно задать достаточно сложный пароль
passwd ansadmin
Чтобы срок действия пароля был бесконечным можно сделать так
passwd -x 1 ansadmin
Adjusting aging data for user ansadmin.
passwd: Success
Переключаемся на этого пользователя
su - ansadmin
[ansadmin@master ~]$
ssh-keygen
Your identification has been saved in /home/admin/.ssh/id_rsa.
Your public key has been saved in /home/admin/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:S4KSP0a4dyEYFbo+8AiHno0E6d7iALD1jzDg5G+7zjI
На двух других машинах, которые будут нодами добавляет таким же образом пользователя ansadmin и задаем ему пароль.
Далее с Ansible мастера требуется скопировать содержимое ~/.ssh/id_rsa.pub и добавить его в /root/.ssh/authorized_keys на каждом сервере.
Возвращаемся к пользователю root и в /etc/ansible/hosts добавляем два блока, с перечисленными в каждом машинами
mcedit /etc/ansible/hosts
[app] 123.123.123.123 [db] 123.123.123.124
После этого можно проверить появилась ли связность.
ansible app -m shell -a 'hostname'
123.123.123.123 | CHANGED | rc=0 >>
test1
hosts и алиасы для Ansible
С именами работать проще, чем с IP адресами (особенно когда машин много), поэтому внесем коррективы в файл hosts.
Системный файл hosts редактируется с реквизитами суперпользователя
sudo mcedit /etc/hosts
123.123.123.123 node1 123.123.123.124 node2
Подключаться теперь можно так:
[ansadmin@master ~]$ ssh ansadmin@node1
Та же команда, что и ранее сейчас будет возвращать уже не адреса, а алиасы:
[ansadmin@vm-0edd2e51 ~]$ ansible app -m shell -a 'hostname'
node1 | CHANGED | rc=0 >>
test1
Первым аргументом можно указывать группу серверов, задаваемую в hosts пакета или all для всех машин.
[ansadmin@master ~]$ ansible all -m shell -a 'hostname'
node1 | CHANGED | rc=0 >>
test1
node2 | CHANGED | rc=0 >>
test2
Конфигурация Ansible
Основной конфигурационный файл пакета — /etc/ansible/ansible.cfg
В примере выше приводилась команда, которая отправляется на ноды с использованием модуля shell
Модулей множество, просмотреть список с кратким описанием можно так
ansible-doc -l | less
Ключ -s выведет информацию по тем командам, которые могут выполняться с использованием конкретного модуля
[ansadmin@master ~]$ ansible-doc -s shell
- name: Execute commands in nodes. shell: chdir: # cd into this directory before running the command creates: # ... executable: # ... free_form: # ... [...skipped...]
Эти аргументы не для всех модулей обязательны, но широко используются.
Самым простым модулем является ping
Ниже в команду добавлен ключ -o, благодаря которому вывод по каждой ноде происходит в одну строку.
[ansadmin@master ~]$ ansible all -m ping -o
node2 | SUCCESS => {"changed": false, "ping": "pong"}
node1 | SUCCESS => {"changed": false, "ping": "pong"}
shell практически используется очень часто. В частности для сбора информации о системе.
С ключом -v (verbose) в выводе дополнительно будет информация об используемом конфигурационном файле
ansible all -m shell -a 'uname -a; df -h' -v
Using /etc/ansible/ansible.cfg as config file
[…skipped…]
Выполнение команд на клиентах от имени суперпользователя
Чтобы устанавливать на нодах какие-то системные пакеты требуется добавить пользователя ansadmin в группу sudo
На обоих серверах редактируем /etc/sudoers
sudo visudo -f /etc/sudoers
#ANSIBLE ADMIN user
ansadmin ALL=NOPASSWD: ALL
Строки добавляются в конец файла.
Добавив ключ -s (суперпользователь) установим на машине, входящей в группу app веб-сервер httpd
ansible app -m yum -a 'name=httpd state=present' -s
Зайдя на сервере можно убедиться в том, что пакет появился
[root@test1 ~]# rpm -qa | grep httpd
httpd-tools-2.4.6-80.el7.centos.1.x86_64
httpd-2.4.6-80.el7.centos.1.x86_64
При этом веб-сервер не запущен
[root@test1 ~]# service httpd status
Redirecting to /bin/systemctl status httpd.service
● httpd.service — The Apache HTTP Server
[…skipped…]
Запустим его с master хоста
ansible app -m service -a 'name=httpd state=started' -s
Веб-сервер запустился и работает
[root@test1 ~]# service httpd status | grep active
Redirecting to /bin/systemctl status httpd.service
Active: active (running) since Wed 2018-11-07 18:06:18 UTC; 27s ago
Для копирования конфигурационных файлов можно использовать модуль copy
echo "test" > /tmp/test.txt
ansible all -m copy -a 'src=/tmp/test.txt dest=/tmp/newone.txt' -s
На обе ноды после выполнения команды был скопирован файл /tmp/test.txt, размещенный на мастер-хосте.
Читайте также про использование playbook в Ansible