Torolalana: ny fomba hitsapana ny anjara asan'ny Ansible ary fantaro ny olana alohan'ny famokarana

Miarahaba ny rehetra!

Miasa amin'ny maha injeniera DevOps aho amin'ny serivisy famandrihana hotely. Ostrovok.ru. Amin'ity lahatsoratra ity dia te hiresaka momba ny traikefantsika amin'ny fitsapana ny anjara asan'ny Ansible aho.

Ao amin'ny Ostrovok.ru dia mampiasa ansible ho mpitantana ny fanamafisana izahay. Vao haingana izahay no tonga teo amin'ny filàna ny fitsapana anjara, fa, araka ny hita, dia tsy misy fitaovana maro ho an'izany - ny malaza indrindra, angamba, dia ny Molecule rafitra, ka nanapa-kevitra ny hampiasa azy io. Saingy hita fa mangina ny antontan-taratasiny momba ny fandrika maro. Tsy nahita torolàlana feno amin'ny teny Rosiana izahay, ka nanapa-kevitra ny hanoratra ity lahatsoratra ity izahay.

Torolalana: ny fomba hitsapana ny anjara asan'ny Ansible ary fantaro ny olana alohan'ny famokarana

molekiola

molekiola - rafitra iray hanampy amin'ny fitsapana ny anjara asan'ny Ansible.

Famaritana tsotra: Molecule dia mamorona ohatra eo amin'ny sehatra voafaritrao (rahona, milina virtoaly, fitoeran-javatra; raha mila fanazavana fanampiny dia jereo ny fizarana Driver), mitantana ny anjaranao amin'io, avy eo manao fitsapana ary mamafa ilay ohatra. Raha misy tsy fahombiazana amin'ny iray amin'ireo dingana, ny Molecule dia hampandre anao momba izany.

Ankehitriny misimisy kokoa.

Fomba teoria

Andeha hodinihintsika ireo singa fototra roa amin'ny Molecule: Scenario sy Driver.

Tantara

Ny script dia misy famaritana momba ny inona, aiza, ahoana ary amin'ny filaharana hotanterahina. Ny anjara asa iray dia mety manana script maromaro, ary ny tsirairay dia lahatahiry manaraka ny lalana <role>/molecule/<scenario>, misy famaritana ny hetsika ilaina amin'ny fitsapana. Tsy maintsy misy script default, izay ho noforonina ho azy raha manomboka ny anjara amin'ny fampiasana Molecule ianao. Ny anaran'ireto script manaraka ireto dia araka ny fanapahan-kevitrao.

Ny filaharan'ny hetsika fitsapana amin'ny script dia antsoina teraka, ary amin'ny alàlan'ny default dia toy izao:

(Ny dingana voamarika ?, dia adino amin'ny alàlan'ny default raha tsy voafaritry ny mpampiasa)

  • lint - mihazakazaka liters. Amin'ny alàlan'ny default yamllint и flake8,
  • destroy - famafana ny tranga tamin'ny fandefasana farany ny Molecule (raha misy tavela),
  • dependency? - fametrahana ny fiankinan-doha azo antoka amin'ny andraikitra voasedra,
  • syntax - fanamarinana ny syntax anjara amin'ny fampiasana ansible-playbook --syntax-check,
  • create - mamorona ohatra,
  • prepare? - manomana ny ohatra; ohatra manamarina/mametraka python2
  • converge - fandefasana ny playbook voasedra,
  • idempotence - avereno averina ny playbook ho an'ny fitsapana tsy fahampian-tsakafo,
  • side_effect? - hetsika tsy mifandray mivantana amin'ny andraikitra, fa ilaina amin'ny fitsapana,
  • verify - manao andrana amin'ny fanamboarana azo ampiasaina testinfra(default) /goss/inspec,
  • cleanup? - (amin'ny dikan-teny vaovao) - raha lazaina amin'ny teny manodidina, "manadio" ny fotodrafitrasa ivelany iharan'ny Molecule,
  • destroy - famafana ohatra.

Ity filaharana ity dia mahafaoka ny ankamaroan'ny tranga, saingy azo ovaina raha ilaina.

Ny tsirairay amin'ireo dingana etsy ambony ireo dia azo atao misaraka amin'ny fampiasana molecule <command>. Saingy tokony ho takatrao fa ho an'ny baikon'ny cli tsirairay toy izany dia mety misy ny filaharan'ny hetsika, izay azonao fantarina amin'ny alàlan'ny mihazakazaka. molecule matrix <command>. Ohatra, rehefa mihazakazaka ny baiko converge (manatanteraka ny playbook voasedra) ireto hetsika manaraka ireto dia hatao:

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

Azo ovaina ny filaharan'ireo hetsika ireo. Raha toa ka efa vita ny zavatra iray ao amin'ny lisitra, dia hatsipy izany. Ny fanjakana ankehitriny, ary koa ny config ohatra, dia voatahiry ao amin'ny lahatahiry Molecule $TMPDIR/molecule/<role>/<scenario>.

Ampio dingana miaraka amin'ny ? Azonao atao ny mamaritra ny hetsika irina amin'ny endrika Ansible playbook, ary ataovy araka ny dingana ny anaran'ny rakitra: prepare.yml/side_effect.yml. Antenaina fa ao amin'ny lahatahiry script ireo rakitra Molecule ireo.

Driver

Ny saofera dia sampan-draharaha iray izay hamoronana ohatra ho an'ny fitsapana.
Ny lisitry ny mpamily manara-penitra izay ananan'ny Molecule maodely efa vita dia: Azure, Docker, EC2, GCE, LXC, LXD, OpenStack, Vagrant, Delegated.

Amin'ny ankamaroan'ny tranga, ny môdely dia rakitra create.yml и destroy.yml ao amin'ny lahatahiry script, izay mamaritra ny famoronana sy ny famafana ny ohatra.
Ny maningana dia Docker sy Vagrant, satria ny fifandraisana amin'ny maodely dia mety hitranga raha tsy misy ireo rakitra etsy ambony.

Tsara ny manasongadina ny mpamily natokana, satria raha ampiasaina izy io, dia ny asa miaraka amin'ny fanamafisana ohatra ihany no voalaza ao amin'ny famoronana sy ny famafana ny rakitra; ny ambiny dia tokony hofaritan'ny injeniera.

Ny mpamily default dia Docker.

Andeha isika hiroso amin'ny fanazaran-tena sy handinika ireo endri-javatra fanampiny ao.

fanombohana

Amin'ny maha "hello world" dia hizaha toetra ny andraikitry ny fametrahana nginx tsotra izahay. Andao hisafidy ny docker ho mpamily - Heveriko fa ny ankamaroanareo dia nametraka izany (ary tadidio fa ny docker no mpamily default).

hiomana virtualenv ary apetraho ao anatiny molecule:

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

Ny dingana manaraka dia ny fanombohana andraikitra vaovao.
Ny fanombohana andraikitra vaovao, ary koa ny script vaovao, dia atao amin'ny alàlan'ny baiko 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

Ny vokatr'izany dia asa ansible mahazatra. Fanampin'izay, ny fifandraisana rehetra amin'ny Molecules CLI dia natao avy amin'ny fototeny anjara.

Andeha hojerentsika izay ao amin'ny lahatahiry anjara:

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

1 directory, 6 files

Andeha hojerentsika ny config molecule/default/molecule.yml (ilay sary docker ihany no hosoloinay):

---
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

fiankinan-doha

Ity fizarana ity dia mamaritra ny loharanon'ny fiankinan-doha.

Safidy azo atao: vahindanitra, mihatra, akorandriaka.

Shell dia akorandriaka tsotra ampiasaina raha tsy mahafeno ny filanao ny galaxy sy gilt.

Tsy hijanona ela eto aho, efa voafaritra tsara ao tahirin-kevitra.

mpamily

Anaran'ny mpamily. Aminay dia docker ity.

rongony

Yamllint dia ampiasaina ho toy ny linter.

Ny safidy mahasoa amin'ity ampahany amin'ny config ity dia ny fahafahana mamaritra ny fisie fisie ho an'ny yamllint, ny fari-piainan'ny tontolo iainana mandroso, na manakana ny linter:

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

sehatra

Manoritsoritra ny firafitry ny tranga.
Raha ny docker ho mpamily, ny Molecule dia miverimberina amin'ity fizarana ity, ary ny singa tsirairay amin'ny lisitra dia misy Dockerfile.j2 toy ny miovaova item.

Raha ny momba ny mpamily iray izay create.yml и destroy.yml, ny fizarana dia misy ao amin'izy ireo toy ny molecule_yml.platforms, ary ny famerimberenana azy dia efa voalaza ao amin'ireo rakitra ireo.

Satria ny Molecule dia manome fitantanana ohatra amin'ny maody Ansible, tokony hitady ny lisitry ny toe-javatra azo atao ianao. Ho an'ny Docker, ohatra, ny module dia ampiasaina docker_container_module. Ny modules ampiasaina amin'ny mpamily hafa dia azo jerena ao tahirin-kevitra.

Azonao atao koa ny mahita ohatra amin'ny fampiasana mpamily isan-karazany amin'ny fitsapana ny Molecule mihitsy.

Aleo soloina eto centos:7 amin'ny Ubuntu.

mpamatsy

"Provider" no sampan-draharaha mitantana ireo tranga. Raha ny momba ny Molecule, dia azo atao izany; Ny fanohanana ny hafa dia tsy nomanina, ka ity fizarana ity dia azo antsoina hoe fanamafisam-peo maharitra.
Betsaka ny azonao asongadina eto, fa ny hevi-dehibe indrindra no hasongadinako, raha ny hevitro:

  • boky filalaovana: Azonao atao ny mamaritra izay boky filalaovana tokony hampiasaina amin'ny dingana sasany.

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'"

  • safidy: Famaritana azo tsapain-tanana sy fari-piainan'ny tontolo iainana

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

Tantara

Lohateny sy famaritana ny filaharan'ny script.
Azonao atao ny manova ny matrix hetsika default amin'ny baiko iray amin'ny fampidirana ny fanalahidy <command>_sequence ary ho sandany amin'izany, mamaritra ny lisitry ny dingana ilaintsika.
Andeha atao hoe te hanova ny filaharan'ny hetsika isika rehefa mihazakazaka ny baikon'ny playbook run: molecule converge

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

manamarina

Fametrahana rafitra ho an'ny fitsapana sy linter ho azy. Amin'ny alàlan'ny default, ny linter dia ampiasaina testinfra и flake8. Ny safidy mety dia mitovy amin'ny etsy ambony:

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

Andao hiverina amin'ny anjarantsika. Andao hanova ny rakitra tasks/main.yml amin'ity fijery ity:

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

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

Ary ampio fitsapana amin'ny 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")

Vita, ny hany sisa tavela dia ny mihazakazaka (avy amin'ny fototry ny anjara, avelao aho hampahatsiahy anao):

> molecule test

Setroka lava eo ambanin'ny 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

Notsapaina tsy nisy olana ny andraikitray tsotra.
Tsara ny mitadidy fa raha misy olana mitranga mandritra ny fandidiana molecule test, dia raha tsy nanova ny filaharana mahazatra ianao dia hofafan'ny Molecule ilay ohatra.

Ireto baiko manaraka ireto dia ilaina amin'ny debugging:

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

Anjara efa misy

Manampy script vaovao amin'ny andraikitra efa misy avy amin'ny lahatahiry anjara miaraka amin'ireto baiko manaraka ireto:

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

Raha ity no script voalohany amin'ny anjara, dia ny parameter -s azo esorina satria hisy script hatsangana default.

famaranana

Araka ny hitanao dia tsy dia sarotra loatra ny Molecule, ary rehefa mampiasa ny maodely anao ianao dia azonao atao ny mampihena ny fametrahana script vaovao hanitsiana ireo fari-pahalalana ao amin'ny playbook amin'ny famoronana sy famafana tranga. Ny molekiola dia miray tsikombakomba amin'ny rafitra CI, izay ahafahanao mampitombo ny hafainganam-pandehan'ny fampandrosoana amin'ny alàlan'ny fampihenana ny fotoana hanaovana fitiliana amin'ny boky filalaovana.

Misaotra anao noho ny fifantohanao. Raha manana traikefa amin'ny fitsapana andraikitra azo atao ianao, ary tsy mifandray amin'ny Molecule, lazao anay ao amin'ny fanehoan-kevitra izany!

Source: www.habr.com

Add a comment