ืฉืืื ืืืืื!
ืื ื ืขืืื ืืืื ืืก DevOps ืืฉืืจืืช ืืืื ืช ืืืื ืืช.
ื- Ostrovok.ru, ืื ื ืืฉืชืืฉืื ื- ansible ืืื ืื ืชืฆืืจื. ืืืืจืื ื, ืืืขื ื ืืฆืืจื ืืืืืง ืชืคืงืืืื, ืืื ืืคื ืฉืืชืืจืจ, ืืื ืื ืื ืืจืื ืืืื ืืื - ืืคืืคืืืจื ืืืืชืจ, ืืืื, ืืื ื-Molecule framework, ืื ืืืืื ื ืืืฉืชืืฉ ืื. ืืื ืืชืืจืจ ืฉืืชืืขืื ืฉืื ืฉืืชืง ืขื ืืืืืืืช ืจืืืช. ืื ืืฆืืื ื ืืืฆืื ืืืจืื ืืคืืจื ืืกืคืืง ืืจืืกืืช, ืื ืืืืื ื ืืืชืื ืืืืจ ืื.
ืืืืงืืื
ืชืืืืจ ืคืฉืื: ืืืืืงืืื ืืืฆืจืช ืืืคืข ืืคืืืคืืจืื ืฉืฆืืื ืช (ืขื ื, ืืืื ื ืืืจืืืืืืช, ืืืื; ืืคืจืืื ื ืืกืคืื, ืขืืื ืืกืขืืฃ
ืขืืฉืื ืืืชืจ ืคืืจืื.
ืงืฆืช ืชืืืืจืื
ืฉืงืื ืฉืชื ืืฉืืืืช ืืคืชื ืฉื ืืืืืงืืื: ืชืจืืืฉ ืื ืื.
ืชึทืจืึดืืฉื
ืืชืกืจืื ืืืื ืชืืืืจ ืฉื ืื, ืืืคื, ืืื ืืืืืื ืจืฆืฃ ืืืืฆืข. ืืชืคืงืื ืืื ืืืืืื ืืืืืช ืืกืคืจ ืกืงืจืืคืืื, ืืื ืืื ืืื ืืื ืกืคืจืืื ืืืืจื ืื ืชืื <role>/molecule/<scenario>
, ืืืืื ืชืืืืจืื ืฉื ืืคืขืืืืช ืื ืืจืฉืืช ืืืืืงื. ืืฉ ืืืืื ืกืงืจืืคื default
, ืฉืืืืืฆืจ ืืืืืืืืช ืื ืืชื ืืืชืื ืืช ืืชืคืงืื ืขื ืืืืงืืื. ืืฉืืืช ืฉื ืืชืกืจืืืื ืืืืื ืชืืืืื ืื.
ืจืฆืฃ ืคืขืืืืช ืืืืืงื ืืกืงืจืืคื ื ืงืจื ืึทืืจึดืืฆึธื, ืืืืจืืจืช ืืืื ืื:
(ืฉืืืื ืืกืืื ืื ?
, ืืืืื ืืืจืืจืช ืืืื ืื ืื ืฆืืื ืขื ืืื ืืืฉืชืืฉ)
lint
- ืจืืฆืช linters. ืืืจืืจืช ืืืื ืืฉืืฉืืyamllint
ะธflake8
,destroy
- ืืืืงืช ืืืคืขืื ืืืืฉืงื ืืืืจืื ื ืฉื ืืืืืงืืื (ืื ืืฉ),dependency
? - ืืชืงื ื ืฉื ืืชืืืช ืืืคืฉืจืืช ืฉื ืืชืคืงืื ืื ืืืง,syntax
- ืืืืงืช ืืชืืืืจ ืฉื ืืชืคืงืื ืืืืฆืขืืชansible-playbook --syntax-check
,create
- ืืฆืืจืช ืืืคืข,prepare
? - ืืื ืช ืืขืจืืื; ืืืฉื ืืืืง/ืืชืงื ืืช python2converge
- ืืฉืงืช ืกืคืจ ืืืฉืืงืื ืื ืืืง,idempotence
- ืืคืขืื ืืืืฉ ืฉื ืกืคืจ ืืืฉืืงืื ืขืืืจ ืืืื ืืืืืืคืืื ืฆืื,side_effect
? - ืคืขืืืืช ืฉืืื ื ืงืฉืืจืืช ืืฉืืจืืช ืืชืคืงืื, ืื ื ืืืฆืืช ืืืืื ืื,verify
- ืืคืขืืช ืืืืงืืช ืฉื ืืชืฆืืจื ืืืชืงืืืช ืืืืฆืขืืชtestinfra
(ืืจืืจืช ืืืื) /goss
/inspec
,cleanup
? - (ืืืจืกืืืช ืืืฉืืช) - ืืืืคื ืืก, "ื ืืงืื" ืืชืฉืชืืช ืืืืฆืื ืืช ืืืืฉืคืขืช ืืืืืืงืืื,destroy
- ืืืืงืช ืืืคืข.
ืจืฆืฃ ืื ืืืกื ืืช ืจืื ืืืงืจืื, ืื ื ืืชื ืืฉื ืืช ืืืชื ืืืืืช ืืฆืืจื.
ื ืืชื ืืืคืขืื ืื ืืื ืืืฉืืืื ืืขืื ืื ืคืจื molecule <command>
. ืืื ืฆืจืื ืืืืื ืฉืืื ืคืงืืืช cli ืืื ืขืฉืื ืืืืืช ืจืฆืฃ ืคืขืืืืช ืืฉืื, ืฉืืืชื ืชืืื ืืืืืช ืขื ืืื ืืืฆืืข molecule matrix <command>
. ืืืืืื, ืืขืช ืืคืขืืช ืืคืงืืื converge
(ืืคืขืื ืืช ืกืคืจ ืืืฉืืงืื ืื ืืืง), ืืคืขืืืืช ืืืืืช ืืืืฆืขื:
$ molecule matrix converge
...
โโโ default # ะฝะฐะทะฒะฐะฝะธะต ััะตะฝะฐัะธั
โโโ dependency # ัััะฐะฝะพะฒะบะฐ ะทะฐะฒะธัะธะผะพััะตะน
โโโ create # ัะพะทะดะฐะฝะธะต ะธะฝััะฐะฝัะฐ
โโโ prepare # ะฟัะตะดะฝะฐัััะพะนะบะฐ ะธะฝััะฐะฝัะฐ
โโโ converge # ะฟัะพะณะพะฝ ะฟะปะตะนะฑัะบะฐ
ื ืืชื ืืขืจืื ืืช ืจืฆืฃ ืืคืขืืืืช ืืืื. ืื ืืฉืื ืืืจืฉืืื ืืืจ ื ืขืฉื, ืืื ืืืื. ืืืฆื ืื ืืืื, ืืื ืื ืชืฆืืจืช ืืืืคืขืื, ื-Molecule ืืืืกื ืช ืืกืคืจืืื $TMPDIR/molecule/<role>/<scenario>
.
ืืืกืฃ ืฉืืืื ืขื ?
ืืชื ืืืื ืืชืืจ ืืช ืืคืขืืืืช ืืจืฆืืืืช ืืคืืจืื ansible-playbook, ืืืืฆืืจ ืืช ืฉื ืืงืืืฅ ืืคื ืืฉืื: prepare.yml
/side_effect.yml
. ืฆืคื ืืงืืฆืื ืืืื ืืืืืงืืื ืชืืื ืืชืืงืืืช ืืกืงืจืืคื.
ื ืื
ืื ืื ืืชืงื ืืื ืืฉืืช ืฉืื ื ืืฆืจืื ืืืคืขื ืืืืงื.
ืจืฉืืืช ืื ืืื ืืืชืงื ืืกืื ืืจืืืื ืฉืขืืืจื ืืืืืงืืื ืืฉ ืชืื ืืืช ืืืื ืืช ืืื ืืืืงืื: Azure, Docker, EC2, GCE, LXC, LXD, OpenStack, Vagrant, Delegated.
ืืจืื ืืืงืจืื, ืชืื ืืืช ืื ืงืืฆืื create.yml
ะธ destroy.yml
ืืชืืงืืืช ืืกืงืจืืคื ืืืชืืจืช โโืืฆืืจื ืืืืืงื ืฉื ืืืคืข, ืืืชืืื.
ืืืฆืื ืืืืคื ืื Docker ื- Vagrant, ืฉืื ืืื ืืจืืงืฆืืืช ืขื ืืืืืืืื ืฉืืื ืืืืืืช ืืืชืจืืฉ ืืื ืืงืืฆืื ืฉืืืืืจื ืืขืื.
ืืืื ืืืืืืฉ ืืช ืื ืื ืืืชืงื Delegated, ืฉืื ืื ืืื ืืฉืืฉ ืืงืืฆืื ืืืฆืืจื ืืืืืงื ืฉื ืืืคืข, ืืชืืืจืช ืจืง ืขืืืื ืขื ืชืฆืืจืช ืืืืคืขืื, ืืฉืืจ ืฆืจืื ืืืืืช ืืชืืืจ ืขื ืืื ืืืื ืืก.
ืื ืื ืืืชืงื ืืืืืืจ ืืืจืืจืช ืืืื ืืื Docker.
ืืขืช ื ืขืืืจ ืืชืจืืื ืื ืืื ืชืืื ืืช ื ืืกืคืืช ืฉื.
ืชืืืืช ืืขืืืื
ืืชืืจ "ืฉืืื ืขืืื", ืืืื ื ืืืืง ืชืคืงืื ืคืฉืื ืฉื ืืชืงื ืช nginx. ืืื ื ืืืจ ื-docer ืืื ืื ืืืชืงื - ืื ื ืืืฉื ืฉืืจืืืื ืื ืืืชืงื (ืืืืจื ืฉ-docer ืืื ืื ืื ืืืชืงื ืืืืืืจ ืืืจืืจืช ืืืื).
ืืืืื 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
ืื ืืชืืจืจ ืชืคืงืื ืื ืกืืื ืืืคืืกื. ืืชืจ ืขื ืื, ืื ืืืื ืืจืืงืฆืืืช ืขื ืืืืงืืืืช CLI ื ืขืฉืืช ืืฉืืจืฉ ืืชืคืงืื.
ืืื ื ืจืื ืื ืืฉ ืืกืคืจืืืช ืืชืคืงืืืื:
> tree molecule/default/
molecule/default/
โโโ Dockerfile.j2 # Jinja-ัะฐะฑะปะพะฝ ะดะปั Dockerfile
โโโ INSTALL.rst. # ะะตะผะฝะพะณะพ ะธะฝัะพัะผะฐัะธะธ ะพะฑ ัััะฐะฝะพะฒะบะต ะทะฐะฒะธัะธะผะพััะตะน ััะตะฝะฐัะธั
โโโ molecule.yml # ะคะฐะนะป ะบะพะฝัะธะณััะฐัะธะธ
โโโ playbook.yml # ะะปะตะนะฑัะบ ะทะฐะฟััะบะฐ ัะพะปะธ
โโโ tests # ะะธัะตะบัะพัะธั ั ัะตััะฐะผะธ ััะฐะดะธะธ verify
โโโ test_default.py
1 directory, 6 files
ืืืื ื ื ืชื ืืช ืืชืฆืืจื 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
ืืชืืืช
ืกืขืืฃ ืื ืืชืืจ ืืช ืืงืืจ ืืชืืืช.
ืืคืฉืจืืืืช ืืคืฉืจืืืช:
ืืขืืคืช ืืื ืจืง ืืขืืคืช ืคืงืืื ืืืฉืืฉืช ืืืงืจื ืฉืืืงืกืื ืืืืงืกืื ืื ืืืกืื ืืช ืืฆืจืืื ืฉืื.
ืื ื ืื ืืชืขืื ืืื ืืจืื ืืื, ืื ืืกืคืืง ืืชืืืจ ื
ื ืื
ืฉื ืื ืื. ืฉืื ื ืืื ืืืงืจ.
ืืื
ื-linter ืืื yamllint.
ืืคืฉืจืืืืช ืฉืืืืฉืืืช ืืืืง ืื ืฉื ืืชืฆืืจื ืื ืืืืืืช ืืฆืืื ืงืืืฅ ืชืฆืืจื ืขืืืจ yamllint, ืืฉืชื ื ืกืืืื ืงืืืื ืื ืืืฉืืืช ืืช ื-linter:
lint:
name: yamllint
options:
config-file: foo/bar
env:
FOO: bar
enabled: False
ืคืืืคืืจืืืช
ืืชืืจ ืืช ืชืฆืืจืช ืืืืคืขืื.
ืืืงืจื ืฉื docker ืื ืื, ืืืืืงืืื ืขืืืจืช ืขื ืกืขืืฃ ืื, ืืื ืจืืื ืืจืฉืืื ืืืื ื Dockerfile.j2
ืืชืืจ ืืฉืชื ื item
.
ืืืงืจื ืฉื ื ืื ืฉืืืจืฉ create.yml
ะธ destroy.yml
, ืืืืืจ ืืืื ืืื ื molecule_yml.platforms
, ืืืืืจืฆืืืช ืขืืื ืืืจ ืืชืืืจืืช ืืงืืฆืื ืืื.
ืืืืืื ืฉืืืืืงืืื ืืกืคืงืช ืฉืืืื ืขื ืืืคืขืื ืืืืืืืื ืืคืฉืจืืื, ืืฉ ืืืคืฉ ืฉื ืื ืืช ืจืฉืืืช ืืืืืจืืช ืืืคืฉืจืืืช. ืขืืืจ docker, ืืืฉื, ื ืขืฉื ืฉืืืืฉ ืืืืืื
ืืื ืื ื ืืชื ืืืฆืื ืืืืืืืช ืืฉืืืืฉ ืืืจืืืืจืื ืฉืื ืื
ืืืืฃ ืืื ืกื ืืืก: 7 ืขื ืืืืื ืื.
ืืกืคืง
"ืกืคืง" - ืืฉืืช ืืื ืืืช ืืืคืขืื. ืืืงืจื ืฉื ืืืืงืืื, ืื ืืคืฉืจื, ืชืืืื ืืืืจืื ืื ืืชืืื ื ืช, ืื ืฉื ืืชื ืืงืจืื ืืกืขืืฃ ืื ืชืฆืืจื ืืืจืืืช ืืชืืืื ืขื ืืืืจื.
ืืื ืืชื ืืืื ืืฆืืื ืืจืื ืืืจืื, ืื ื ืืืืืฉ ืืช ืื ืงืืืืช ืืขืืงืจืืืช, ืืืขืชื:
- ืกืคืจื ืืฉืืง: ืืชื ืืืื ืืฆืืื ืืืืื ืกืคืจื ืืฉืืง ืืฉ ืืืฉืชืืฉ ืืฉืืืื ืืกืืืืื.
provisioner:
name: ansible
playbooks:
create: create.yml
destroy: ../default/destroy.yml
converge: playbook.yml
side_effect: side_effect.yml
cleanup: cleanup.yml
- config_options:
ืชืฆืืจื ื ืกืืืช
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>_sequence
ืืืขืจื ืขืืืจื ืขื ืืื ืืืืจืช ืจืฉืืืช ืืฉืืืื ืฉืื ื ืฆืจืืืื.
ื ื ืื ืฉืื ื ืจืืฆืื ืืฉื ืืช ืืช ืจืฆืฃ ืืคืขืืืืช ืืขืช ืืคืขืืช ืคืงืืืช ืืืคืขืื ืฉื ื-playbook: molecule converge
# ะธะทะฝะฐัะฐะปัะฝะพ:
# - dependency
# - create
# - prepare
# - converge
scenario:
name: default
converge_sequence:
- create
- converge
ืืืืช
ืืงืืช ืืกืืจืช ืืืืื ืื ืืืืื ืืจ ืืืื. ืืจืืจืช ืืืืื ืืื 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")
ืกืืื, ื ืืชืจ ืจืง ืืจืืฅ (ืืืฉืืจืฉ ืฉื ืืชืคืงืื, ืืจืฉื ืื ืืืืืืจืื):
> molecule test
ืืืืื ืืจืื ืืชืืช ืืกืคืืืืจ:
--> 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
, ืื ืื ืื ืฉืื ืืช ืืช ืจืฆืฃ ืืจืืจืช ืืืืื, ืืืืืงืืื ืชืืืง ืืช ืืืืคืข.
ืืคืงืืืืช ืืืืืช ืฉืืืืฉืืืช ืื ืืคืื ืืืืื:
> molecule --debug <command> # debug info. ะัะธ ะพะฑััะฝะพะผ ะทะฐะฟััะบะต ะะพะปะตะบัะปะฐ ัะบััะฒะฐะตั ะปะพะณะธ.
> molecule converge # ะััะฐะฒะปัะตั ะธะฝััะฐะฝั ะฟะพัะปะต ะฟัะพะณะพะฝะฐ ัะตััะธััะตะผะพะน ัะพะปะธ.
> molecule login # ะะฐะนัะธ ะฒ ัะพะทะดะฐะฝะฝัะน ะธะฝััะฐะฝั.
> molecule --help # ะะพะปะฝัะน ัะฟะธัะพะบ ะบะพะผะฐะฝะด.
ืชืคืงืื ืงืืื
ืืืกืคืช ืกืงืจืืคื ืืืฉ ืืชืคืงืื ืงืืื ืืื ืืชืื ืกืคืจืืืช ืืชืคืงืืืื ืขื ืืคืงืืืืช ืืืืืช:
# ะฟะพะปะฝัะน ัะฟะธัะพะบ ะดะพัััะฟะฝัั
ะฟะฐัะฐะผะตััะพะฒ
> molecule init scenarion --help
# ัะพะทะดะฐะฝะธะต ะฝะพะฒะพะณะพ ััะตะฝะฐัะธั
> molecule init scenario -r <role_name> -s <scenario_name>
ืืืงืจื ืฉืืื ืืชืจืืืฉ ืืจืืฉืื ืืชืคืงืื, ืื ืืคืจืืืจ -s
ื ืืชื ืืืฉืืื ืืืืืื ืฉืืื ืืืฆืจ ืกืงืจืืคื default
.
ืืกืงื ื
ืืคื ืฉืืชื ืืืื ืืจืืืช, ืืืืืงืืื ืืื ื ืืืจืืืช ืืืืืื, ืืขื ืืื ืฉืืืืฉ ืืชืื ืืืช ืืฉืื, ื ืืชื ืืฆืืฆื ืคืจืืกืช ืกืงืจืืคื ืืืฉ ืืขืจืืืช ืืฉืชื ืื ืืกืคืจื ืืืคืขืื ืืืืืืงื ืฉื ืืืคืขืื. ืืืืืงืืื ืืฉืชืืืช ืืฆืืจื ืืืงื ืขื ืืขืจืืืช CI, ืื ืฉืืืคืฉืจ ืื ืืืืืืจ ืืช ืืืืจืืช ืืคืืชืื ืขื ืืื ืฆืืฆืื ืืืื ืืืืืงื ืืื ืืช ืฉื ืกืคืจื ืืฉืืง.
ืชืืื ืื ืขื ืชืฉืืืช ืืื. ืื ืืฉ ืื ื ืืกืืื ืืืืืงืช ืชืคืงืืืื ืืคืฉืจืืื, ืืื ืื ืงืฉืืจ ืืืืืงืืื, ืกืคืจ ืื ื ืขื ืื ืืชืืืืืช!
ืืงืืจ: www.habr.com