Выполнение домашнего задания по теме "8.6. Создание собственных modules".
Q/A
Задание 1
Подготовка к выполнению
- Создайте пустой публичных репозиторий в любом своём проекте:
my_own_collection- Скачайте репозиторий ansible:
git clone https://github.com/ansible/ansible.gitпо любому удобному вам пути- Зайдите в директорию ansible:
cd ansible- Создайте виртуальное окружение:
python3 -m venv venv- Активируйте виртуальное окружение:
./venv/bin/activate. Дальнейшие действия производятся только в виртуальном окружении- Установите зависимости
pip install -r requirements.txt- Запустить настройку окружения
./hacking/env-setup- Если все шаги прошли успешно - выйти из виртуального окружения
deactivate- Ваше окружение настроено, для того чтобы запустить его, нужно находиться в директории
ansibleи выполнить конструкцию./venv/bin/activate && ./hacking/env-setup
Репозиторий: Dannecron/netology-devops-ansible-yandex-cloud-cvl.
Дополнительные действия:
-
В ubuntu-дистрибутивах модуль
venvне установлен по умолчанию, поэтому нужно его установить самостоятельноsudo apt install python3.8-venv -
Напрямую вызвать
./venv/bin/activateнельзя, он не исполняемый. Внутри файла описан комментарийThis file must be used with "source bin/activate" *from bash* you cannot run it directlyПоэтому нужно запустить следующую команду:
source ./venv/bin/activate -
Аналогично с запуском
./hacking/env-setupsource ./hacking/env-setup
Задание 2
Основная часть Наша цель - написать собственный module, который мы можем использовать в своей role, через playbook. Всё это должно быть собрано в виде collection и отправлено в наш репозиторий.
- В виртуальном окружении создать новый
my_own_module.pyфайл- Наполнить его содержимым из статьи
- Заполните файл в соответствии с требованиями ansible так, чтобы он выполнял основную задачу: module должен создавать текстовый файл на удалённом хосте по пути, определённом в параметре
path, с содержимым, определённым в параметреcontent.
Код модуля доступен в файле my_own_module.py. Внутри репозитория ansible его
необходимо положить по пути lib/ansible/modules.
- Проверьте module на исполняемость локально
Нужно создать в корне репозитория ansible файл payload.json со следующим содержимым:
{
"ANSIBLE_MODULE_ARGS": {
"path": "/tmp/new",
"content": "some content"
}
}
Затем нужно выполнить следующую команду:
python3 -m ansible.modules.my_own_module payload.json
{"changed": true, "invocation": {"module_args": {"path": "/tmp/new", "content": "some content"}}}
При первом запуске модуль создаст файл:
cat /tmp/new
some content
При втором вызове модуля ничего не изменится:
python3 -m ansible.modules.my_own_module payload.json
{"changed": false, "invocation": {"module_args": {"path": "/tmp/new", "content": "some content"}}}
- Напишите single task playbook и используйте module в нём.
- Проверьте через playbook на идемпотентность
- Выйдите из виртуального окружения
Playbook будет выглядеть следующим образом: test_module.yml.
Данный файл нужно положить в корень репозитория ansible и выполнить следующую команду:
ansible-playbook test_module.yml
[WARNING]: No inventory was parsed, only implicit localhost is available
[WARNING]: provided hosts list is empty, only localhost is available. Note that the implicit localhost does
not match 'all'
PLAY [test my own module] ************************************************************************************
TASK [Gathering Facts] ***************************************************************************************
ok: [localhost]
TASK [create file] *******************************************************************************************
changed: [localhost]
PLAY RECAP ***************************************************************************************************
localhost : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
Повторим запуск, чтобы проверить идемпотентность:
ansible-playbook test_module.yml
[WARNING]: No inventory was parsed, only implicit localhost is available
[WARNING]: provided hosts list is empty, only localhost is available. Note that the implicit localhost does
not match 'all'
PLAY [test my own module] ************************************************************************************
TASK [Gathering Facts] ***************************************************************************************
ok: [localhost]
TASK [create file] *******************************************************************************************
ok: [localhost]
PLAY RECAP ***************************************************************************************************
localhost : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
Выход из виртуального окружения:
deactivate
- Инициализируйте новую collection:
ansible-galaxy collection init my_own_namespace.yandex_cloud_cvl.
ansible-galaxy collection init my_own_namespace.yandex_cloud_cvl
- Collection my_own_namespace.yandex_cloud_cvl was created successfully
Новая коллекция сразу перенесена в репозиторий netology-devops-ansible-yandex-cloud-cvl.
- В данную collection перенесите свой module в соответствующую директорию.
Модуль размещён в директории plugins/modules в репозитории netology-devops-ansible-yandex-cloud-cvl.
- Single task playbook преобразуйте в single task role и перенесите в collection. У role должны быть default всех параметров module
Роль размещена в директории roles/my_own_role в репозитории netology-devops-ansible-yandex-cloud-cvl.
- Создайте playbook для использования этой role
Playbook для работы с ролью расположен в файле playbook/my_playbook.yml.
- Заполните всю документацию по collection, выложите в свой репозиторий, поставьте тег
1.0.0на этот коммит.
netology-devops-ansible-yandex-cloud-cvl:1.0.0.
- Создайте .tar.gz этой collection:
ansible-galaxy collection buildв корневой директории collection.
ansible-galaxy collection build
Created collection for my_own_namespace.yandex_cloud_cvl at netology-devops-ansible-yandex-cloud-cvl/my_own_namespace-yandex_cloud_cvl-1.0.0.tar.gz
- Создайте ещё одну директорию любого наименования, перенесите туда single task playbook и архив c collection.
Использована директория с playbook, который создан на шаге 11.
- Установите collection из локального архива:
ansible-galaxy collection install <archivename>.tar.gz
ansible-galaxy collection install my_own_namespace-yandex_cloud_cvl-1.0.0.tar.gz
Starting galaxy collection install process
Process install dependency map
Starting collection install process
Installing 'my_own_namespace.yandex_cloud_cvl:1.0.0' to '~/.ansible/collections/ansible_collections/my_own_namespace/yandex_cloud_cvl'
my_own_namespace.yandex_cloud_cvl:1.0.0 was installed successfully
- Запустите playbook, убедитесь, что он работает.
ansible-playbook my_playbook.yml
[WARNING]: No inventory was parsed, only implicit localhost is available
[WARNING]: provided hosts list is empty, only localhost is available. Note that the implicit localhost does
not match 'all'
PLAY [my playbook] *****************************************************************************************
TASK [Gathering Facts] *************************************************************************************
ok: [localhost]
TASK [my_own_namespace.yandex_cloud_cvl.my_own_role : create file] *****************************************
changed: [localhost]
PLAY RECAP *************************************************************************************************
localhost : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0