Пишем плагин для fuel 8.0. Часть 1

Делюсь опытом написания плагина для fuel.

Будем писать плагин, который полноценно развернет django приложение на ноде.

Плагин состоит из файлов, описание каждого файла вы найдете в моих конспектах

Исходники данного урока выложен на github

Доп материалы

Что будет делать наш плагин

  • создавать папку с исходниками django-приложения
  • создавать python окружение для django приложения
  • создает БД в postgres
  • ставит supervisor и запускает приложение через gunicorn
  • ставит nginx

Исходные данные

  • знания puppet манифестов, hiera
  • python2.7
  • установленная библиотека fuel-plugin-builder (есть в pip репозиторий)
  • развернутый fuel, с мастер нодой, контроллером, и нодой, в которую будем деплоить наш плагин.

Создаем болванку из шаблона

host-PC:~$ fpb --create fuel-plugin-django-app

Это создаст папку с именем fuel-plugin-builder. Это уже вполне готовый плагин который можно деплоить на какую то ноду.

Допилим болванку

Заменим содержимое файла tasks.yaml на

[]

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

Также необходимо заменить role на groups в файле deployment_tasks.yaml:

- id: fuel-plugin-django-app-deployment-puppet
  type: puppet
  role: [fuel-plugin-django-app_role]
  requires: [deploy_start]
  required_for: [deploy_end]

на

- id: fuel-plugin-django-app-deployment-puppet
  type: puppet
  groups: [fuel-plugin-django-app_role]
  requires: [deploy_start]
  required_for: [deploy_end]

Также необходимо создать файл fuel-plugin-django-app/deployment_scripts/deploy.pp:

notice('PLUGIN: fuel-plugin-django-app-deploy.pp')

file { 
    '/tmp/fuel-plugin-django-app.txt':
        ensure => present,
        content => "fuel-plugin-django-app",
}

Собираем плагин в пакет

host-PC:~$ fpb --build fuel-plugin-django-app

Это создаст пакет плагина, с именем fuel-plugin-django-app-1.0-1.0.0-1.noarch.rpm

Установка плагина в fuel

fuel-master:~# fuel plugins
id | name       | version | package_version
---|------------|---------|----------------
   |            |         |

fuel-master:~# fuel plugins --install fuel-plugin-django-app-1.0-1.0.0-1.noarch.rpm

fuel-master:~# fuel plugins
id | name                   | version | package_version
---|------------------------|---------|----------------
1  | fuel-plugin-django-app | 1.0.0   | 4.0.0

Деплоим плагин

  • в fuel-web создаем окружение или сбрасываем существующее
  • в окружении, во вкладке settings, в группе other включаем наш плагин
  • добавляем контроллер ноду в окружение
  • добавляем ноду с ролью нашего плагина
  • деплоим

После успешного завершения, на ноде, где развернуто наше приложение и на контроллере, будет файл /tmp/fuel-plugin-django-app с содержимым fuel-plugin-django-app

НО!

Деплой у нас завершится не удачно (а может и удачно), мы увидим ошибку

Error
Deployment has failed. Method granular_deploy. Failed to execute hook 'update_hosts' Puppet run failed. Check puppet logs for details

Дебажим ошибку

Посмотрим, какие ноды есть в нашем окружении

$ fuel nodes
id | status   | name             | cluster | ip        | mac               | roles                       | pending_roles | online | group_id
---|----------|------------------|---------|-----------|-------------------|-----------------------------|---------------|--------|---------
1  | error    | controller       | 2       | 10.20.0.3 | 08:00:27:63:4a:04 | controller                  |               | True   | 2       
2  | error    | Untitled (dd:5d) | 2       | 10.20.0.4 | 08:00:27:7a:dd:5d | fuel-plugin-django-app_role |               | True   | 2

Зайдем по ssh на вторую ноду, т.к. ошибка именно там.

$ ssh node-2

Посмотрим логи

$ vim /var/log/puppet.log

Где мы увидим ошибку

2016-05-12 06:44:57 +0000 Puppet (err): 
Could not find data item node_name_prefix_for_messaging in 
any Hiera data file 
and no default supplied at /etc/puppet/modules/osnailyfacter/modular/hosts/hosts.pp:6 on node node-2.domain.tld

Это возникает из-за того, что у нас есть ошибка в графе выполняемых задач

Исправим это, добавим зависимые задачи для группы, в файле deployment_tasks.yaml

- id: fuel-plugin-django-app_role
  type: group
  role: [fuel-plugin-django-app_role]
  parameters:
    strategy:
      type: parallel

на

- id: fuel-plugin-django-app_role
  type: group
  role: [fuel-plugin-django-app_role]
  tasks: [hiera, globals] 
  parameters:
   strategy:
      type: parallel

Изменим версию плагина в metadata, для корректно обновления. Увеличим только последнюю цифру, тогда наш пакет будет считаться обновлением, и просто заменит старую версию плагина

version: '1.0.0'

на

version: '1.0.1'

Теперь необходимо собрать новый пакет плагина, установить его в фуел и запустить деплой нод повторно.

Готово