Sawubona wonke umuntu!
Ngisebenza njengonjiniyela we-DevOps wesevisi yokubhukha ihhotela.
Ku-Ostrovok.ru sisebenzisa i-ansible njengomphathi wokucushwa. Muva nje sifike esidingweni sokuhlola izindima, kodwa, njengoba kwavela, awekho amathuluzi amaningi alokhu - okuthandwa kakhulu, mhlawumbe, uhlaka lwe-Molecule, ngakho sanquma ukuyisebenzisa. Kodwa kwavela ukuthi imibhalo yakhe ayisho lutho ngezingibe eziningi. Asikwazanga ukuthola umhlahlandlela onemininingwane eyanele ngesiRashiya, ngakho-ke sinqume ukubhala lesi sihloko.
i-molecule
Incazelo eyenziwe lula: I-molecule idala isibonelo endaweni oyicacisayo (ifu, umshini obonakalayo, isiqukathi; ukuze uthole imininingwane eyengeziwe, bheka isigaba
Manje okwengeziwe.
A little ofory
Ake sicabangele izinhlangano ezimbili ezibalulekile zeMolekuli: Isimo kanye Nomshayeli.
Isimo
Umbhalo uqukethe incazelo yokuthi yini, kuphi, kanjani futhi ngakuphi ukulandelana okuzokwenziwa. Indima eyodwa ingaba nemibhalo eminingi, futhi ngayinye iyinkomba esendleleni <role>/molecule/<scenario>
, equkethe izincazelo zezenzo ezidingekayo ekuhlolweni. Kufanele kube nesikripthi default
, ezodalwa ngokuzenzakalela uma uqalisa indima usebenzisa i-Molecule. Amagama emibhalo elandelayo angokubona kwakho.
Ukulandelana kwezenzo zokuhlola kuskripthi kubizwa Matrix, futhi ngokuzenzakalelayo kuba kanje:
(Izinyathelo zimakiwe ?
, zeqiwa ngokuzenzakalelayo uma zingashiwongo umsebenzisi)
lint
- ama-linters asebenzayo. Ngephuthayamllint
иflake8
,destroy
- ukususa izimo ekuqalisweni kokugcina kwe-Molecule (uma kukhona okusele),dependency
? - ukufaka ukuncika okufanelekile kwendima ehloliwe,syntax
- ukuhlola i-syntax yendima kusetshenziswaansible-playbook --syntax-check
,create
- yakha isibonelo,prepare
? - ukulungisa isenzakalo; isibonelo ukuhlola/ukufaka i-python2converge
- ukwethula incwadi yokudlala ehloliwe,idempotence
- qalisa kabusha ibhuku lokudlala ukuze uthole ukuhlolwa kokuphelelwa amandla,side_effect
? - izenzo azihlobene ngokuqondile nendima, kodwa ezidingekayo ekuhlolweni,verify
- sebenzisa izivivinyo zokucushwa okuwumphumela usebenzisatestinfra
(okuzenzakalelayo) /goss
/inspec
,cleanup
? - (ezinguqulweni ezintsha) - uma sikhuluma nje, “ukuhlanza” ingqalasizinda yangaphandle ethintwa yiMolecule,destroy
- ukususa isenzakalo.
Lokhu kulandelana kuhlanganisa izimo eziningi, kodwa kungashintshwa uma kunesidingo.
Isinyathelo ngasinye kulezi ezingenhla singaqhutshwa ngokuhlukana kusetshenziswa molecule <command>
. Kodwa kufanele uqonde ukuthi ku-cli command ngayinye enjalo kungase kube nokulandelana kwayo kwezenzo, ongakuthola ngokuqalisa. molecule matrix <command>
. Isibonelo, uma usebenzisa umyalo converge
(usebenzisa incwadi yokudlala ehloliwe) kuzokwenziwa lezi zenzo ezilandelayo:
$ molecule matrix converge
...
└── default # название сценария
├── dependency # установка зависимостей
├── create # создание инстанса
├── prepare # преднастройка инстанса
└── converge # прогон плейбука
Ukulandelana kwalezi zenzo kungahlelwa. Uma okuthile okuvela ohlwini sekuqediwe kakade, kuzokweqiwa. Isimo samanje, kanye nokuhlelwa kwesibonelo, kugcinwa kumkhombandlela we-Molecule $TMPDIR/molecule/<role>/<scenario>
.
Engeza izinyathelo nge ?
Ungakwazi ukuchaza izenzo ozifisayo ngefomethi ye-Ansible playbook, futhi wenze igama lefayela ngokwesinyathelo: prepare.yml
/side_effect.yml
. Lindela ukuthi lawa mafayela e-Molecule abe kufolda yombhalo.
Driver
Umshayeli yibhizinisi lapho izimo zokuhlola zidaleka khona.
Uhlu lwabashayeli abajwayelekile lapho i-Molecule inezifanekiso esenziwe ngomumo yilezi: Azure, Docker, EC2, GCE, LXC, LXD, OpenStack, Vagrant, Delegated.
Ezimweni eziningi, izifanekiso zingamafayela create.yml
и destroy.yml
kufolda yombhalo, echaza ukudalwa nokususwa kwesibonelo, ngokulandelana.
Okuhlukile yi-Docker ne-Vagrant, njengoba ukusebenzisana namamojula wabo kungenzeka ngaphandle kwamafayela angenhla.
Kuyafaneleka ukugqamisa umshayeli Othunyelwe, ngoba uma esetshenziswa, umsebenzi kuphela onokucushwa kwesibonelo ochazwa ekudalweni kwesibonelo namafayela okususwa; okunye kufanele kuchazwe unjiniyela.
Umshayeli ozenzakalelayo yi-Docker.
Manje ake siqhubeke sizijwayeze futhi sicabangele ezinye izici lapho.
Ukuqalisa
Njengomhlaba "sawubona" sizohlola indima elula yokufaka i-nginx. Ake sikhethe i-docker njengomshayeli - ngicabanga ukuthi iningi lenu liyifakile (futhi khumbula ukuthi i-docker ingumshayeli ozenzakalelayo).
Lungiselela virtualenv
futhi uyifake kuyo molecule
:
> pip install virtualenv
> virtualenv -p `which python2` venv
> source venv/bin/activate
> pip install molecule docker # molecule установит ansible как зависимость; docker для драйвера
Isinyathelo esilandelayo ukuqala indima entsha.
Ukuqaliswa kwendima entsha, kanye neskripthi esisha, kwenziwa kusetshenziswa umyalo 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
Umphumela uyindima evamile enengqondo. Ngaphezu kwalokho, konke ukusebenzisana ne-Molecules CLI kwenziwa kusukela kumsuka wendima.
Ake sibone ukuthi yini ekuhlu lwezindima:
> tree molecule/default/
molecule/default/
├── Dockerfile.j2 # Jinja-шаблон для Dockerfile
├── INSTALL.rst. # Немного информации об установке зависимостей сценария
├── molecule.yml # Файл конфигурации
├── playbook.yml # Плейбук запуска роли
└── tests # Директория с тестами стадии verify
└── test_default.py
1 directory, 6 files
Ake sibheke i-config molecule/default/molecule.yml
(sizoshintsha kuphela isithombe sedokhu):
---
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
ukuncika
Lesi sigaba sichaza umthombo wokuncika.
Izinketho ezingaba khona:
I-Shell imane iyigobolondo lomyalo ongalisebenzisa uma umthala kanye ne-gilt ingambozi izidingo zakho.
Ngeke ngihlale lapha isikhathi eside, kuchazwe ngokwanele kuyo
Umshayeli
Igama lomshayeli. Kithina lokhu kuyidokodo.
inkenteza
I-Yamllint isetshenziswa njenge-linter.
Izinketho eziwusizo kule ngxenye yokucushwa yikhono lokucacisa ifayela lokumisa le-yamllint, okuguquguqukayo kwemvelo eya phambili, noma ukukhubaza i-linter:
lint:
name: yamllint
options:
config-file: foo/bar
env:
FOO: bar
enabled: False
Amapulatifomu
Ichaza ukucushwa kwezimo.
Endabeni ye-docker njengomshayeli, i-Molecule iphindaphinda ngaphezu kwalesi sigaba, futhi ingxenye ngayinye yohlu iyatholakala ku- Dockerfile.j2
njengokuguquguquka item
.
Endabeni yomshayeli lapho create.yml
и destroy.yml
, isigaba sitholakala kuzo njenge molecule_yml.platforms
, futhi ukuphindwaphindwa kuyo sekuchazwe kakade kulawa mafayela.
Njengoba i-Molecule inikeza ukuphathwa kwesibonelo kumamojula Ansible, kufanele ubheke uhlu lwezilungiselelo ezingenzeka lapho. Ku-Docker, isibonelo, imojula iyasetshenziswa
Ungathola futhi izibonelo zokusebenzisa abashayeli abahlukahlukene
Ake sishintshe lapha ikhulu:7 on ubuntu.
umnikezeli
“Umhlinzeki” yibhizinisi eliphethe izimo. Endabeni ye-Molecule, lokhu kuyafaneleka; ukusekelwa kwabanye akuhleliwe, ngakho-ke lesi sigaba singakwazi, ngokubhukha, ukubizwa ngokuthi ukucushwa okunengqondo okunwetshiwe.
Kuningi ongakuveza lapha, kodwa ngizogqamisa amaphuzu asemqoka, ngokubona kwami:
- izincwadi zokudlala: Ungacacisa ukuthi yiziphi izincwadi zokudlala okufanele zisetshenziswe ezigabeni ezithile.
provisioner:
name: ansible
playbooks:
create: create.yml
destroy: ../default/destroy.yml
converge: playbook.yml
side_effect: side_effect.yml
cleanup: cleanup.yml
- config_options:
config enengqondo
provisioner:
name: ansible
config_options:
defaults:
fact_caching: jsonfile
ssh_connection:
scp_if_ssh: True
- uxhumano_izinketho: izinketho
xhuma
provisioner:
name: ansible
connection_options:
ansible_ssh_common_args: "-o 'UserKnownHostsFile=/dev/null' -o 'ForwardAgent=yes'"
- izinketho: Amapharamitha aphathekayo nokuguquguquka kwemvelo
provisioner:
name: ansible
options:
vvv: true
diff: true
env:
FOO: BAR
simo
Isihloko nencazelo yokulandelana kombhalo.
Ungashintsha i-matrix yesenzo ezenzakalelayo yomyalo ngokungeza ukhiye <command>_sequence
futhi njengenani layo, echaza uhlu lwezinyathelo esizidingayo.
Ake sithi sifuna ukushintsha ukulandelana kwezenzo lapho sisebenzisa umyalo wokugijima we-playbook: molecule converge
# изначально:
# - dependency
# - create
# - prepare
# - converge
scenario:
name: default
converge_sequence:
- create
- converge
hlola
Ukusetha uhlaka lokuhlolwa kanye ne-linter yalo. Ngokuzenzakalelayo, i-linter isetshenziswa testinfra
и flake8
. Izinketho ezingenzeka ziyefana nalokhu okungenhla:
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
Asibuyele endimeni yethu. Masihlele ifayela tasks/main.yml
kuleli fomu:
---
- name: Install nginx
apt:
name: nginx
state: present
- name: Start nginx
service:
name: nginx
state: started
Futhi wengeze izivivinyo ku 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")
Sekwenziwe, okusele wukugijima (kusuka empandeni yendima, ake ngikukhumbuze):
> molecule test
Ukukhipha amandla okude ngaphansi kwe-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
Indima yethu elula ihlolwe ngaphandle kwezinkinga.
Kuyafaneleka ukukhumbula ukuthi uma izinkinga zivela ngesikhathi sokusebenza molecule test
, uma ungashintshanga ukulandelana okujwayelekile, i-Molecule izosusa isenzakalo.
Imiyalo elandelayo iwusizo ekulungiseni iphutha:
> molecule --debug <command> # debug info. При обычном запуске Молекула скрывает логи.
> molecule converge # Оставляет инстанс после прогона тестируемой роли.
> molecule login # Зайти в созданный инстанс.
> molecule --help # Полный список команд.
Indima ekhona
Ukwengeza umbhalo omusha endimeni ekhona kuyenzeka kusukela kuhla lwemibhalo yendima ngemiyalo elandelayo:
# полный список доступных параметров
> molecule init scenarion --help
# создание нового сценария
> molecule init scenario -r <role_name> -s <scenario_name>
Uma lesi kuwumbhalo wokuqala endimeni, bese kuba ipharamitha -s
ingashiywa njengoba kuzokwakhiwa umbhalo default
.
isiphetho
Njengoba ubona, i-Molecule ayiyona inkimbinkimbi kakhulu, futhi uma usebenzisa izifanekiso zakho, unganciphisa ukuthunyelwa kweskripthi esisha ekuhleleni okuguquguqukayo ezincwadini zokudlala zokudala nokususa izimo. I-molecule ihlangana ngaphandle komthungo nezinhlelo ze-CI, ezikuvumela ukuthi ukhuphule ijubane lokuthuthuka ngokunciphisa isikhathi sokuhlola okwenziwa ngesandla sezincwadi zokudlala.
Ngiyabonga ukulalela kwenu. Uma unolwazi lokuhlola izindima ezifanele, futhi azihlobene ne-Molecule, sitshele ngakho kumazwana!
Source: www.habr.com