áááºá¹ááá¬áá«áá°ááá¯ááºážá¡ááœááº!
áá»áœááºá¯ááºááẠááá¯áááºááœááºáááºáááºáá±á¬ááºááŸá¯á¡ááœáẠDevOps á¡ááºáá»ááºáá®áá¬á¡ááŒá
Ạá¡áá¯ááºáá¯ááºáá«áááºá
Ostrovok.ru ááœáẠáá»áœááºá¯ááºááá¯á·ááẠansible ááᯠconfiguration manager á¡ááŒá áºá¡áá¯á¶ážááŒá¯áááºá áááŒá¬áá±ážáá®á áá»áœááºá¯ááºááá¯á·ááẠá¡áááºážááá¹ááá»á¬ážááᯠá ááºážáááºááẠááá¯á¡ááºáá¬áá±á¬áºáááºážá á€á¡áá¬á¡ááœáẠáááááá¬áá»á¬ážá áœá¬áááŸááá« - áá°ááŒáá¯ááºá¡áá»á¬ážáá¯á¶ážá ááŒá áºáá±á¬ááºážááŒá áºááá¯ááºáááºááŸá¬ Molecule framework ááŒá áºááá·áºá¡ááœááºááŒá±á¬áá·áº áááºážááᯠá¡áá¯á¶ážááŒá¯ááẠáá¯á¶ážááŒááºáá²á·áááºá ááá¯á·áá±á¬áº áá°á·á á¬ááœááºá á¬áááºážáá»á¬ážááẠáá»áá¯á·ááœááºážáá»ááºáá»á¬ážá áœá¬ááŸáá·áºáááºáááºááŒá®áž ááŸá¯ááºááááºáá±áá²á·áá«áááºá áá¯ááŸá¬ážáá¬áá¬ááŒáá·áº áá¯á¶áá±á¬ááºáá±á¬ á¡áá±ážá áááºáááºážááœáŸááºáá»ááºááᯠáá»áœááºá¯ááºááá¯á· ááŸá¬áááœá±á·áá±á¬ááŒá±á¬áá·áº á€áá±á¬ááºážáá«ážááᯠáá±ážáá¬ážááẠáá¯á¶ážááŒááºáá²á·áááºá
áá±á¬áºáá®áá»á°áž
ááá¯ážááŸááºážáá±á¬áá±á¬áºááŒáá»ááº- áá±á¬áºáá®áá»á°ážááẠáááºáááºááŸááºáá¬ážáá±á¬ ááááºáá±á¬ááºážáá±á«áºááœáẠá
á¶ááá°áá¬áá
áºáá¯ááᯠáááºáá®ážááẠ(cloudá virtual machineá containerá á¡áá±ážá
áááºá¡áá»ááºá¡áááºáá»á¬ážá¡ááœááºá ááá¹áááá¯ááŒáá·áºáá«
á¡áᯠááá¯.
áá®á¡áá¯áá®ááá áºá¥á®ážááááºážáááºáž
Molecule á á¡áááá¡ááŒá±á¬ááºážá¡áá¬ááŸá áºáá¯- Scenario ááŸáá·áº Driver ááᯠáá¯á¶ážáááºááŒáá·áºááŒáá«á áá¯á·á
ááŒááºááœááºáž
áá¬ááºááœáŸááºážááœáẠáááºááá·áºá¡áá¬á áááºááá·áºáá±áá¬á áááºááá¯á·áá¯ááºáá±á¬ááºááẠáá°áá±á¬ áá±á¬áºááŒáá»ááºáá«ááŸááááºá á¡áááºážááá¹ááá
áºáá¯ááœáẠáá¬ááºááœáŸááºážáá»á¬ážá
áœá¬ áá«ááŸáááá¯ááºááŒá®áž áá
áºáá¯á
á®ááẠáááºážááŒá±á¬ááºážáá
áºáá»áŸá±á¬áẠáááºážááœáŸááºáá
áºáá¯ááŒá
áºáááºá <role>/molecule/<scenario>
á
ááºážáááºááŸá¯á¡ááœáẠááá¯á¡ááºááá·áº áá¯ááºáá±á¬ááºáá»ááºáá»á¬ážááᯠáá±á¬áºááŒáá»ááºáá»á¬ážáá«ááŸááááºá áá¬ááºááœáŸááºážááŸáááááºá default
Molecule ááᯠá¡áá¯á¶ážááŒá¯á á¡áááºážááá¹áááᯠá
áááºáá«á á¡ááá¯á¡áá»á±á¬áẠáááºáá®ážáá±ážáááºááŒá
áºáá«áááºá á¡á±á¬ááºáá« script áá»á¬ážá á¡áááºáá»á¬ážááẠááá·áºáá¯á¶ážááŒáẠáá»ááºááœááºááŒá
áºáááºá
Script áá áºáá¯ááœáẠá ááºážáááºáá¯ááºáá±á¬ááºááŸá¯áá»á¬ážá á¡á á®á¡á á¥áºááᯠáá±á«áºáááºá matrixá áá¯á¶ááŸááºá¡á¬ážááŒáá·áºáááºážáááºá€áá²á·ááá¯á·ááŒá áºáááº-
(ááŒá±ááŸááºážáá»á¬ážááᯠá¡ááŸááºá¡áá¬ážááŒá¯áá¬ážáááºá ?
á¡áá¯á¶ážááŒá¯áá°á០áááºááŸááºáá¬ážááŒááºážáááŸááá«á áá°áááºážá¡ááá¯ááºáž áá»á±á¬áºááœá¬ážáááº)
lint
- ááŒá±ážáá±áá±á¬ ááááºááŒá¬áá»á¬ážá áá¯á¶áá±yamllint
Оflake8
,destroy
- Molecule ááá±á¬ááºáá¯á¶ážááœááºááŸáááŸá¯ááŸááŒá áºáááºáá»á¬ážááá¯áá»ááºááŒááºáž (áá»ááºááŸááá»áŸááº)ádependency
? - á ááºážáááºáá¬ážáá±á¬á¡áááºážááá¹áá ansible ááŸá®ááá¯ááŸá¯ááᯠááá·áºááœááºážááŒááºážásyntax
- á¡áááºážááá¹á syntax ááá¯á¡áá¯á¶ážááŒá¯á á á áºáá±ážááŒááºážáansible-playbook --syntax-check
,create
- á¥ááá¬áá áºáá¯áááºáá®ážááŒááºážáprepare
? - á¥ááá¬ááá¯ááŒááºáááº; á¥ááᬠpython2 ááᯠá á áºáá±ážááŒááºáž/ááá·áºááœááºážááŒááºážáconverge
- á ááºážáááºáá¬ážáá±á¬ playbook ááá¯ááœáá·áºááŒááºážáidempotence
- á¡á áœááºážáááºááŸá¯á ááºážáááºááŸá¯á¡ááœáẠplaybook ááᯠááŒááºááœáá·áºáá«áside_effect
? - á¡áááºážááá¹áááŸáá·áº ááá¯ááºááá¯ááºááááºááá¯ááºáá±á¬áºáááºáž á á áºáá±ážááŸá¯áá»á¬ážá¡ááœáẠááá¯á¡ááºáá±á¬ áá¯ááºáá±á¬ááºáá»ááºáá»á¬ážáverify
- áááẠconfiguration ááá¯á¡áá¯á¶ážááŒá¯á á ááºážáááºááŸá¯áá»á¬áž áá¯ááºáá±á¬ááºáá±áááºátestinfra
(áá°áááºáž) /goss
/inspec
,cleanup
? - (áá¬ážááŸááºážá¡áá áºááœááº) - á¡ááŒááºážáá»ááºážá¡á¬ážááŒáá·áºááŒá±á¬ááá»áŸáẠMolecule ááŒá±á¬áá·áºááááá¯ááºááá·áº ááŒááºáá¡ááŒá±áá¶á¡áá±á¬ááºá¡á¡á¯á¶ááᯠâááá·áºááŸááºážáá±ážâádestroy
- á¥ááá¬áá áºáá¯ááᯠáá»ááºááŒááºážá
á€á¡á á®á¡á ááºááẠá¡ááŸá¯á¡áá»á¬ážá á¯ááᯠá¡áá»á¯á¶ážáááºáá±á¬áºáááºáž ááá¯á¡ááºáá«á ááŒááºáááºááá¯ááºáááºá
á¡áááºáá±á¬áºááŒáá« á¡ááá·áºáá
áºáá¯á
á®ááᯠá¡áá¯á¶ážááŒá¯á áá®ážááŒá¬ážá
á® áá¯ááºáá±á¬ááºááá¯ááºáááºá molecule <command>
. ááá¯á·áá±á¬áº ááá¯áá²á·ááá¯á·áá±á¬ cli command áá
áºáá¯á
á®á¡ááœáẠáááºážáááá¯ááºááá¯ááºáá¯ááºáá±á¬ááºááŸá¯áá»á¬áž áááºááá¯ááºááŸáááá¯ááºáááºááᯠáááºáá¬ážáááºáá¬ážááá·áºáááºá áááºážááᯠrun ááŒááºážááŒáá·áº áááºááŸá¬ááœá±ááá¯ááºáááºá molecule matrix <command>
. á¥ááá¬á¡á¬ážááŒáá·áº command ááᯠrun áá±á¬á¡áá« converge
(á
ááºážáááºáá¬ážáá±á¬ áá
á¬ážá
á¬á¡á¯ááºááᯠá¡áá¯á¶ážááŒá¯áá±áááº) á¡á±á¬ááºáá«áá¯ááºáá±á¬ááºáá»ááºáá»á¬ážááᯠáá¯ááºáá±á¬ááºáá«áááº-
$ molecule matrix converge
...
âââ default # МазваМОе ÑÑеМаÑОÑ
âââ dependency # ÑÑÑаМПвка завОÑОЌПÑÑей
âââ create # ÑПзЎаМОе ОМÑÑаМÑа
âââ prepare # пÑеЎМаÑÑÑПйка ОМÑÑаМÑа
âââ converge # пÑПгПМ плейбÑка
á€áá¯ááºáá±á¬ááºáá»ááºáá»á¬ážá á¡ááœá²ááá¯ááºááᯠáááºážááŒááºááá¯ááºáá«áááºá á
á¬áááºážáá²á០áá
áºáá¯áᯠááŒá®ážááœá¬ážáá«áá áááºážááᯠáá»á±á¬áºááœá¬ážáá«áááºá áááºááŸáá¡ááŒá±á¡áá±á¡ááŒáẠinstance config ááᯠMolecule directory ááœáẠááááºážáááºážáá¬ážáááºá $TMPDIR/molecule/<role>/<scenario>
.
á¡ááá·áºáá»á¬ážááŸáá·áºá¡áá°ááá·áºáá«á ?
áááºá¡ááá¯ááŸááá±á¬ áá¯ááºáá±á¬ááºáá»ááºáá»á¬ážááᯠAnsible playbook áá±á¬áºáááºááœáẠáá±á¬áºááŒááá¯ááºááŒá®áž á¡ááá·áºá¡ááá¯áẠááá¯ááºá¡áááºááᯠááŒá¯áá¯ááºááá¯ááºáááº- prepare.yml
/side_effect.yml
. ဠMolecule ááá¯ááºáá»á¬ážááᯠscript folder ááœááºááŸááááºáá»áŸá±á¬áºááá·áºáá«á
áá±á¬ááºážáá°
áá¬ááºáá±á¬ááºážááẠá
ááºážáááºááŸá¯áá»á¬ážá¡ááœáẠáá¬áááá»á¬ážááᯠáááºáá®ážááá·áº á¡áá¬áá
áºáá¯ááŒá
áºáááºá
Molecule ááœáẠá¡áááºááá·áºáá¯ááºáá¬ážáá±á¬ ááá°áá¬áá»á¬ážáá«ááŸáááá·áº á
á¶áá¬ááºáá±á¬ááºážáá»á¬ážá
á¬áááºážááŸá¬- Azureá Dockerá EC2á GCEá LXCá LXDá OpenStacká Vagrantá Delegatedá
ááá
á¹á
á¡áá»á¬ážá
á¯ááœááºá ááá°áá¬áá»á¬ážááẠááá¯ááºáá»á¬ážááŒá
áºáááºá create.yml
О destroy.yml
áá¬ááºááœáŸááºážááᯠáááºáá®ážááŒááºážááŸáá·áº áá»ááºááŒááºážááá¯á·ááᯠá¡áá®ážáá®ážáá±á¬áºááŒááá·áº script ááá¯ááºááœá²ááœááºá
ááŒáœááºážáá»ááºáá»á¬ážááẠDocker ááŸáá·áº Vagrant ááŒá
áºáááºá á¡áááºááŒá±á¬áá·áºááá¯áá±á¬áº áááºážááá¯á·á module áá»á¬ážááŸáá·áº á¡ááŒááºá¡ááŸááºáááºááœááºááŸá¯áá»á¬ážááẠá¡áááºáá«ááá¯ááºáá»á¬ážááá«áá² ááŒá
áºáá±á«áºááá¯ááºáááºá
Delegated Driver ááᯠáá®ážáá±á¬ááºážááá¯ážááŒááŒááºážááẠáááºážááá¯á¡áá¯á¶ážááŒá¯áá«áá instance áááºáá®ážááŒááºážááŸáá·áº áá»ááºááŒááºážááá¯ááºáá»á¬ážááœááºáᬠáá±á¬áºááŒáá¬ážáá±á¬ áá¯ááºáá±á¬ááºáá»ááºáá»á¬ážááá¯áᬠá¡ááºáá»ááºáá®áá¬á áá±á¬áºááŒááááºááŒá áºááŒá®áž áá»ááºá¡áá¬áá»á¬ážááᯠá¡ááºáá»ááºáá®áá¬á áá±á¬áºááŒááá·áºáá«áááºá
áá°áááºážáááá¯ááºáá¬ááẠDocker ááŒá áºáááºá
á¡áᯠáááºááŒá®áž áá±á·áá»áá·áºááŒá®áž á¡á²áá®ááŸá¬ áá±á¬ááºááẠá¡ááºá¹áá«áááºááœá±ááᯠá ááºážá á¬ážááŒáá·áºáá¡á±á¬ááºá
á áááº
"hello world" á¡áá±ááŒáá·áº áá»áœááºá¯ááºááá¯á·ááẠááá¯ážááŸááºážáá±á¬ nginx áááºáááºááŸá¯á¡áááºážááá¹áááᯠá ááºážáááºáá«áááºá docker ááᯠáááá¯ááºáá¬á¡ááŒá Ạááœá±ážááŒáá«á áá¯á· - á¡áá»á¬ážá á¯ááŸá¬ áááºážááᯠááá·áºááœááºážáá¬ážááŒá®ážááŒá® (ááá¯á·ááŒáẠdocker ááẠáá¯á¶áá±áááá¯ááºáá¬ááŒá áºáááº)á
ááŒááºáááºáá¬áž virtualenv
áááºážááœááºááá·áºááœááºážáá«á molecule
:
> pip install virtualenv
> virtualenv -p `which python2` venv
> source venv/bin/activate
> pip install molecule docker # molecule ÑÑÑÐ°ÐœÐŸÐ²ÐžÑ ansible как завОÑОЌПÑÑÑ; docker ÐŽÐ»Ñ ÐŽÑайвеÑа
áá±á¬ááºáá
áºááá·áºááŸá¬ á¡áááºážááá¹áá¡áá
áºáá
áºáá¯ááᯠá
áááºáááºááŒá
áºáááºá
á¡áááºážááá¹áá¡áá
áºááŸáá·áº áá¬ááºááœáŸááºážá¡áá
áºáá
áºáá¯á á¡á
ááŒá¯ááŒááºážááᯠá¡áááá·áºááᯠá¡áá¯á¶ážááŒá¯á áá¯ááºáá±á¬ááºáááºá 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
ááááºááŸá¬ áá¯á¶ááŸáẠansible á¡áááºážááá¹ááá áºáá¯ááŒá áºáááºá ááá¯á·á¡ááŒááºá Molecules CLI ááŸáá·áº á¡ááŒááºá¡ááŸááºáá¯á¶á·ááŒááºááŸá¯á¡á¬ážáá¯á¶ážááᯠá¡áááºážááá¹á root á០ááŒá¯áá¯ááºáá¬ážáááºá
á¡áááºážááá¹ááááºážááœáŸááºááœáẠáá¬ááœá±áá«áá² ááŒáá·áºáá¡á±á¬ááºá
> tree molecule/default/
molecule/default/
âââ Dockerfile.j2 # Jinja-ÑаблПМ ÐŽÐ»Ñ Dockerfile
âââ INSTALL.rst. # ÐеЌМПгП ОМÑПÑЌаÑОО Пб ÑÑÑаМПвке завОÑОЌПÑÑей ÑÑеМаÑОÑ
âââ molecule.yml # Ѐайл кПМÑОгÑÑаÑОО
âââ playbook.yml # ÐлейбÑк запÑÑка ÑПлО
âââ tests # ÐОÑекÑПÑÐžÑ Ñ ÑеÑÑаЌО ÑÑаЎОО verify
âââ test_default.py
1 directory, 6 files
Config ááá¯ááŒáá·áºáá¡á±á¬áẠmolecule/default/molecule.yml
(áá»áœááºá¯ááºááá¯á·ááẠ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
ááŸá®ááá¯
á€á¡ááá¯ááºážááẠááŸá®ááá¯ááŸá¯áá¡áááºážá¡ááŒá áºááᯠáá±á¬áºááŒáááºá
á¡ááá¯áá«ááœá±ážáá»ááºááŸá¯áá»á¬ážáá±áá±á¬áá±á«ááºážá
ááº:
Shell ááẠgalaxy ááŸáá·áº gilt ááẠááá·áºááá¯á¡ááºáá»ááºáá»á¬ážááᯠááá¯á¶ážááœááºáá«á á¡áá¯á¶ážááŒá¯ááẠááá¯ážááŸááºážáá±á¬ command shell áá áºáá¯ááŒá áºáááºá
áá«áá®ááŸá¬ááŒá¬ááŒá¬áá±ááŸá¬ááá¯ááºáá°ážá áá¯á¶áá±á¬ááºá
áœá¬áá±á¬áºááŒáá¬ážáááºá
áá±á¬ááºážáá°
áá¬ááºáá±á¬ááºážá¡áááºá áá«ááá¯á·á¡ááœáẠáá«á docker áá«á
Plus ááá¯
Yamllint ááᯠááááºá¡ááŒá áºá¡áá¯á¶ážááŒá¯áááºá
config á á€á¡ááá¯ááºážááŸá á¡áá¯á¶ážáááºáá±á¬ááœá±ážáá»ááºá áá¬áá»á¬ážááẠyamllint á¡ááœáẠconfiguration file áá áºáá¯áááºááŸááºááá¯ááºááŸá¯á forward environment variables ááá¯á·ááá¯áẠlinter ááᯠdisable áá¯ááºááŒááºážááŒá áºáááº-
lint:
name: yamllint
options:
config-file: foo/bar
env:
FOO: bar
enabled: False
ááááºáá±á¬ááºáž
áá¬áááá»á¬ážáááœá²á·á
ááºážáá¯á¶ááá¯áá±á¬áºááŒáááºá
docker ááẠáááá¯ááºáá¬áá
áºáŠážááŒá
áºááŒá®ážá Molecule ááẠá€á¡ááá¯ááºážááᯠáááºáá«ááá²áá²áá¯ááºáá±á¬ááºááŒá®áž á
á¬áááºážáááŒááºá
ááºáá
áºáá¯á
á®ááœáẠáááá¯ááºááẠDockerfile.j2
variable á¡ááŒá
Ạitem
.
áááá¯ááºáá¬áá
áºáŠážáá¡ááŸá¯áá create.yml
О destroy.yml
á á¡ááá¯ááºážááᯠáááºážááá¯á·ááœáẠáááŸáááá¯ááºáááºá molecule_yml.platforms
ááŸáá·áº áááºážááŸáá·áºáááºáááºáá±á¬ áááºáá±á¬ááºážááŸá¯áá»á¬ážááᯠá€ááá¯ááºáá»á¬ážááœáẠáá±á¬áºááŒáá¬ážááŒá®ážááŒá
áºáááºá
Molecule ááẠAnsible modules áá»á¬ážááá¯á· instance management ááᯠáá¶á·ááá¯ážáá±ážáá±á¬ááŒá±á¬áá·áºá áááºááẠááŒá
áºááá¯ááºááá·áº áááºáááºáá»á¬ážá
á¬áááºážááᯠááá¯áá±áá¬ááœáẠááŸá¬ááœá±ááá·áºáááºá á¥ááᬠDocker á¡ááœááºá module ááá¯á¡áá¯á¶ážááŒá¯áááºá
á¡áá»áá¯ážáá»áá¯ážáá±á¬ drivers áá»á¬ážááá¯á¡áá¯á¶ážááŒá¯ááŒááºážáááá°áá¬áá»á¬ážááá¯áááºážáááºááœá±á·ááá¯ááºáááºá
áá®ááŸá¬ á¡á á¬ážááá¯ážááŒáá·áºáá¡á±á¬áẠáááá¯áá»ááºáá»á¬áž:á á¡áá±á«áº ubuntu.
á á®áá¶áá±ážáá°
âáá¶á·ááá¯ážáá±ážáá°â ááẠááŒá
áºáááºáá»á¬ážááᯠá
á®áá¶ááá·áºááœá²ááá·áº á¡ááœá²á·á¡á
ááºážááŒá
áºáááºá Molecule áááá
á¹á
ááœááºá áááºážááẠá¡áá¯á¶ážááŒá¯ááá¯ááºáááºá á¡ááŒá¬ážáá°áá»á¬ážá¡ááœáẠáá¶á·ááá¯ážáá°áá®ááŸá¯á¡á¬áž á
á®á
ááºáá¬ážááŒááºážáááŸááá«á ááá¯á·ááŒá±á¬áá·áº á€á¡ááá¯ááºážááᯠááŒáá¯áááºá
á¬áááºážááœááºážááŒááºážááŒáá·áºá ááá¯ážáá»á²á·áá¬ážáá±á¬ ansible configuration áá¯áá±á«áºááœááºááá¯ááºáá«áááºá
á€áá±áá¬ááœáẠáááºáá±á¬ááºááŒááá¯ááºáááºáá»á¬áž á¡áá»á¬ážá¡ááŒá¬ážááŸááá±á¬áºáááºáž áá»áœááºá¯ááºáá¡ááŒááºá¡á á¡áááá¡áá»ááºáá»á¬ážááᯠáá®ážáá±á¬ááºážááá¯ážááŒáá«áááºá
- á á¬á¡á¯ááºáá»á¬áž- á¡áá»áá¯á·áá±á¬á¡ááá·áºáá»á¬ážááœáẠáááºááá·áº playbooks ááᯠá¡áá¯á¶ážááŒá¯ááá·áºáááºááᯠáááºáááºááŸááºááá¯ááºáá«áááºá
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
- áá»áááºáááºááŸá¯_ááœá±ážáá»ááºááŸá¯áá»á¬áž: ááœá±ážáá»ááºááŸá¯áá»á¬áž
áááºááœááºááŸá¯áá»á¬áž
provisioner:
name: ansible
connection_options:
ansible_ssh_common_args: "-o 'UserKnownHostsFile=/dev/null' -o 'ForwardAgent=yes'"
- ááœá±ážáá»ááºááŸá¯áá»á¬áž: áááá¬áááºááŸá¬ážáá±á¬ áá±á¬ááºáá»á¬áž ááŸáá·áº áááºáááºážáá»áẠááááºážááŸááºáá»á¬áž
provisioner:
name: ansible
options:
vvv: true
diff: true
env:
FOO: BAR
ááŒááºááœááºáž
áá±á«ááºážá
ááºááŸáá·áº áá¬ááºááœáŸááºážá¡ááœá²áá»á¬ážá áá±á¬áºááŒáá»ááºá
áá±á¬á·ááá¯ááá·áºááŒááºážááŒáá·áº áááºááẠcommand áá
áºáá¯á áá¯á¶áá±áá¯ááºáá±á¬ááºáá»áẠmatrix ááᯠááŒá±á¬ááºážáá²ááá¯ááºáááºá <command>_sequence
áááºážá¡ááœáẠáááºááá¯ážáá
áºáá¯á¡áá±ááŒáá·áº áá»áœááºá¯ááºááá¯á·ááá¯á¡ááºáá±á¬ á¡ááá·áºáá»á¬ážá
á¬áááºážááᯠáááºááŸááºááŒááºážá
playbook run command ááᯠrun áá±á¬á¡áá« áá¯ááºáá±á¬ááºáá»ááºáá»á¬ážá sequence ááá¯ááŒá±á¬ááºážááá¯áááºááá¯ááŒáá«á
áá¯á·á molecule converge
# ОзМаÑалÑМП:
# - dependency
# - create
# - prepare
# - converge
scenario:
name: default
converge_sequence:
- create
- converge
á á áºáá±ážááŒááºáž
á
á¬áá±ážááœá²áá»á¬ážá¡ááœáẠáá°áá±á¬ááºáá
áºáá¯ááŸáá·áº áááºážá¡ááœáẠáá®áá¬áá
áºáᯠáááºáá±á¬ááºááŒááºážá áá¯á¶ááŸááºá¡á¬ážááŒáá·áºá linter ááá¯á¡áá¯á¶ážááŒá¯áááºá testinfra
О flake8
. ááŒá
áºááá¯ááºáá±á¬ááœá±ážáá»ááºááŸá¯áá»á¬ážááẠá¡áááºáá±á¬áºááŒáá«áá»á¬ážááŸáá·áº áááºáá°áááº-
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
áá«ááá¯á·áá²á·á¡áááºážááá¹áááá¯ááŒááºááŒáá¡á±á¬ááºá ááá¯ááºááᯠáááºážááŒááºááŒáá«á
áá¯á· tasks/main.yml
á€ááŒáá·áºáááº-
---
- name: Install nginx
apt:
name: nginx
state: present
- name: Start nginx
service:
name: nginx
state: started
ááŒá®ážáá±á¬á· á
á¬áá±ážááœá²ááœá± áááºááá·áºáááºá 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")
ááŒá®ážáá«ááŒá®á áá»ááºáá¬á¡á¬ážáá¯á¶ážá run ááá¯á·áá«áá² (á¡áááºážáá²á· á¡áááºážááá±á áááºážááᯠááááá±ážáá«áá á±)
> molecule test
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
áá»áœááºá¯ááºááá¯á·á ááá¯ážááŸááºážáá±á¬á¡áááºážááá¹áááᯠááŒá¿áá¬áááŸááá² á
ááºážáááºáá²á·áááºá
áááºáááºáá±á
ááºá¡ááœááºáž ááŒá¿áá¬áá»á¬áž ááŒá
áºáá±á«áºáá¬áá«á áááááŒá¯ááá·áºáááºá molecule test
á¡áááºá áááºááẠstandard sequence ááá¯áááŒá±á¬ááºážáá²áá«áá Molecule ááẠinstance ááá¯áá»ááºáá«áááºá
á¡á±á¬ááºáá« command áá»á¬ážááẠá¡ááŸá¬ážááŸá¬ááŒááºááŒááºážá¡ááœáẠá¡áá¯á¶ážáááºáááº-
> molecule --debug <command> # debug info. ÐÑО ПбÑÑМПЌ запÑÑке ÐПлекÑла ÑкÑÑÐ²Ð°ÐµÑ Ð»ÐŸÐ³Ðž.
> molecule converge # ÐÑÑавлÑÐµÑ ÐžÐœÑÑÐ°ÐœÑ Ð¿ÐŸÑле пÑПгПМа ÑеÑÑОÑÑеЌПй ÑПлО.
> molecule login # ÐайÑО в ÑПзЎаММÑй ОМÑÑаМÑ.
> molecule --help # ÐПлМÑй ÑпОÑПк кПЌаМЎ.
ááŸáááŒá®ážáá¬ážá¡áááºážááá¹á
ááŸáááŒá®ážáá¬ážá¡áááºážááá¹ááá áºáá¯ááá¯á· áá¬ááºááœáŸááºážá¡áá áºáá áºáá¯ááá·áºááŒááºážááẠááŒá áºáá±á«áºáá«áááºá á¡áááºážááá¹ááááºážááœáŸááºá០á¡á±á¬ááºáá« command áá»á¬ážááŒáá·áº
# пПлМÑй ÑпОÑПк ЎПÑÑÑпМÑÑ
паÑаЌеÑÑПв
> molecule init scenarion --help
# ÑПзЎаМОе МПвПгП ÑÑеМаÑОÑ
> molecule init scenario -r <role_name> -s <scenario_name>
áááºážááẠá¡áááºážááá¹áááœáẠááááá¯á¶áž áá¬ááºááœáŸááºážááŒá
áºáá«áá ááá¯á·áá±á¬áẠááá·áºáááºáá»áẠ-s
áá¬ááºááœáŸááºážáá
áºáá¯ááᯠáááºáá®ážáááºááŒá
áºáá±á¬ááŒá±á¬áá·áº áá»ááºááŸááºáá¬ážááá¯ááºáááºá default
.
áá±á¬ááºáá»ááº
áááºááœá±á·ááŒááºáááá·áºá¡ááá¯ááºážá Molecule ááẠá¡ááœááºááŸá¯ááºááœá±ážááŒááºážáááŸááá«á áááºáááá¯ááºááá¯ááºáá¯á¶á á¶áá»á¬ážááá¯á¡áá¯á¶ážááŒá¯ááá·áºá¡áá«á instances áá»á¬ážáááºáá®ážááŒááºážááŸáá·áº áá»ááºááŒááºážá¡ááœáẠplaybooks ááŸá variable áá»á¬ážááá¯áááºážááŒááºááŒááºážááá¯á· script á¡áá áºáá áºáá¯áááŒáá·áºáá»ááºááŸá¯ááᯠáá»áŸá±á¬á·áá»ááá¯ááºáááºá áá±á¬áºáá®áá»á°ážááẠCI á áá áºáá»á¬ážááŸáá·áº áá»á±á¬ááœá±á·á áœá¬ áá±á«ááºážá ááºáá¬ážááŒá®ážá áááºážááẠááá±ážááœááºáá»á¬ážááᯠááá¯ááºááá¯ááºá ááºážáááºááẠá¡áá»áááºááᯠáá»áŸá±á¬á·áá»ááŒááºážááŒáá·áº ááœá¶á·ááŒáá¯ážááá¯ážáááºááŸá¯á¡ááŒááºááŸá¯ááºážááᯠááá¯ážááŒáŸáá·áºááá¯ááºá á±áá«áááºá
ááá¯á áá¯ááºáá²á·á¡ááœááºáá»á±ážáá°ážáááºáá«áááºá ááá·áºááœáẠá áœááºážáá±á¬ááºááá¯ááºáá±á¬ á¡áááºážááá¹ááá»á¬ážááᯠá ááºážáááºááŒááºáž á¡ááœá±á·á¡ááŒá¯á¶ááŸáááŒá®ážá áááºážááẠMolecule ááŸáá·áº ááááºááá¯ááºáá«á áááºážá¡ááŒá±á¬ááºážááᯠááŸááºáá»ááºáá»á¬ážááœáẠááŒá±á¬ááŒáá«á
source: www.habr.com