Перейти к основному содержанию
`Ctrl`+`K`

# Развёртывание плагина и расширения с помощью 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"