Эффективное администрирование большого количества оборудования.

Эффективное администрирование большого количества оборудования.

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

Для эффективного администрирования большого количества оборудования существуют разные  системы управления конфигурациями. Наиболее широко известны и популярны Ansible, Chef, Puppet и SaltStack.

Наше предприятие РГП «Государственная техническая служба» (далее – ГТС) занимается сопровождением высоконагруженных информационных систем, для работоспособности и отказоустойчивости которых используется большое количество серверного и сетевого оборудования.

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

Установка Ansible.

Для начала давайте рассмотрим пример установки Ansible на операционную систему CentOS 7.  Процесс установки на версиях CentOS 6, 7 одинаков. На CentOS 8 используется менеджер пакетов DNF, но также можно пользоваться менежером пакетов YUM.
Ansible содержится в репозитории EPEL, и если пакет EPEL не установлен, требуется его установить:

[root@ansible ~]# yum install epel.release
После устанавливаем сам сервер Ansible:
[root@ansible ~]# yum install ansible

Схема реализации Ansible.

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

Ansible позволяет не только выполнять единичные задачи, но и писать сценарии (playbooks), которые необходимо выполнить на управляемых серверах. Все сценарии в Ansible пишутся на языке YAML.

Начальная настройка и некоторые примеры.

В файл «hosts», который находится по пути /etc/ansible прописывается группа хостов, на которые будет произведена установка веб-сервера Nginx. В статье в качестве примера будут использованы 3 сервера с IP-адресами от 192.168.1.5 до 192.168.1.7:

[srv]
192.168.1.[5:7]   ansible_ssh_user=ansible    ansible_ssh_pass=password     ansible_sudo_pass=password

После редактирования файла «hosts» можно выполнить проверку доступности серверов группы srv:

ansible -m ping srv

Результат выполнения модуля ping:

192.168.1.5 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    },
    "changed": false,
    "ping": "pong"
}
192.168.1.6 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    },
    "changed": false,
    "ping": "pong"
}
192.168.1.7 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    },
    "changed": false,
    "ping": "pong"
}

Для выполнения более сложных задач нужно написать playbook (плэйбук), т.е. сценарий выполнения,  на языке YAML. Playbook рекомендуется хранить в определенной директории для их быстрого выполнения, например /etc/ansible/playbooks. Начинающие администраторы должны быть внимательны при написании playbook.  Код playbook должен начинаться с трех символов тире “---” и не должен содержать лишних пробелов. Например, playbook по установке, конфигурации и запуска Nginx имеет следующий вид:

---
- hosts: srv
  sudo: yes
  tasks:
  - name: install nginx
    yum:
       name: nginx
       state: latest

  - name: copy nginx.conf  to server
    copy:
     src: /etc/ansible/nginx.conf
     dest: /etc/nginx

- name: copy index.html to server
    copy:
     src: /etc/ansible/index.php
     dest: /var/www/html

- name: start nginx
    service:
     name: nginx
     state: started

В данном playbook на сервера группы srv (из файла hosts) выполнится сценарий из четырёх действий (tasks) – это установка Nginx», копирование уже сконфигурированного файла «nginx.conf» и «index.php» на сервера и запуск Nginx». Результат выполнения playbook:

PLAY [srv] ***************************************************************

 

 

PLAY RECAP **************************************************************

 

192.168.1.5               : ok=5    changed=1 unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

 

192.168.1.6               : ok=5    changed=1 unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

 

192.168.1.7               : ok=5    changed=1 unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

 

PLAY [srv] ***************************************************************

PLAY RECAP **************************************************************
192.168.1.5               : ok=5    changed=1 unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
192.168.1.6               : ok=5    changed=1 unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
192.168.1.7               : ok=5    changed=1 unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

Результат «ok=5» информирует о том, что на серверах успешно выполнены 5 действий и «changed=1» сообщает, что произошло одно изменение – запуск Nginx.

Также с помощью Ansible можно проверить, что сервис nginx запущен и возвращает страницу:
[root@ansible ~]# ansible srv -m command -a "wget http://localhost"
В результате мы получим ответ:
HTTP request sent, awaiting response... 200 OK

Давайте рассмотрим пример архивирования конфигурационного файла Nginx:

---
- name: archive nginx.conf
  hosts: localhost
  sudo: yes
  tasks:
   - name: archive nginx.conf
     archive:
       path: /etc/nginx/nginx.conf
       dest: /home/admin/backup/nginx.conf.tgz

Результат выполнения playbook:

PLAY [archive nginx.conf] ************************************************

PLAY RECAP ************************************************
192.168.35.95              : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

В данном примере playbook архивирует сжатием файл «/etc/nginx/nginx.conf «в файл /home/admin/backup//nginx.conf.tgz.

Часто возникают случаи, когда необходимо настроить мониторинг серверов в системе мониторинга Zabbix, для чего на указанной группе серверов необходимо установить агентов Zabbix. Допустим, что агенты уже установлены. Теперь следует на агентах настроить корректный адрес сервера мониторинга. Пример замены IP-адреса 127.0.01 на 192.168.1.100 в конфигурационном файле «zabbix-agentd.conf» с помощью Ansible будет следующим:

---
- name: Change ip adress
  hosts: srv
  sudo: yes
  tasks:
  - name: change ip adress server
    lineinfile:
      path: /etc/zabbix/zabbix_agentd.conf
      regexp: 'Server=127.0.0.1'
      line: "Server=192.168.1.100
      backrefs: yes

Результат выполнения playbook:

PLAY [Change ip adress] *********************************


PLAY RECAP ***************************************************
192.168.1.5              : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
192.168.1.6              : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
192.168.1.7             : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

Обеспечение информационной безопасности на сервере «Ansible»

Внедрение Ansible требует соблюдения мер информационной безопасности, так как сервер Ansible имеет ssh-доступ к промышленным серверам. Несанкционированный доступ к серверу Ansible влечет за собой риск подвергнуться хакерской атаке. Для защиты доступа  к серверу Ansible необходимо выполнить как минимум базовые меры информационной безопасности:
•    Сервер «Ansible» должен находиться в защищенном и ограниченном от доступа посторонних лиц, сетевом сегменте.
•    учетные записи на сервере Ansible должны иметь только администраторы;
•    Межсетевой экран операционной системы оборудования, на котором сервер Ansible должен быть корректно настроен. Доступ по протоколу SSH должен быть только с рабочих станций администраторов. Пример конфигурации межсетевого экрана на сервере Ansible с ОС СentOS 7 и 8:

firewall-cmd –permanent --zone=dmz --add-rich-rule='rule family="ipv4" source address="ip-adress администратора" port port="22" protocol="tcp" accept'

•    SELinux должен быть в режиме «Enforcing».
•    Рекомендуется настроить отправку логов Ansible по протоколу syslog в центр обеспечения безопасности для мониторига событий.

Заключение.

В последние годы идет тенденция в сторону автоматизации процессов внедрения и администрирования информационных систем. Ansible является наглядным примером того как можно эффективно администрировать большое количество оборудования.
Мы рассмотрели базовые вещи, связанные с Ansible. Более подробно можно ознакомиться с документацией  Ansible по адресу https://docs.ansible.com