Files
netology-devops/src/homework/08-ansible/8.6
2022-08-15 10:25:29 +07:00
..
2022-08-15 10:23:42 +07:00
2022-08-15 10:25:29 +07:00

Выполнение домашнего задания по теме "8.6. Создание собственных modules".

Q/A

Задание 1

Подготовка к выполнению

  1. Создайте пустой публичных репозиторий в любом своём проекте: my_own_collection
  2. Скачайте репозиторий ansible: git clone https://github.com/ansible/ansible.git по любому удобному вам пути
  3. Зайдите в директорию ansible: cd ansible
  4. Создайте виртуальное окружение: python3 -m venv venv
  5. Активируйте виртуальное окружение: ./venv/bin/activate. Дальнейшие действия производятся только в виртуальном окружении
  6. Установите зависимости pip install -r requirements.txt
  7. Запустить настройку окружения ./hacking/env-setup
  8. Если все шаги прошли успешно - выйти из виртуального окружения deactivate
  9. Ваше окружение настроено, для того чтобы запустить его, нужно находиться в директории ansible и выполнить конструкцию ./venv/bin/activate && ./hacking/env-setup

Репозиторий: Dannecron/netology-devops-ansible-yandex-cloud-cvl.

Дополнительные действия:

  1. В ubuntu-дистрибутивах модуль venv не установлен по умолчанию, поэтому нужно его установить самостоятельно

    sudo apt install python3.8-venv
    
  2. Напрямую вызвать ./venv/bin/activate нельзя, он не исполняемый. Внутри файла описан комментарий

    This file must be used with "source bin/activate" *from bash*
    you cannot run it directly
    

    Поэтому нужно запустить следующую команду:

    source ./venv/bin/activate
    
  3. Аналогично с запуском ./hacking/env-setup

    source ./hacking/env-setup
    

Задание 2

Основная часть Наша цель - написать собственный module, который мы можем использовать в своей role, через playbook. Всё это должно быть собрано в виде collection и отправлено в наш репозиторий.

  1. В виртуальном окружении создать новый my_own_module.py файл
  2. Наполнить его содержимым из статьи
  3. Заполните файл в соответствии с требованиями ansible так, чтобы он выполнял основную задачу: module должен создавать текстовый файл на удалённом хосте по пути, определённом в параметре path, с содержимым, определённым в параметре content.

Код модуля доступен в файле my_own_module.py. Внутри репозитория ansible его необходимо положить по пути lib/ansible/modules.

  1. Проверьте 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"}}}
  1. Напишите single task playbook и используйте module в нём.
  2. Проверьте через playbook на идемпотентность
  3. Выйдите из виртуального окружения

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
  1. Инициализируйте новую 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.

  1. В данную collection перенесите свой module в соответствующую директорию.

Модуль размещён в директории plugins/modules в репозитории netology-devops-ansible-yandex-cloud-cvl.

  1. Single task playbook преобразуйте в single task role и перенесите в collection. У role должны быть default всех параметров module

Роль размещена в директории roles/my_own_role в репозитории netology-devops-ansible-yandex-cloud-cvl.

  1. Создайте playbook для использования этой role

Playbook для работы с ролью расположен в файле playbook/my_playbook.yml.

  1. Заполните всю документацию по collection, выложите в свой репозиторий, поставьте тег 1.0.0 на этот коммит.

netology-devops-ansible-yandex-cloud-cvl:1.0.0.

  1. Создайте .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
  1. Создайте ещё одну директорию любого наименования, перенесите туда single task playbook и архив c collection.

Использована директория с playbook, который создан на шаге 11.

  1. Установите 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
  1. Запустите 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