Hello vose!
Ini ndinoshanda sainjiniya weDevOps mubasa rekubhuka hotera.
PaOstrovok.ru, tinoshandisa ansible semaneja wekugadzirisa. Munguva ichangopfuura, takasvika pakudiwa kwekuedza mabasa, asi sezvazvakazoitika, hapana maturusi akawanda eizvi - inonyanya kufarirwa, zvichida, ndiyo Molecule framework, saka takasarudza kuishandisa. Asi zvakazoitika kuti zvinyorwa zvake hazvina kunyarara nezvematambudziko mazhinji. Hatina kuwana bhuku rakakwana rakakwana muRussia, saka takasarudza kunyora chinyorwa ichi.
molecule
Tsanangudzo yakapfava: Iyo molecule inogadzira muenzaniso pachikuva chaunotsanangura (gore, virtual muchina, mudziyo; kuti uwane rumwe ruzivo, ona chikamu
Zvino zvakawanda.
Chimwe chezvinyorwa
Funga nezvezvinhu zviviri zvakakosha zveMolecule: Scenario uye Driver.
Mamiriro ezvinhu
Chinyorwa chine tsananguro yekuti chii, kupi, sei uye munhevedzano ipi ichaitwa. Basa rimwe rinogona kuva nezvinyorwa zvakawanda, uye imwe neimwe idhairekitori munzira <role>/molecule/<scenario>
, iyo ine tsananguro dzezviito zvinodiwa pakuedzwa. Script inofanira kuiswa default
, iyo inozogadzirwa otomatiki kana iwe ukatanga basa neMolecule. Mazita ezvinyorwa zvinotevera zviri kwauri.
Kutevedzana kwezviito zvekuyedza mune script kunonzi matrix, uye nekusarudzika ndizvo:
(Matanho akanyorwa ?
, yakarukwa nekukasira kana isina kutaurwa nemushandisi)
lint
- kumhanya linters. By default anoshandiswayamllint
иflake8
,destroy
- kudzima zviitiko kubva pakuvhurwa kwekupedzisira kweMolecule (kana iripo),dependency
? - kuisirwa kweanogoneka kutsamira kwebasa rakaedzwa,syntax
- kutarisa syntax yebasa uchishandisaansible-playbook --syntax-check
,create
- kugadzira muenzaniso,prepare
? - kugadzirira chiitiko; semuenzaniso cheki/kuisa python2converge
- kutangwa kwebhuku rekutamba riri kuedzwa,idempotence
- kutangazve bhuku rekutamba rekuyedza idempotency,side_effect
? - zviito zvisingaenderane zvakananga nebasa, asi zvakakosha kune bvunzo,verify
-kumhanyisa bvunzo dzezvakagadziriswa kumisikidzwa uchishandisatestinfra
(default) /goss
/inspec
,cleanup
? - (mune shanduro itsva) - kutaura, "kuchenesa" zvivakwa zvekunze zvakakanganiswa neMolecule,destroy
- Kudzima muenzaniso.
Kutevedzana uku kunobata zviitiko zvakawanda, asi kunogona kuchinjwa kana zvichidikanwa.
Imwe neimwe yematanho ari pamusoro inogona kumhanya yakaparadzana nayo molecule <command>
. Asi zvinofanirwa kunzwisiswa kuti kune yega yega cli-command panogona kunge paine kutevedzana kwayo kwezviito, izvo zvaunogona kuziva nekuita. molecule matrix <command>
. Semuenzaniso, paunenge uchimhanyisa kuraira converge
(kumhanyisa bhuku rekutamba pasi pekuyedzwa), zvinotevera zviito zvichaitwa:
$ molecule matrix converge
...
└── default # название сценария
├── dependency # установка зависимостей
├── create # создание инстанса
├── prepare # преднастройка инстанса
└── converge # прогон плейбука
Kutevedzana kwezviito izvi kunogona kugadziriswa. Kana chimwe chinhu kubva pakurongwa chatoitwa, chinodarika. Iyo yazvino mamiriro, pamwe neiyo config yezviitiko, iyo Molecule inochengeta mudhairekitori $TMPDIR/molecule/<role>/<scenario>
.
Wedzera matanho ne ?
iwe unogona kutsanangura zviito zvaunoda mune ansible-playbook fomati, uye gadzira zita refaira zvinoenderana nedanho: prepare.yml
/side_effect.yml
. Tarisira aya mafaera Iyo morekuru ichange iri mugwaro folda.
mutyairi
Mutyairi inhengo inogadzirwa bvunzo zviitiko.
Rondedzero yemadhiraivha akajairwa ayo Molecule ane matemplate akagadzirira ndeaya: Azure, Docker, EC2, GCE, LXC, LXD, OpenStack, Vagrant, Delegated.
Muzviitiko zvakawanda, ma templates mafaira create.yml
и destroy.yml
mune script folda inotsanangura kusikwa uye kudzima kwechiitiko, zvichiteerana.
Izvo zvinosiya Docker uye Vagrant, sekudyidzana nemamodule avo kunogona kuitika pasina mafaera ambotaurwa.
Zvakakodzera kujekesa Mutyairi Akatumirwa, sezvo kana ikashandiswa mumafaira ekugadzira nekudzima chiitiko, shanda chete nekugadziriswa kwezviitiko zvinotsanangurwa, zvimwe zvose zvinofanira kutsanangurwa nejinjiniya.
Mutyairi wakasarudzika ndiDocker.
Zvino ngatienderere mberi tichidzidzira uye tifunge nezve mamwe maitiro ipapo.
kutanga
Se "mhoro nyika", ngatiedzei iri nyore yekuisa nginx basa. Ngatisarudzei docker semutyairi - ndinofunga vazhinji venyu vakaiisa (uye rangarirai kuti docker ndiye anodhiraivha).
Ngatigadzirirei virtualenv
uye isa mariri molecule
:
> pip install virtualenv
> virtualenv -p `which python2` venv
> source venv/bin/activate
> pip install molecule docker # molecule установит ansible как зависимость; docker для драйвера
Nhanho inotevera ndeyekutanga basa idzva.
Kutanga kwebasa idzva, pamwe nerunyoro rutsva, rinoitwa uchishandisa murairo 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
Zvakava zvakajairika ansible-basa. Kupfuurirazve, kudyidzana kwese neCLI Molecules inogadzirwa kubva pamudzi webasa.
Ngationei zviri mugwaro rebasa:
> tree molecule/default/
molecule/default/
├── Dockerfile.j2 # Jinja-шаблон для Dockerfile
├── INSTALL.rst. # Немного информации об установке зависимостей сценария
├── molecule.yml # Файл конфигурации
├── playbook.yml # Плейбук запуска роли
└── tests # Директория с тестами стадии verify
└── test_default.py
1 directory, 6 files
Ngationgororei config molecule/default/molecule.yml
(chinja chete docker mufananidzo):
---
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
kutsamira
Ichi chikamu chinotsanangura kunobva kutsamira.
Zvimwe zvingasarudzwa:
Shell ingori goko rekuraira rinoshandiswa kana galaxy uye gilt isingavhare zvaunoda.
Ini handisi kuzogara pano kwenguva yakareba, zvakakwana zvinotsanangurwa mukati
mutyairi
Zita remutyairi. Yedu ndeye docker.
rika
Iyo linter ndeye yamllint.
Sarudzo dzinobatsira muchikamu chino chegadziriso kugona kutsanangura faira yekumisikidza yeyamllint, kumberi nharaunda zvinosiyana, kana kudzima linter:
lint:
name: yamllint
options:
config-file: foo/bar
env:
FOO: bar
enabled: False
Mapuratifomu
Inotsanangura magadzirirwo ezviitiko.
Kana iri docker semutyairi, iyo Molecule inodzokororwa pamusoro pechikamu ichi, uye chimwe nechimwe chinhu cherondedzero chinowanikwa mukati. Dockerfile.j2
as a variable item
.
Panyaya yemutyairi zvinoda create.yml
и destroy.yml
, chikamu chinowanikwa mavari se molecule_yml.platforms
, uye kudzokororwa pamusoro payo kwakatotsanangurwa mumafaira aya.
Sezvo iyo Molecule inopa kutonga kwezviitiko kune ansible modules, rondedzero yezvinogoneka marongero inofanirawo kutsvakwa ipapo. Kune docker, semuenzaniso, iyo module inoshandiswa
Uyewo mienzaniso yekushandiswa kwevatyairi vakasiyana-siyana inogona kuwanikwa
Tsiva pano masendi:7 pamusoro ubuntu.
provider
"Supplier" - sangano rinotarisira zviitiko. Panyaya yeMolecule, izvi zvinonzwisisika, kutsigirwa kwevamwe hakuna kurongwa, saka chikamu ichi chinogona kunzi ansible yakawedzerwa kurongeka ne caveat.
Pano iwe unogona kutsanangura zvinhu zvakawanda, ini ndichasimbisa pfungwa huru, mumaonero angu:
- mabhuku ekutamba: unogona kutsanangura kuti ndeapi mabhuku ekutamba anofanirwa kushandiswa pane mamwe matanho.
provisioner:
name: ansible
playbooks:
create: create.yml
destroy: ../default/destroy.yml
converge: playbook.yml
side_effect: side_effect.yml
cleanup: cleanup.yml
- config_options:
ansible config
provisioner:
name: ansible
config_options:
defaults:
fact_caching: jsonfile
ssh_connection:
scp_if_ssh: True
- connection_options: zvingasarudzwa
kubatana
provisioner:
name: ansible
connection_options:
ansible_ssh_common_args: "-o 'UserKnownHostsFile=/dev/null' -o 'ForwardAgent=yes'"
- mikana: Ansible sarudzo uye nharaunda siyana
provisioner:
name: ansible
options:
vvv: true
diff: true
env:
FOO: BAR
mamiriro ezvinhu
Zita uye tsananguro yezvinyorwa zvakatevedzana.
Iwe unogona kushandura iyo yekusarudzika chiito matrix yechero rairo nekuwedzera kiyi <command>_sequence
uye sekukosha kwayo nekutsanangura rondedzero yematanho atinoda.
Ngatitii tinoda kushandura kutevedzana kwezviito kana uchimhanyisa playbook run command: molecule converge
# изначально:
# - dependency
# - create
# - prepare
# - converge
scenario:
name: default
converge_sequence:
- create
- converge
cheki
Kugadzira chimiro chebvunzo uye linter kwairi. Iyo default linter ndeye testinfra
и flake8
. Sarudzo dzinogoneka dzakafanana nepamusoro:
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
Ngatidzokere pabasa redu. Ngatigadzirise faira tasks/main.yml
kune rudzi urwu:
---
- name: Install nginx
apt:
name: nginx
state: present
- name: Start nginx
service:
name: nginx
state: started
Uye wedzera bvunzo kune 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")
Zvaitwa, zvinongoramba zvichimhanya (kubva pamudzi webasa, rega ndikuyeuchidze):
> molecule test
Kupera kwenguva refu pasi pe spoiler:
--> 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
Basa redu riri nyore rakaedzwa pasina matambudziko.
Zvakakosha kuyeuka kuti kana pane matambudziko panguva yebasa molecule test
, saka kana usina kushandura kutevedzana kwacho, iyo Molecule inodzima muenzaniso.
Iyi mirairo inotevera inobatsira pakugadzirisa:
> molecule --debug <command> # debug info. При обычном запуске Молекула скрывает логи.
> molecule converge # Оставляет инстанс после прогона тестируемой роли.
> molecule login # Зайти в созданный инстанс.
> molecule --help # Полный список команд.
Basa Riripo
Kuwedzera script nyowani kune iripo basa ndiko kubva mudhairekitori rebasa nemirairo inotevera:
# полный список доступных параметров
> molecule init scenarion --help
# создание нового сценария
> molecule init scenario -r <role_name> -s <scenario_name>
Kana ichi ndicho chiitiko chekutanga mubasa, ipapo parameter -s
inogona kusiiwa sezvo ichagadzira script default
.
mhedziso
Sezvauri kuona, iyo Molecule haina kuomesesa, uye nekushandisa yako wega matemplate, kuendesa script nyowani kunogona kuderedzwa kusvika pakugadzirisa zvinosiyana mumuenzaniso wekugadzira uye kudzima mabhuku ekutamba. Iyo morekuru inosanganiswa isina musono neCI masisitimu, iyo inokutendera iwe kuti uwedzere kukurumidza kwekusimudzira nekudzikisa nguva yekuongororwa kwemanyorero emabhuku ekutamba.
Ndinokutendai nekuteerera kwenyu. Kana iwe uine ruzivo mukuyedza mabasa anonzwisisika, uye asina hukama neMolecule, tiudze nezvazvo mune zvakataurwa!
Source: www.habr.com