Ansible установка klnagent — агент администрирования Kaspersky на CentOS 7

Ansible установка klnagent — агент администрирования Kaspersky на CentOS 7

Рассмотрим, каким образом может быть выполнена через Ansible установка klnagent — агента администрирования Kaspersky — на серверы с CentOS 7.

Окружение

Сервер №1: OS - Centos 7 x64. IP - 10.10.10.10 
Роль: Хранилище. 
Описание: Настроен Nginx который отдает файлы по http по порту 8099 с авторизацией
Сервер №2: OS - Centos 7 x64. IP - 10.10.10.20
Роль: Исполнитель. 
Описание: Сервер, на котором установлен ansible
Сервер №3: OS - Centos 7 x64. IP - 10.10.10.30
Роль: Целевой.
Описание: на данный сервер необходимо установить klnagent

Роль создана по типовой структуре. Более подробно описано в статье. Кроме того, некоторые переменные хранятся в зашифрованном виде. Как работать с секретами в ansible можно почитать тут.

В предложенной реализации возможно два варианта запуска playbook. Для всех хостов, описанных в файле hosts:

ansible-playbook service_install_klnagent_all_servers.yml --vault-password-file=/u01/ansible/secret --diff -vv 

Точечно выбирать хосты, на которые необходимо запустить роль. Если необходимо, чтобы установка запустилась на нескольких хостах, указываем их через запятую. Не забываем, что указанные хосты должны соответствовать именам в файле hosts и host_vars:

ansible-playbook service_install_klnagent_select_servers.yml -e "host=test01" --vault-password-file=/u01/ansible/secret --diff -vv

Переменные playbook Ansible для установки klnagent

На каком уровне определить переменные решать вам, в статье переменные в ansible можно почитать какие есть уровни и как они приоритизированы.

local_distr_repo_url — переменная, не имеющая отношения к установке Kaspersky. Хранит путь до репозитория с дистрибутивами. В моем случае был развернут nginx с возможностью авторизации по логину и паролю. Он умеет отдавать файлы из папки по протоколу http. Как разворачивался такой репозиторий, можно посмотреть перейдя по ссылке.

local_distr_repo_user — логин к локальному репозиторию. Хранится в зашифрованном виде.

 local_distr_repo_pass — пароль к локальному репозиторию. Хранится в зашифрованном виде.

metod_klnagent_param — переменная, от которой зависит выбор метода установки. Варианты: autonomous_package или custom_install. Что за что отвечает описано в блоке задачи.

klnagent_autonomous_package_name — используется, если metod_klnagent_param: «autonomous_package». Переменная указывает на путь от корня (если пакет лежит не в корне http сервера) и имя автономного пакета для установки. Автономный пакет должен быть загружен в репозиторий, который определен в переменной local_distr_repo_url.

Все переменные ниже используются в случае metod_klnagent_param: «custom_install»

klnagent_url — URL, с которого можно скачать rpm пакет агента администрирования. В данном случае скачиваем с официально сайта.

KLNAGENT_SERVER, KLNAGENT_PORT, KLNAGENT_SSLPORT, KLNAGENT_USESSL, KLNAGENT_GW_MODE, KLNAGENT_GW_MODE — переменные, необходимые для непосредственного развертывания агента администрирования. Более подробно описано в статье про ручное развертывание.

Обработчики

В playbook описано два обработчика: один на перезапуск, другой на перечитывание настроек. Честно говоря, не понимаю, какие настройки агент может перечитать, так как динамически они вроде бы нигде не меняются, но возможность есть — значит опишем, вдруг пригодится:

- name: reload klnagent  # перезагрузка агента администрирования
  service:
    name: "klnagent64"
    state: reloaded
- name: restart klnagent # перезапуск агента администрирования
  service:
    name: "klnagent64"
    state: restarted

Задачи playbook Ansible для установки klnagent

Задачи разделены на два блока. Первый запустится если metod_klnagent_param имеет значение autonomous_package; необходим для установки агента из автономного пакета. Второй метод используется для ручной установки. Сложно сказать какой способ лучше. Изначально я предполагал, что второй вариант в приоритете, так как первый не поддерживает идемпотентность и завершается ошибкой при повторном запуске задачи. Но позже выяснилось, что если повторно запускать установку агента на сервере с уже установленным, происходит создание новой сущности в KSC, которая находится в нераспределенных устройствах, а старая сущность перестает выходить на связь. В общем, выбор за вами.

- block:
 ...
  when: metod_klnagent == "autonomous_package"
- block:
  ...
  when: metod_klnagent == "custom_install"

Рассмотрим более подробно каждый из методов. Установка автономного пакета начинается с получения дистрибутива. Используется модуль ansible get_url. Он позволяют скачать файл по URL:

    - name: "Getting klnagent autonomous install package to temporary folder"
      get_url:
        url: "{{ local_distr_repo_url }}/{{ klnagent_autonomous_package_name }}"
        dest: "/tmp/{{ klnagent_autonomous_package_name }}"
        url_username: "{{ local_distr_repo_user }}"
        url_password: '{{ local_distr_repo_pass }}'
        mode: 0755
      tags: klnagent

Далее используем модуль shell для запуска sh скрипта автономного пакета:

    - name: "Running klnagent autonomous install"
      become: yes
      shell: "/tmp/{{ klnagent_autonomous_package_name }}"
      args:
        executable: /bin/bash 
      tags: klnagent

Следующий шаг — это запуск сервиса и добавление его в автозагрузку:

    - name: "Ensure klnagent service is enabled"
      become: yes
      service:
        name: klnagent64
        enabled: yes
        state: started
      tags: klnagent

И последнее — удаляем скачанный автономный пакет:

    - name: "Removing package file"
      file: 
        path: "/tmp/{{ klnagent_autonomous_package_name }}" 
        state: absent

Кстати, более подробно об модулях ansible можно почитать в официальной документации: https://docs.ansible.com/ansible/latest/collections/index.html.

Второй метод подразумевает установку агента с помощью файла настроек, также рассмотрим его; повторяющиеся модули описывать не буду.

Всё начинается с создания файла ответов с помощью модуля template. Переменные в шаблон подставляются из group_vars/all:

    - name: "Creating answer file for klnagent"
      become: yes
      template:
        src: klnagent.j2
        dest: /tmp/klnagent.ini
        mode: 0644
      tags: klnagent

Далее скачиваем RPM пакет с помощью модуля get_url. Параметр url немного отличается от того, который был использован в варианте с автономным пакетом (тут прямая ссылка на дистрибутив):

    - name: "Downloading rpm package"
      become: yes
      get_url:
        url: "{{ klnagent_url }}"
        dest: /tmp/{{ klnagent_url.split("/")[-1] }}
      tags: klnagent

После этого устанавливаем скачанный пакет с помощью модуля yum:

    - name: "Installing package"
      become: yes
      yum:
        name: /tmp/{{ klnagent_url.split("/")[-1] }}
        state: present
      tags: klnagent

Затем запускаем настройку агента администрирования согласно инструкции вендера:

    - name: "Run configuring klnagent"
      become: yes
      shell: "{{ default_klnagent_bin_path }}/setup/postinstall.pl"
      args:
        executable: /bin/bash 
      environment: 
        KLAUTOANSWERS: /tmp/klnagent.ini
      notify: restart klnagent
      tags: klnagent

Последним шагом запускаем сервис и добавляем его в автозагрузку. Напоследок удаляем скаченный rpm пакет:

    - name: "Ensure klnagent service is enabled"
      become: yes
      service:
        name: klnagent64
        enabled: yes
        state: started
      tags: klnagent
    - name: "Removing temporary files"
      file: 
        path: "{{ item }}" 
        state: absent
      with_items:
        - "/tmp/{{ klnagent_url.split(\"/\")[-1] }}"
        - "/tmp/klnagent.ini"

На этом Ansible установка klnagent завершена. Репозиторий с исходниками на github: https://github.com/ittxx/kaspersky.