Nā kuhikuhi: pehea e hoʻāʻo ai i nā kuleana kūpono a ʻike i nā pilikia ma mua o ka hana ʻana

Hello a pau!

Hana wau ma ke ʻano he ʻenekini DevOps i kahi lawelawe hoʻopaʻa hōkele. Ostrovok.ru. Ma kēia ʻatikala, makemake wau e kamaʻilio e pili ana i kā mākou ʻike i ka hoʻāʻo ʻana i nā kuleana ansible.

Ma Ostrovok.ru, hoʻohana mākou i ka ansible ma ke ʻano he mana hoʻonohonoho. I kēia mau lā, ua hele mākou i ka pono e hoʻāʻo i nā kuleana, akā e like me ka mea i ʻike ʻia, ʻaʻole nui nā mea hana no kēia - ʻo ka mea kaulana loa, ʻo ia paha ka Molecule framework, no laila ua hoʻoholo mākou e hoʻohana. Akā, ua ʻike ʻia ua hāmau kāna palapala e pili ana i nā pitfalls he nui. ʻAʻole hiki iā mākou ke ʻike i kahi manual kikoʻī ma ka ʻōlelo Lūkini, no laila ua hoʻoholo mākou e kākau i kēia ʻatikala.

Nā kuhikuhi: pehea e hoʻāʻo ai i nā kuleana kūpono a ʻike i nā pilikia ma mua o ka hana ʻana

Molekule

Molekula - he hoʻolālā e kōkua i ka hoʻāʻo ʻana i nā kuleana kūpono.

ʻO ka wehewehe maʻalahi: Hoʻokumu ka mole i kahi laʻana ma ke kahua āu i kuhikuhi ai (kapua, mīkini virtual, ipu; no nā kikoʻī hou aku, e ʻike i ka ʻāpana. O Keaukaha), holo i kāu kuleana ma ia mea, a laila holo i nā hoʻāʻo a holoi i ka laʻana. I ka hihia o ka hāʻule ʻana ma kekahi o nā ʻanuʻu, e haʻi aku ka Molecule iā ʻoe e pili ana iā ia.

I kēia manawa hou aku.

Keʻano o ka manaʻo

E noʻonoʻo i ʻelua mau mea nui o ka Molecule: Scenario and Driver.

ʻO ke kiʻikuhi

Aia i loko o ka palapala ka wehewehe ʻana i ka mea, kahi, pehea a me ke kaʻina e hana ʻia ai. Hiki i hoʻokahi kuleana ke loaʻa nā palapala he nui, a he papa kuhikuhi kēlā me kēia ma ke ala <role>/molecule/<scenario>, aia nā wehewehe o nā hana i koi ʻia no ka hoʻāʻo. Pono e hoʻokomo i ka palapala default, e hana ʻokoʻa ʻia inā hoʻomaka ʻoe i ka hana me kahi Molecule. Aia iā ʻoe nā inoa o kēia mau palapala.

Ua kapa ʻia ke ʻano o nā hana hoʻāʻo ma kahi palapala Ke kumu, a ʻo ia ka:

(Papa ʻia nā ʻanuʻu ?, lele ʻia ma ka paʻamau inā ʻaʻole i kuhikuhi ʻia e ka mea hoʻohana)

  • lint - holo linters. Hoʻohana ʻia ma ka paʻamau yamllint и flake8,
  • destroy - ka holoi ʻana i nā manawa mai ka hoʻomaka hope ʻana o ka Molecule (inā loaʻa),
  • dependency? - ka hoʻokomo ʻana i ka hilinaʻi ansible o ka hana i hoʻāʻo ʻia,
  • syntax - ke nānā ʻana i ka syntax o ka hana e hoʻohana ana ansible-playbook --syntax-check,
  • create - ka hana ʻana i kahi laʻana,
  • prepare? - ka hoʻomākaukau ʻana i ka laʻana; e laʻa, nānā / hoʻokomo i ka python2
  • converge - ka hoʻomaka ʻana o ka puke pāʻani e hoʻāʻo ʻia,
  • idempotence - hoʻomaka hou i ka playbook no ka hōʻike idempotency,
  • side_effect? - nā hana i pili ʻole i ka hana, akā pono no nā hoʻokolohua,
  • verify - e holo ana i nā ho'āʻo o ka hopena hoʻonohonoho hoʻohana testinfra(paʻamau) /goss/inspec,
  • cleanup? - (ma nā mana hou) - ma ka ʻōlelo maʻalahi, "hoʻomaʻemaʻe" i nā ʻōnaehana waho i hoʻopilikia ʻia e ka Molecule,
  • destroy - Ke holoi nei i kahi laʻana.

Hoʻopili kēia kaʻina i ka hapa nui o nā hihia, akā hiki ke hoʻololi inā pono.

Hiki ke hoʻokaʻawale ʻia kēlā me kēia ʻanuʻu i luna molecule <command>. Akā, pono e hoʻomaopopo ʻia no kēlā me kēia cli-kauoha aia paha kāna ʻano hana ponoʻī, hiki iā ʻoe ke ʻike ma ka hoʻokō ʻana. molecule matrix <command>. No ka laʻana, i ka wā e holo ana i ke kauoha converge (e holo ana i ka puke pāʻani ma lalo o ka hoʻāʻo ʻana), e hana ʻia kēia mau hana:

$ molecule matrix converge
...
└── default         # название сценария
    ├── dependency  # установка зависимостей
    ├── create      # создание инстанса
    ├── prepare     # преднастройка инстанса
    └── converge    # прогон плейбука

Hiki ke hoʻoponopono ʻia ke kaʻina o kēia mau hana. Inā ua hana mua ʻia kekahi mea mai ka papa inoa, e lele ʻia. ʻO ke kūlana o kēia manawa, a me ka config o nā manawa, nā hale kūʻai Molecule i ka papa kuhikuhi $TMPDIR/molecule/<role>/<scenario>.

Hoʻohui i nā ʻanuʻu me ? hiki iā ʻoe ke wehewehe i nā hana i makemake ʻia ma ka format ansible-playbook, a hana i ka inoa faila e like me ka pae: prepare.yml/side_effect.yml. Manaʻo i kēia mau faila Aia ka mole i loko o ka waihona palapala.

O Keaukaha

ʻO ka mea hoʻokele he hui kahi i hana ʻia ai nā mea hoʻāʻo.
ʻO ka papa inoa o nā mea hoʻokele maʻamau no ka Molecule i hoʻomākaukau i nā template penei: Azure, Docker, EC2, GCE, LXC, LXD, OpenStack, Vagrant, Delegated.

I ka nui o na hihia, he mau waihona create.yml и destroy.yml i loko o ka waihona palapala e wehewehe ana i ka hana ʻana a me ka holoi ʻana i kahi laʻana, kēlā me kēia.
ʻO nā mea ʻē aʻe ʻo Docker a me Vagrant, no ka mea hiki ke hoʻopili ʻia me kā lākou mau modula me ka ʻole o nā faila i ʻōlelo ʻia.

He mea kūpono ke kuhikuhi ʻana i ka mea hoʻokele Delegated, no ka mea inā hoʻohana ʻia ia i nā faila no ka hana ʻana a me ka holoi ʻana i kahi hiʻohiʻona, e hana wale me ka hoʻonohonoho ʻana o nā manawa i wehewehe ʻia, ʻo ke koena e wehewehe ʻia e ka ʻenekinia.

ʻO ka mea hoʻokele paʻamau ʻo Docker.

I kēia manawa e neʻe kākou i ka hoʻomaʻamaʻa a noʻonoʻo i nā hiʻohiʻona hou aʻe ma laila.

noho hoʻomaka 'ana

Ma ke ʻano he "hello world", e hoʻāʻo mākou i kahi hana hoʻonohonoho nginx maʻalahi. E koho mākou i ka docker ma ke ʻano he mea hoʻokele - manaʻo wau ua hoʻokomo ka hapa nui o ʻoukou (a e hoʻomanaʻo ʻo docker ka mea hoʻokele paʻamau).

E hoʻomākaukau virtualenv a hoʻokomo i loko molecule:

> pip install virtualenv
> virtualenv -p `which python2` venv
> source venv/bin/activate
> pip install molecule docker  # molecule установит ansible как зависимость; docker для драйвера

ʻO ka hana aʻe e hoʻomaka i ka hana hou.
Hana ʻia ka hoʻomaka ʻana o kahi hana hou, a me kahi palapala hou me ka hoʻohana ʻana i ke kauoha molecule init <params>:

> molecule init role -r nginx
--> Initializing new role nginx...
Initialized role in <path>/nginx successfully.
> cd nginx
> tree -L 1
.
├── README.md
├── defaults
├── handlers
├── meta
├── molecule
├── tasks
└── vars

6 directories, 1 file

Ua lilo i typical ansible-role. Eia hou, hana ʻia nā pilina āpau me CLI Molecules mai ke kumu o ka hana.

E ʻike kākou i ka mea i loko o ka papa kuhikuhi kuleana:

> tree molecule/default/
molecule/default/
├── Dockerfile.j2  # Jinja-шаблон для Dockerfile
├── INSTALL.rst.   # Немного информации об установке зависимостей сценария
├── molecule.yml   # Файл конфигурации
├── playbook.yml   # Плейбук запуска роли
└── tests          # Директория с тестами стадии verify
    └── test_default.py

1 directory, 6 files

E nānā kākou i ka config molecule/default/molecule.yml (hoʻololi wale i ke kiʻi docker):

---
dependency:
  name: galaxy
driver:
  name: docker
lint:
  name: yamllint
platforms:
  - name: instance
    image: centos:7
provisioner:
  name: ansible
  lint:
    name: ansible-lint
scenario:
  name: default
verifier:
  name: testinfra
  lint:
    name: flake8

hilinaʻi

Hōʻike kēia ʻāpana i ke kumu o nā hilinaʻi.

Nā koho hiki: Wiliau Hōkū, giltar, pūpū.

He pūpū kauoha wale nō ʻo Shell i hoʻohana ʻia inā ʻaʻole uhi ka galaxy a me ka gilt i kāu mau pono.

Aole au e noho loihi maanei, ua lawa ka hoakaka ana ma palapala.

O Keaukaha

Ka inoa o ke kalaiwa. ʻO kā mākou docker.

olonā

He yamllint ka linter.

ʻO nā koho hoʻohana ma kēia ʻāpana o ka config ka hiki ke kuhikuhi i kahi faila hoʻonohonoho no yamllint, nā hoʻololi kaiapuni i mua, a i ʻole e hoʻopau i ka linter:

lint:
  name: yamllint
  options:
    config-file: foo/bar
  env:
    FOO: bar
  enabled: False

paepae ai

Hōʻike i ka hoʻonohonoho ʻana o nā hihia.
I ka hihia o docker ma ke ʻano he mea hoʻokele, ua ʻike ʻia ka Molecule ma luna o kēia ʻāpana, a loaʻa kēlā me kēia mea o ka papa inoa ma Dockerfile.j2 ma ke ano he hoololi item.

I ka hihia o ke kalaiwa e pono ai create.yml и destroy.yml, aia ka pauku i loko o lākou e like me molecule_yml.platforms, a ua wehewehe mua ʻia nā ʻike ma luna o kēia mau faila.

Ma muli o ka hāʻawi ʻana o ka Molecule i ka mana o nā manawa i nā modules ansible, pono e ʻimi ʻia ka papa inoa o nā hoʻonohonoho hiki. No ka docker, no ka laʻana, hoʻohana ʻia ka module docker_container_module. Hiki ke loaʻa nā modula i hoʻohana ʻia i nā mea hoʻokele ʻē aʻe palapala.

Hiki ke loaʻa nā hiʻohiʻona o ka hoʻohana ʻana i nā mea hoʻokele like ʻole ma na hoao ana o ka Molekula ponoi.

E pani hou maanei keneta:7 maluna o ubuntu.

mea hoʻolako

"mea hoʻolako" - he hui nāna e mālama i nā manawa. I ka hihia o Molecule, hiki kēia, ʻaʻole i hoʻolālā ʻia ke kākoʻo no nā poʻe ʻē aʻe, no laila hiki ke kapa ʻia kēia ʻāpana he hoʻonohonoho hoʻonui lōʻihi me kahi caveat.
Maanei hiki iā ʻoe ke kuhikuhi i nā mea he nui, e hōʻike wau i nā mea nui, i koʻu manaʻo:

  • puke pāʻani: hiki iā ʻoe ke kuhikuhi i nā puke pāʻani e hoʻohana ʻia i kekahi mau pae.

provisioner:
  name: ansible
  playbooks:
    create: create.yml
    destroy: ../default/destroy.yml
    converge: playbook.yml
    side_effect: side_effect.yml
    cleanup: cleanup.yml

provisioner:
  name: ansible
  config_options:
    defaults:
      fact_caching: jsonfile
    ssh_connection:
      scp_if_ssh: True

provisioner:
  name: ansible  
  connection_options:
    ansible_ssh_common_args: "-o 'UserKnownHostsFile=/dev/null' -o 'ForwardAgent=yes'"

  • koho: Nā koho ansible a me nā loli kaiapuni

provisioner:
  name: ansible  
  options:
    vvv: true
    diff: true
  env:
    FOO: BAR

ha i

Ka inoa a me ka wehewehe ʻana i nā kaʻina hana.
Hiki iā ʻoe ke hoʻololi i ka matrix hana paʻamau o kekahi kauoha ma ka hoʻohui ʻana i ke kī <command>_sequence a ma ke ʻano he waiwai no ia ma ka wehewehe ʻana i ka papa inoa o nā ʻanuʻu e pono ai mākou.
E ʻōlelo mākou makemake mākou e hoʻololi i ke ʻano o nā hana i ka wā e holo ana i ke kauoha runbook run: molecule converge

# изначально:
# - dependency
# - create
# - prepare
# - converge
scenario:
  name: default
  converge_sequence:
    - create
    - converge

kaha

Hoʻonohonoho i kahi hoʻolālā no nā hoʻokolohua a me kahi linter iā ia. ʻO ka linter paʻamau testinfra и flake8. ʻO nā koho kūpono e like me ka mea i luna:

verifier:
  name: testinfra
  additional_files_or_dirs:
    - ../path/to/test_1.py
    - ../path/to/test_2.py
    - ../path/to/directory/*
  options:
    n: 1
  enabled: False
  env:
    FOO: bar
  lint:
    name: flake8
    options:
      benchmark: True
    enabled: False
    env:
      FOO: bar

E hoʻi kākou i kā kākou kuleana. E hoʻoponopono kākou i ka faila tasks/main.yml i kēia ʻano:

---
- name: Install nginx
  apt:
    name: nginx
    state: present

- name: Start nginx
  service:
    name: nginx
    state: started

A hoʻohui i nā hoʻāʻo i molecule/default/tests/test_default.py

def test_nginx_is_installed(host):
    nginx = host.package("nginx")
    assert nginx.is_installed

def test_nginx_running_and_enabled(host):
    nginx = host.service("nginx")
    assert nginx.is_running
    assert nginx.is_enabled

def test_nginx_config(host):
    host.run("nginx -t")

Pau, koe wale nō e holo (mai ke kumu o ka hana, e hoʻomanaʻo wau iā ʻoe):

> molecule test

Hoʻopau lōʻihi ma lalo o ka mea hao:

--> Validating schema <path>/nginx/molecule/default/molecule.yml.
Validation completed successfully.
--> Test matrix

└── default
    ├── lint
    ├── destroy
    ├── dependency
    ├── syntax
    ├── create
    ├── prepare
    ├── converge
    ├── idempotence
    ├── side_effect
    ├── verify
    └── destroy

--> Scenario: 'default'
--> Action: 'lint'
--> Executing Yamllint on files found in <path>/nginx/...
Lint completed successfully.
--> Executing Flake8 on files found in <path>/nginx/molecule/default/tests/...
Lint completed successfully.
--> Executing Ansible Lint on <path>/nginx/molecule/default/playbook.yml...
Lint completed successfully.
--> Scenario: 'default'
--> Action: 'destroy'

    PLAY [Destroy] *****************************************************************

    TASK [Destroy molecule instance(s)] ********************************************
    changed: [localhost] => (item=None)
    changed: [localhost]

    TASK [Wait for instance(s) deletion to complete] *******************************
    ok: [localhost] => (item=None)
    ok: [localhost]

    TASK [Delete docker network(s)] ************************************************

    PLAY RECAP *********************************************************************
    localhost                  : ok=2    changed=1    unreachable=0    failed=0

--> Scenario: 'default'
--> Action: 'dependency'
Skipping, missing the requirements file.
--> Scenario: 'default'
--> Action: 'syntax'

    playbook: <path>/nginx/molecule/default/playbook.yml

--> Scenario: 'default'
--> Action: 'create'

    PLAY [Create] ******************************************************************

    TASK [Log into a Docker registry] **********************************************
    skipping: [localhost] => (item=None)

    TASK [Create Dockerfiles from image names] *************************************
    changed: [localhost] => (item=None)
    changed: [localhost]

    TASK [Discover local Docker images] ********************************************
    ok: [localhost] => (item=None)
    ok: [localhost]

    TASK [Build an Ansible compatible image] ***************************************
    changed: [localhost] => (item=None)
    changed: [localhost]

    TASK [Create docker network(s)] ************************************************

    TASK [Create molecule instance(s)] *********************************************
    changed: [localhost] => (item=None)
    changed: [localhost]

    TASK [Wait for instance(s) creation to complete] *******************************
    changed: [localhost] => (item=None)
    changed: [localhost]

    PLAY RECAP *********************************************************************
    localhost                  : ok=5    changed=4    unreachable=0    failed=0

--> Scenario: 'default'
--> Action: 'prepare'
Skipping, prepare playbook not configured.
--> Scenario: 'default'
--> Action: 'converge'

    PLAY [Converge] ****************************************************************

    TASK [Gathering Facts] *********************************************************
    ok: [instance]

    TASK [nginx : Install nginx] ***************************************************
    changed: [instance]

    TASK [nginx : Start nginx] *****************************************************
    changed: [instance]

    PLAY RECAP *********************************************************************
    instance                   : ok=3    changed=2    unreachable=0    failed=0

--> Scenario: 'default'
--> Action: 'idempotence'
Idempotence completed successfully.
--> Scenario: 'default'
--> Action: 'side_effect'
Skipping, side effect playbook not configured.
--> Scenario: 'default'
--> Action: 'verify'
--> Executing Testinfra tests found in <path>/nginx/molecule/default/tests/...
    ============================= test session starts ==============================
    platform darwin -- Python 2.7.15, pytest-4.3.0, py-1.8.0, pluggy-0.9.0
    rootdir: <path>/nginx/molecule/default, inifile:
    plugins: testinfra-1.16.0
collected 4 items

    tests/test_default.py ....                                               [100%]

    ========================== 4 passed in 27.23 seconds ===========================
Verifier completed successfully.
--> Scenario: 'default'
--> Action: 'destroy'

    PLAY [Destroy] *****************************************************************

    TASK [Destroy molecule instance(s)] ********************************************
    changed: [localhost] => (item=None)
    changed: [localhost]

    TASK [Wait for instance(s) deletion to complete] *******************************
    changed: [localhost] => (item=None)
    changed: [localhost]

    TASK [Delete docker network(s)] ************************************************

    PLAY RECAP *********************************************************************
    localhost                  : ok=2    changed=2    unreachable=0    failed=0

Ua hoʻāʻo ʻia kā mākou kuleana maʻalahi me ka pilikia ʻole.
Pono e hoʻomanaʻo inā loaʻa nā pilikia i ka wā o ka hana molecule test, a laila inā ʻaʻole ʻoe i hoʻololi i ke kaʻina paʻamau, e holoi ka Molecule i ka laʻana.

He mea pono kēia mau ʻōlelo no ka debugging:

> molecule --debug <command> # debug info. При обычном запуске Молекула скрывает логи.
> molecule converge          # Оставляет инстанс после прогона тестируемой роли.
> molecule login             # Зайти в созданный инстанс.
> molecule --help            # Полный список команд.

Kuleana e ku nei

ʻO ka hoʻohui ʻana i kahi palapala hou i kahi kuleana e kū nei mai ka papa kuhikuhi kuleana me kēia mau kauoha:

# полный список доступных параметров
> molecule init scenarion --help
# создание нового сценария
> molecule init scenario -r <role_name> -s <scenario_name>

Inā ʻo kēia ka hiʻohiʻona mua i ka hana, a laila ka parameter -s hiki ke hoʻokuʻu ʻia no ka mea e hana ia i kahi palapala default.

hopena

E like me kāu e ʻike ai, ʻaʻole paʻakikī loa ka Molecule, a ma ka hoʻohana ʻana i kāu mau mamana ponoʻī, hiki ke hoʻemi ʻia ke kau ʻana i kahi palapala hou i ka hoʻoponopono ʻana i nā mea hoʻololi i ka hana ʻana a me ka holoi ʻana i nā puke pāʻani. Hoʻohui maikaʻi ʻia ka mole me nā ʻōnaehana CI, e hiki ai iā ʻoe ke hoʻonui i ka wikiwiki o ka hoʻomohala ʻana ma o ka hoʻemi ʻana i ka manawa no ka hoʻāʻo lima ʻana i nā puke pāʻani.

Mahalo no kou noonoo. Inā loaʻa iā ʻoe ka ʻike i ka hoʻāʻo ʻana i nā kuleana ansible, a ʻaʻole pili i ka Molecule, e haʻi mai iā mākou ma nā ʻōlelo!

Source: www.habr.com

Pākuʻi i ka manaʻo hoʻopuka