Создание шаблона приложения Marketplace
Marketplace предоставляет возможность развёртывания сред веб-разработки и администрирования на базе шаблонов виртуальных машин, которые уже содержат предустановленное программное обеспечение. В магазине приложений по умолчанию доступно приложение MiniO S3. Для добавления других приложений в магазин необходимо создать соответствующие шаблоны.
Чтобы создать шаблон приложения:
- Выполните подготовительные операции (только при создании первого приложения, см. раздел Шаг 1. Подготовка).
- Создайте новую директорию с шаблоном приложения (см. раздел Шаг 2. Создание новой директории с шаблоном приложения).
- Создайте структуру шаблона приложения (см. раздел Шаг 3. Создание структуры шаблона приложения).
- Добавьте конфигурацию для отображения приложения на Портале самообслуживания в файл
configuration.json(см. раздел Шаг 4. Добавление конфигурации в configuration.json). - Выгрузите созданное приложение в объектное хранилище и установите разрешения для доступа на чтение (см. раздел Шаг 5. Выгрузка созданного приложения в объектное хранилище и установка разрешения для доступа на чтение).
Далее приведено подробное описание каждого из приведенных выше шагов на примере создания шаблона приложения GitLab CE.
Определите адрес объектного хранилища:
-
Войдите на управляющий узел по SSH.
-
Выполните команду:
grep -ri -5 marketplace_templates /etc/nginx/conf.d/public_mcs.conf | grep proxy_pass -
Перейдите на узел с установленным AWS CLI (наличие проверяется командой
aws --version— должно появиться сообщение видаaws-cli/2.7.24 Python/3.8.8 Linux/4.14.133-113.105.amzn2.x86_64 botocore/1.13). -
Убедитесь, что текущий пользователь видит бакет с приложениями Marketplace, выполнив команду:
aws s3 ls --recursive --endpoint-url <ENDPOINT_URL> s3://<MARKETPLACE_FOLDER_PATH>/
-
Войдите на управляющий узел по SSH.
-
Найдите директорию
marketplace_templatesс помощью поиска и перейдите в неё. Если такой директории не существует, создайте её в/var/lib/marketplace. -
Создайте директорию с новым шаблоном приложения:
mkdir -p /var/lib/marketplace/marketplace_templates/<название приложения>/0.1.0
Типовая структура шаблона приложения должна включать в себя следующие файлы и директории:
-
Обязательные файлы:
metadata.yml— файл с метаданными приложения.stack.yml— файл в формате Heat Orchestration Template (HOT) с манифестом по установке приложения.logo.svg— логотип приложения в векторном формате.HOWTO.md— инструкция, которая отображается пользователю после установки приложения. Поддерживает формат Markdown и шаблонизацию переменных в виде Lodash template.
-
Необязательные файлы и директории:
- Директория
ansibleсо списком ролей, которые будут применяться во время установки приложения. - Дополнительные YML-файлы, которые требуются для установки multi-node приложений.
- Директория
Далее приведен пример структуры шаблона приложения GitLab CE.
Параметры файла metadata.yml приведены ниже в таблице 1.
Название | Описание |
|---|---|
id | Уникальный идентификатор приложения |
title | Название приложения (короткое) |
bundle_version | Версия комплекта (бандла) |
description_short | Короткое описание приложения для отображения в списке карточек |
description_long | Длинное описание приложения. Отображается в верхней части мастера установки |
application_version_string | Строковое описание версии приложения |
application_version | Структура, описывающая версию приложения или его компонент |
ssh_access_mode | Предоставление доступа по SSH. Возможные значения:
|
external_url | URL сайта вендора |
mcs_marketplace_mark | Признак Marketplace. Всегда |
requires_external_licensing | Используется ли внешний сервер лицензий. Возможные значения: |
tags | Массив тегов. Обязательно указание хотя бы одного тега |
Содержимое файла metadata.yml приведено в листинге ниже.
id: gitlabtitle: GitLab CEbundle_version: 0.1.0description_short: Система управления репозиториями кода для Git и CI/CD серверdescription_long: Система управления репозиториями кода для Git с функциями CI/CD-сервера и Docker Registry на базе GitLab.application_version_string: 13.1application_version:gitlab_version: 13.1ssh_access_mode: FULLexternal_url: https://gitlab.com/mcs_marketplace_mark: truerequires_external_licensing: falsetags:- dev_tools- ci_cd
Параметры файла stack.yml приведены ниже в таблице 2.
Название | Описание |
|---|---|
Системные параметры секции | |
instance_type | Тип ВМ (Flavor) |
availability_zone | Зона доступности |
volume_size | Размер root-диска |
volume_type | Тип root-диска |
network_id | Имя приватной сети |
sub_network_id | Имя подсети приватной сети |
security_group_name | Название группы безопасности |
key_name | SSH-ключ для входа под root/ограниченным пользователем |
Пример дополнительных параметров секции | |
admin_user_name | Имя администратора (не email-адрес) |
admin_user_email | Email-адрес администратора |
admin_user_password | Пароль администратора |
application_domain_name | Название домена, на который будет разворачиваться приложение |
Выходные параметры секции | |
Определяются Спецификацией формата Шаблона оркестрации для HEAT (HOT). В UI не отображаются следующие параметры:
UI скрывает по умолчанию значение параметров с суффиксом | |
Содержимое файла stack.yml приведено в листинге ниже.
heat_template_version: 2015-04-30description: Gitlab CE 13.1parameters:key_name:type: stringconstraints:- custom_constraint: nova.keypairinstance_type:type: stringdefault: Standard-2-4-50network_id:type: stringdefault: int-net1volume_type:type: stringdefault: ssdvolume_size:type: numberdefault: 20availability_zone:type: stringimage_id:type: stringdefault: Ubuntu-22.04-Marketplace-Basicgitlab_version:type: stringhidden: truedefault: 13.1ansible_role_url:type: stringhidden: trueresources:external_access:type: OS::Neutron::SecurityGroupproperties:rules:- protocol: tcpport_range_min: 443port_range_max: 443- protocol: tcpport_range_min: 22port_range_max: 22gitlab_password:type: OS::Heat::RandomStringproperties:length: 16sequence: lettersdigitsinstance_port:type: OS::Neutron::Portproperties:network_id: { get_param: network_id }security_groups:- { get_resource: external_access }- "default"instance_fip:type: OS::Neutron::FloatingIPproperties:floating_network: ext-netport_id: { get_resource: instance_port }instance_volume:type: OS::Cinder::Volumeproperties:availability_zone: { get_param: availability_zone }image: { get_param: image_id }size: { get_param: volume_size }volume_type: { get_param: volume_type }instance:type: OS::Nova::Serverproperties:flavor: { get_param: instance_type }availability_zone: { get_param: availability_zone }block_device_mapping:- device_name: vdavolume_id: { get_resource: instance_volume }delete_on_termination: "true"key_name: { get_param: key_name }networks:- port: { get_resource: instance_port }software_config_transport: POLL_SERVER_HEATuser_data_format: SOFTWARE_CONFIGinstance_config:type: OS::Heat::SoftwareConfigproperties:group: ansibleinputs:- name: ansible_roles_url- name: gitlab_password- name: gitlab_version- name: instance_fipconfig: |- name: Install and configureconnection: localhosts: localhosttasks:- unarchive:src: "{{ ansible_roles_url }}"dest: /etc/ansible/remote_src: yes- include_role:name: gitlab-cevars:gitlab_password: "{{ gitlab_password }}"gitlab_version: "{{ gitlab_version }}"instance_fip: "{{ instance_fip }}"- include_role:name: enable_apt_dailyinstance_deployment:depends_on: instance_fiptype: OS::Heat::SoftwareDeploymentproperties:signal_transport: HEAT_SIGNALconfig:get_resource: instance_configserver:get_resource: instanceinput_values:ansible_roles_url: { get_param: ansible_role_url }gitlab_password: {get_resource: gitlab_password}gitlab_version: {get_param: gitlab_version}instance_fip:get_attr: [instance_fip, floating_ip_address]actions:- CREATEoutputs:instance_url:description: URL Gitlab CEvalue:str_replace:template: https://host/params:host:get_attr: [instance_fip, floating_ip_address]gitlab_user:description: Имя пользователяvalue: "root"gitlab_password:description: Пароль пользователя (сменить при первом входе)value: {get_resource: gitlab_password}ansible_stdout:description: Ansible execution standard outputvalue:get_attr: [instance_deployment, deploy_stdout]ansible_stderr:description: Ansible execution standard errorvalue:get_attr: [instance_deployment, deploy_stderr]ansible_status_code:description: Ansible execution status codevalue:get_attr: [instance_deployment, deploy_status_code]
<svg width="210" height="210" viewBox="0 0 210 210" xmlns="http://www.w3.org/2000/svg"><path d="M105.0614 203.655l38.64-118.921h-77.28l38.64 118.921z" fill="#e24329"/><path d="M105.0614 203.6548l-38.64-118.921h-54.153l92.793 118.921z" fill="#fc6d26"/><path d="M12.2685 84.7341l-11.742 36.139c-1.071 3.296.102 6.907 2.906 8.944l101.629 73.838-92.793-118.921z" fill="#fca326"/><path d="M12.2685 84.7342h54.153l-23.273-71.625c-1.197-3.686-6.411-3.685-7.608 0l-23.272 71.625z" fill="#e24329"/><path d="M105.0614 203.6548l38.64-118.921h54.153l-92.793 118.921z" fill="#fc6d26"/><path d="M197.8544 84.7341l11.742 36.139c1.071 3.296-.102 6.907-2.906 8.944l-101.629 73.838 92.793-118.921z" fill="#fca326"/><path d="M197.8544 84.7342h-54.153l23.273-71.625c1.197-3.686 6.411-3.685 7.608 0l23.272 71.625z" fill="#e24329"/></svg>
Файл HOWTO.md отображается пользователю на завершающем этапе установки приложения. Поддерживает формат Markdown и шаблонизацию переменных в виде Lodash template: допускается использовать переменные из полей metadata и outputs. Например, Введите логин ${outputs.registry_user} и пароль ${outputs.registry_password}.
# Быстрый старт1. Используя логин и пароль, полученный на этапе установки, зайдите по адресу GitLab-сервера.2. Для расширенной конфигурации GitLab используйте [официальную документацию](https://docs.gitlab.com/ee/user/index.html)# Администрирование1. [Настройка GitLab как Docker container registy](https://docs.gitlab.com/ce/administration/container_registry.html#container-registry-domain-configuration)2. [Конфигурация SMTP для исходящих email-сообщений](https://docs.gitlab.com/omnibus/settings/smtp.html)3. [Изменение DNS-имени GitLab-сервера](https://docs.gitlab.com/omnibus/settings/configuration.html#configuring-the-external-url-for-gitlab)4. [Запуск и остановка сервисов](https://docs.gitlab.com/omnibus/maintenance/README.html#starting-and-stopping)5. [Управление созданием и восстановлением резервных копий](https://docs.gitlab.com/omnibus/settings/backups.html)6. [Обновление GitLab CE](https://docs.gitlab.com/omnibus/update/README.html#updating-using-the-official-repositories)
Предполагаемая процедура установки приложений с помощью Ansible:
- Создание всех необходимых ресурсов (виртуальных машин, сетей, групп безопасности и др.) с помощью Heat.
- Запуск роли Ansible внутри созданных виртуальных машин.
- Возвращение результатов работы Ansible в output-параметры Heat-стека.
Далее приведено содержимое файлов с указанием пути к ним.
- name: Enable apt dailysystemd:name: "{{ item }}"enabled: yesloop:- apt-daily.service- apt-daily.timer- apt-daily-upgrade.service- apt-daily-upgrade.timer
# General config.gitlab_external_url: "https://gitlab.com/"gitlab_git_data_dir: "/var/opt/gitlab/git-data"gitlab_edition: "gitlab-ce"gitlab_version: ''gitlab_backup_path: "/var/opt/gitlab/backups"gitlab_config_template: "gitlab.rb.j2"# SSL Configuration.gitlab_redirect_http_to_https: "true"gitlab_ssl_certificate: "/etc/gitlab/ssl/gitlab.crt"gitlab_ssl_certificate_key: "/etc/gitlab/ssl/gitlab.key"# SSL Self-signed Certificate Configuration.gitlab_self_signed_cert_subj: "/CN=gitlab"# LDAP Configuration.gitlab_ldap_enabled: "false"gitlab_ldap_host: "example.com"gitlab_ldap_port: "389"gitlab_ldap_uid: "sAMAccountName"gitlab_ldap_method: "plain"gitlab_ldap_bind_dn: "CN=Username,CN=Users,DC=example,DC=com"gitlab_ldap_password: "password"gitlab_ldap_base: "DC=example,DC=com"# SMTP Configurationgitlab_smtp_enable: "false"gitlab_smtp_address: "smtp.server"gitlab_smtp_port: "465"gitlab_smtp_user_name: "smtp user"gitlab_smtp_password: "smtp password"gitlab_smtp_domain: "example.com"gitlab_smtp_authentication: "login"gitlab_smtp_enable_starttls_auto: "true"gitlab_smtp_tls: "false"gitlab_smtp_openssl_verify_mode: "none"gitlab_smtp_ca_path: "/etc/ssl/certs"gitlab_smtp_ca_file: "/etc/ssl/certs/ca-certificates.crt"# 2-way SSL Client Authentication support.gitlab_nginx_ssl_verify_client: ""gitlab_nginx_ssl_client_certificate: ""# Probably best to leave this as the default, unless doing testing.gitlab_restart_handler_failed_when: 'gitlab_restart.rc != 0'# Optional settings.gitlab_time_zone: "UTC"gitlab_backup_keep_time: "604800"gitlab_download_validate_certs: truegitlab_default_theme: '2'# Email configuration.gitlab_email_enabled: "false"gitlab_email_from: "gitlab@example.com"gitlab_email_display_name: "Gitlab"gitlab_email_reply_to: "gitlab@example.com"
- name: restart gitlabcommand: gitlab-ctl reconfigureregister: gitlab_restartfailed_when: gitlab_restart_handler_failed_when
- name: Check if GitLab configuration file already exists.stat: path=/etc/gitlab/gitlab.rbregister: gitlab_config_file- name: Check if GitLab is already installed.stat: path=/usr/bin/gitlab-ctlregister: gitlab_file# Install GitLab and its dependencies.- name: Install GitLab dependencies.apt:name:- postfixstate: presentupdate_cache: yes- name: Download GitLab repository installation script.get_url:url: "https://packages.gitlab.com/install/repositories/gitlab/{{ gitlab_edition }}/script.deb.sh"dest: /tmp/gitlab_install_repository.shwhen: (gitlab_file.stat.exists == false)- name: Install GitLab repositorycommand: bash /tmp/gitlab_install_repository.shwhen: (gitlab_file.stat.exists == false)- name: Define the Gitlab package name.set_fact:gitlab_package_name: "{{ gitlab_edition }}={{ gitlab_version }}"when: gitlab_version != ''- name: Install GitLabpackage:name: "gitlab-ce={{ gitlab_version }}"state: presentwhen: (gitlab_file.stat.exists == false)- name: Copy GitLab configuration file.template:src: "{{ gitlab_config_template }}"dest: /etc/gitlab/gitlab.rbowner: rootgroup: rootmode: 0600notify: restart gitlab- name: Create GitLab SSL configuration folder.file:path: /etc/gitlab/sslstate: directoryowner: rootgroup: rootmode: 0700notify: restart gitlab- name: Create self-signed certificate.command: >openssl req -new -nodes -x509 -subj "{{ gitlab_self_signed_cert_subj }}"-days 3650 -keyout {{ gitlab_ssl_certificate_key }} -out {{ gitlab_ssl_certificate }} -extensions v3_cacreates={{ gitlab_ssl_certificate }}notify: restart gitlab
# The URL through which GitLab will be accessed.external_url "https://{{ instance_fip }}/"# gitlab.yml configurationgitlab_rails['initial_root_password'] = "{{ gitlab_password }}"gitlab_rails['time_zone'] = "{{ gitlab_time_zone }}"gitlab_rails['backup_keep_time'] = {{ gitlab_backup_keep_time }}gitlab_rails['gitlab_email_enabled'] = {{ gitlab_email_enabled }}{% if gitlab_email_enabled == "true" %}gitlab_rails['gitlab_email_from'] = "{{ gitlab_email_from }}"gitlab_rails['gitlab_email_display_name'] = "{{ gitlab_email_display_name }}"gitlab_rails['gitlab_email_reply_to'] = "{{ gitlab_email_reply_to }}"{% endif %}# Default Themegitlab_rails['gitlab_default_theme'] = "{{ gitlab_default_theme }}"# Whether to redirect http to https.nginx['redirect_http_to_https'] = {{ gitlab_redirect_http_to_https }}nginx['ssl_certificate'] = "{{ gitlab_ssl_certificate }}"nginx['ssl_certificate_key'] = "{{ gitlab_ssl_certificate_key }}"# The directory where Git repositories will be stored.git_data_dirs({"default" => {"path" => "{{ gitlab_git_data_dir }}"} })# The directory where Gitlab backups will be storedgitlab_rails['backup_path'] = "{{ gitlab_backup_path }}"# These settings are documented in more detail at# https://gitlab.com/gitlab-org/gitlab-ce/blob/master/config/gitlab.yml.example#L118gitlab_rails['ldap_enabled'] = {{ gitlab_ldap_enabled }}gitlab_rails['ldap_host'] = '{{ gitlab_ldap_host }}'gitlab_rails['ldap_port'] = {{ gitlab_ldap_port }}gitlab_rails['ldap_uid'] = '{{ gitlab_ldap_uid }}'gitlab_rails['ldap_method'] = '{{ gitlab_ldap_method}}' # 'ssl' or 'plain'gitlab_rails['ldap_bind_dn'] = '{{ gitlab_ldap_bind_dn }}'gitlab_rails['ldap_password'] = '{{ gitlab_ldap_password }}'gitlab_rails['ldap_allow_username_or_email_login'] = truegitlab_rails['ldap_base'] = '{{ gitlab_ldap_base }}'# GitLab Nginx## See https://gitlab.com/gitlab-org/omnibus-gitlab/blob/master/doc/settings/nginx.md{% if gitlab_nginx_listen_port is defined %}nginx['listen_port'] = "{{ gitlab_nginx_listen_port }}"{% endif %}{% if gitlab_nginx_listen_https is defined %}nginx['listen_https'] = {{ gitlab_nginx_listen_https }}{% endif %}# Use smtp instead of sendmail/postfix# More details and example configuration at# https://gitlab.com/gitlab-org/omnibus-gitlab/blob/master/doc/settings/smtp.mdgitlab_rails['smtp_enable'] = {{ gitlab_smtp_enable }}gitlab_rails['smtp_address'] = '{{ gitlab_smtp_address }}'gitlab_rails['smtp_port'] = {{ gitlab_smtp_port }}gitlab_rails['smtp_user_name'] = '{{ gitlab_smtp_user_name }}'gitlab_rails['smtp_password'] = '{{ gitlab_smtp_password }}'gitlab_rails['smtp_domain'] = '{{ gitlab_smtp_domain }}'gitlab_rails['smtp_authentication'] = '{{ gitlab_smtp_authentication }}'gitlab_rails['smtp_enable_starttls_auto'] = {{ gitlab_smtp_enable_starttls_auto }}gitlab_rails['smtp_tls'] = {{ gitlab_smtp_tls }}gitlab_rails['smtp_openssl_verify_mode'] = '{{ gitlab_smtp_openssl_verify_mode }}'gitlab_rails['smtp_ca_path'] = '{{ gitlab_smtp_ca_path }}'gitlab_rails['smtp_ca_file'] = '{{ gitlab_smtp_ca_file }}'# 2-way SSL Client Authentication.{% if gitlab_nginx_ssl_verify_client %}nginx['ssl_verify_client'] = "{{ gitlab_nginx_ssl_verify_client }}"{% endif %}{% if gitlab_nginx_ssl_client_certificate %}nginx['ssl_client_certificate'] = "{{ gitlab_nginx_ssl_client_certificate }}"{% endif %}# To change other settings, see:# https://gitlab.com/gitlab-org/omnibus-gitlab/blob/master/README.md#changing-gitlab-yml-settings
Файл configuration.json определяет позиции каталога приложений в Marketplace.
Чтобы добавить конфигурацию для создаваемого приложения:
-
Скачайте файл конфигурации
configuration.jsonс сервера, выполнив команду:aws s3 cp --endpoint-url <ENDPOINT_URL> s3://<MARKETPLACE_FOLDER_PATH>/configurations.json ./ -
Добавьте в файл
marketplace/configuration.jsonконфигурацию из файлаmetadata.ymlв формате JSON с указанием параметраansible_role_url— URL ansible-роли. Если создается первое приложение, дополнительно «оберните» конфигурацию в квадратные скобки[].Пример заполнения файла configuration.json для GitLab CE[{"bundle_version": "0.1.0","ansible_role_url": "https://<адрес хоста>/marketplace_templates/gitlab_ce/0.1.0/ansible_roles.tar.gz","title": "GitLab CE","description_short": "Система управления репозиториями кода для Git и CI/CD сервера","tags": ["dev_tools","ci_cd"],"id": "gitlab","description_long": "Система управления репозиториями кода для Git с функциями CI/CD-сервера и Docker Registry на базе GitLab.","requires_external_licensing": false,"template_folder": "gitlab_ce","application_version_string": 13.1,"ssh_access_mode": "FULL","application_version": {"gitlab_version": 13.1},"external_url": "https://gitlab.com/"}] -
Выгрузите обновлённый файл
configuration.jsonв объектное хранилище:aws s3 cp --recursive --endpoint-url <ENDPOINT_URL> <ПУТЬ_ДО_ФАЙЛА_КОНФИГУРАЦИИ> s3://<MARKETPLACE_FOLDER_PATH>/configurations.json
Шаг 5. Выгрузка созданного приложения в объектное хранилище и установка разрешения для доступа на чтение
Чтобы выгрузить созданное приложение, выполните команду:
aws s3 cp --recursive --endpoint-url <ENDPOINT_URL> <ПУТЬ_ДО_СОЗДАННОГО_ПРИЛОЖЕНИЯ> s3://<MARKETPLACE_FOLDER_PATH>/
Чтобы установить разрешения для доступа на чтение, выполните команды:
aws s3api put-object-acl --bucket <ИМЯ_БАКЕТА> --key <НАЗВАНИЕ_ПРИЛОЖЕНИЯ>/0.1.0/HOWTO.md --acl public-readaws s3api put-object-acl --bucket <ИМЯ_БАКЕТА> --key <НАЗВАНИЕ_ПРИЛОЖЕНИЯ>/0.1.0/logo.svg --acl public-readaws s3api put-object-acl --bucket <ИМЯ_БАКЕТА> --key <НАЗВАНИЕ_ПРИЛОЖЕНИЯ>/0.1.0/marketplace_<НАЗВАНИЕ_ПРИЛОЖЕНИЯ>_roles.tar.gz --acl public-readaws s3api put-object-acl --bucket <ИМЯ_БАКЕТА> --key <НАЗВАНИЕ_ПРИЛОЖЕНИЯ>/0.1.0/metadata.yml --acl public-readaws s3api put-object-acl --bucket <ИМЯ_БАКЕТА> --key <НАЗВАНИЕ_ПРИЛОЖЕНИЯ>/0.1.0/stack.yml --acl public-read