Развёртывание плагина и расширения с помощью Ansible на Alt Linux

Развёртывание плагина и расширения с помощью Ansible на Alt Linux#

Структура репозитория#

.
├── inventory
├── deploy-gs3.yml
└── files/
    ├── globalerp-desktop-agent-<VERSION>-alt1.x86_64.rpm
    └── Global System Browser Extension <VERSION>.crx

Описание файлов:

inventory - файл инвентаризации, содержащий список хостов для установки GS3

deploy-gs3.yml - основной плейбук, выполняющий полный цикл установки GS3

globalerp-desktop-agent-<VERSION>-alt1.x86_64.rpm - пакет GS3 плагина для ALT Linux

Global System Browser Extension <VERSION>.crx - локальный CRX-файл расширения браузера GS3

Пример inventory#

[browser_hosts]
alt10 ansible_host=<ip_address>
alt11 ansible_host=<ip_address>

[browser_hosts:vars]
ansible_user=<user>
ansible_ssh_pass=<password>
ansible_become=true
ansible_become_method=sudo
ansible_become_pass=<password>

где <ip_address> - IP-адрес хоста, на который идет установка, <user> - имя пользователя, <password> - пароль

Плейбук deploy-gs3.yml#

- name: Install GS3 plugin, deploy browser extensions and Chrome native messaging
  hosts: browser_hosts
  become: true

  vars:
    mode: "mixed"   # Значение по умолчанию, но можно переопределить через -e mode=xxx
    extension_id: "ngfgcgjklkfnbpandhelhehghbfbebai"  # По умолчанию, можно переопределить через -e extension_id=...

    gs3_rpm_src: "files/globalerp-desktop-agent-0.19.6-alt1.x86_64.rpm"
    gs3_rpm_dest: "/tmp/globalerp-desktop-agent-0.19.6-alt1.x86_64.rpm"

    extension_crx_src: "files/Global_20System_20Browser_20Extension_200.19.5.0.crx"
    extension_dir: "/opt/gs3-extension"
    extension_crx_dest: "{{ extension_dir }}/gs3-extension.crx"
    extension_update_xml: "{{ extension_dir }}/update.xml"

    chromium_nm_dir: "/etc/chromium/native-messaging-hosts"
    chrome_nm_dir: "/etc/opt/chrome/native-messaging-hosts"

  tasks:
    - name: Copy GS3 plugin RPM
      ansible.builtin.copy:
        src: "{{ gs3_rpm_src }}"
        dest: "{{ gs3_rpm_dest }}"
        mode: "0644"

    - name: Install GS3 plugin from RPM
      ansible.builtin.command: "apt-get -y install {{ gs3_rpm_dest }}"
      args:
        chdir: "/tmp"

    - name: Ensure GS3 extension directory exists
      ansible.builtin.file:
        path: "{{ extension_dir }}"
        state: directory
        mode: "0755"

    - name: Upload GS3 extension CRX
      ansible.builtin.copy:
        src: "{{ extension_crx_src }}"
        dest: "{{ extension_crx_dest }}"
        mode: "0644"

    - name: Generate update.xml
      ansible.builtin.copy:
        dest: "{{ extension_update_xml }}"
        mode: "0644"
        content: |
          <?xml version="1.0" encoding="UTF-8"?>
          <gupdate xmlns="http://www.google.com/update2/response" protocol="2.0">
            <app appid="{{ extension_id }}">
              <updatecheck codebase="file://{{ extension_crx_dest }}" version="0.19.5.0" />
            </app>
          </gupdate>

    - name: Create Yandex policies dir
      ansible.builtin.file:
        path: /etc/opt/yandex/browser/policies/managed
        state: directory
        mode: "0755"

    - name: Deploy Yandex GS3 policy
      ansible.builtin.copy:
        dest: /etc/opt/yandex/browser/policies/managed/gs3-extension.json
        mode: "0644"
        content: |
          {
            "ExtensionInstallForcelist": [
              "{{ extension_id }};file://{{ extension_update_xml }}"
            ]
          }

    - name: Create Chromium policies dir
      ansible.builtin.file:
        path: /etc/chromium/policies/managed
        state: directory
        mode: "0755"

    - name: Deploy Chromium GS3 policy
      ansible.builtin.copy:
        dest: /etc/chromium/policies/managed/gs3-extension.json
        mode: "0644"
        content: |
          {
            "ExtensionInstallForcelist": [
              {% if mode == "mixed" %}
                "{{ extension_id }}"
              {% else %}
                "{{ extension_id }};file://{{ extension_update_xml }}"
              {% endif %}
            ]
          }

    - name: Create Chrome policies directory
      ansible.builtin.file:
        path: /etc/opt/chrome/policies/managed
        state: directory
        mode: "0755"

    - name: Deploy Chrome GS3 policy
      ansible.builtin.copy:
        dest: /etc/opt/chrome/policies/managed/gs3-extension.json
        mode: "0644"
        content: |
          {
            "ExtensionInstallForcelist": [
              {% if mode == "mixed" %}
                "{{ extension_id }}"
              {% else %}
                "{{ extension_id }};file://{{ extension_update_xml }}"
              {% endif %}
            ]
          }

    - name: Ensure Chrome NM dir exists
      ansible.builtin.file:
        path: "{{ chrome_nm_dir }}"
        state: directory
        mode: "0755"

    - name: Find GS3 manifests in Chromium
      ansible.builtin.find:
        paths: "{{ chromium_nm_dir }}"
        patterns: "ru.global_system.gl3.plugin*.json"
        file_type: file
      register: manifests

    - name: Copy manifests to Chrome
      ansible.builtin.copy:
        src: "{{ item.path }}"
        dest: "{{ chrome_nm_dir }}/{{ item.path | basename }}"
        owner: root
        group: root
        mode: "0644"
        remote_src: yes
      loop: "{{ manifests.files }}"
      when: manifests.matched > 0

Режимы работ#

Плейбук поддерживает два режима установки браузерного расширения. В первом режиме - crx - установка выполняется из локального файла расширения в формате CRX. Этот вариант используется, когда расширение хранится в репозитории или доступно на сервере без обращения к интернет-магазину.

Во втором режиме - store - расширение устанавливается из официального магазина браузера по указанному идентификатору (extension_id). Этот способ подходит для случаев, когда расширение опубликовано и доступно для загрузки онлайн.

Запуск#

Для установки из локального CRX‑файла используйте команду:

ansible-playbook -i inventory deploy-gs3.yml -e "mode=crx"

Для установки из магазина браузера выполните:

ansible-playbook -i inventory deploy-gs3.yml -e "mode=store"

По умолчанию используется встроенный идентификатор расширения (extension_id), однако при необходимости вы можете указать свой:

ansible-playbook -i inventory deploy-gs3.yml -e "mode=store extension_id=XXXXX"