Instructiones: quomodo partes ansibiles experiendi et de quaestionibus ante productionem experiendis

Всем привет!

DevOps architectus laboro in deversorio magna opera. Ostrovok.ru. In hoc articulo loqui de nostra experientia in experimentis muneribus ansibilis volo.

In Ostrovok.ru utimur ut de configuratione procurator. Nuper venimus ad necessitatem probandi partes, sed sicut evenit, non tot instrumenta ad hoc sunt - popularis fortasse compage Molecule est, sic ea uti decrevimus. Sed evenit ut eius documenta de multis scandalis taceat. Enchiridion satis expressum in Russian reperire non potuimus, itaque hunc articulum scribere decrevimus.

Instructiones: quomodo partes ansibiles experiendi et de quaestionibus ante productionem experiendis

moleculo

Molecule — compage ad munerum ansibles experimentum adiuvandum.

Descriptio simplicior: Moleculum instantia creat in suggestu quam designas (nubem, machinam virtualem, continens; plura singula, sectionem vide Driver) munus tuum in ea decurrit, deinde probat ac delet instantia. In casu defectus in uno graduum, Moleculum te de eo certiorem faciet.

Nunc in magis detail.

A frenum in doctrina

Consideremus duas entias clavis Moleculi: varius et Coegi.

sem

Scriptum descriptionem continet quid, ubi, quomodo et quo ordine agetur. Una pars plura scripta habere potest, et utrumque est directorium in via <role>/molecule/<scenario>qui continet descriptiones rerum gestarum ad probationem. Scriptum est includi defaultquae automatice creata erunt si munus cum Moleculo initializes. Nomina scriptorum sequentium ad vos sunt.

Ordo probationis actus in scripto appellatur matrixEt per defaltam ita est:

(Grades intitulatum ?, omittendum defaltam nisi ab usore specificatam)

  • lint — currit linters. Per default sunt yamllint и flake8,
  • destroy - Instantiae delendae e ultimis molis moleculis (si) .
  • dependency? - insertis ansibilis dependentiae probatae partes;
  • syntax - reprehendo syntaxi partes usura ansible-playbook --syntax-check,
  • create — exempli causa creando;
  • prepare? — instantiam parat; exempli gratia reprehendo / installing python2
  • converge - deductis probata fabula;
  • idempotence - playbook restarting for the idempotency test;
  • side_effect? — actiones non directe pertinentes ad partes, sed ad probationes necessariae;
  • verify - currit probat de configuratione utens inde testinfra(default) /goss/inspec,
  • cleanup? - (in novis versionibus) - dure loquendo "purgatio" externa infrastructura a Moleculo affecta;
  • destroy — Delendo exemplo.

Haec series pluribus casibus tegit, sed si opus est mutari potest.

Singulae gradus superiores possunt separatim currere usura molecule <command>. Sed sciendum est, quod unicuique tale mandatum potest esse propria series actionum, quas invenire potes per executionem. molecule matrix <command>. Sicut cum currit praeceptum converge playbook probatus cursus sequentes actiones peragentur;

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

Sequentia harum actionum emendari potest. Si iam aliquid ex indice factum est, omittendum erit. Status hodiernus necnon config instantiarum molecularum thesaurorum in indicem $TMPDIR/molecule/<role>/<scenario>.

Addere gradus cum ? Potes describere actiones desideratas in formato fabularum Ansible, et tabellam nomen secundum gradum facias: prepare.yml/side_effect.yml. Moleculum hasce tabulas exspecta in folder scripturae erit.

Driver

Exactoris ens est in quo exempla testium creantur.
Elenchus rectorum vexillum pro quibus Molecule exempla prompta habet hoc modo: Azure, Docker, EC2, GCE, LXC, LXD, OpenStack, Vagrant, Delegati.

Pleraque exempla sunt files create.yml и destroy.yml in folder scripto qui creationem et deletionem instantiae describit, respectively.
Exceptiones sunt Docker et Vagrant, sicut interactiones cum modulis suis sine documentis memoratis fieri possunt.

Valet illustrare exactorem Delegatum, quia, si adhibeatur in schedulis ad instantiam creandi et delendi, solum opus cum configuratione instantiarum describitur, reliqua a fabro describi debent.

Defalta coegi est Docker.

Nunc ad exercendum transeamus et illic plura consideremus.

questus Coepi

Sicut "salve mundi", experiamur munus institutionis simplicem nginx. Dogma eligemus sicut auriga - Puto plures ex vobis institutum habere (et meminerimus dostorem esse defaltam exactoris).

para virtualenv ac install in eo molecule:

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

Proximus gradus est novum munus inchoare.
Novae partes initializationis, necnon scriptor novus, utens mandato perficitur 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

Effectus est munus ansibile typicum. Praeterea, omnes interationes cum Moleculis CLI ex radicis munere fiunt.

Videamus quid sit in munere directorio:

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

1 directory, 6 files

Sit scriptor aboutconfig analyze molecule/default/molecule.yml (solum reponere docker imaginem):

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

dependentiam

Haec sectio fontem clientium describit.

Optiones possibilis: Galaxy, ratio, testudo.

Testa tantum mandatum est ut putamen utaris si galaxia et deaurata necessitates tuas non tegunt.

Non hic diutius habito, satis descriptus est documentum.

agitator

Exactoris nomen. Noster est docker.

linteolum inlinere,

Linamentum yamllint.

Optiones utiles in hac config parte facultates specificare limam configurationem pro yamllint, ambitus variabilium deinceps, vel linter inactivare:

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

platforms

Configurationem instantiarum describit.
Si de nauta ut auriga, Moleculum supra hanc sectionem iteratur, et unumquodque elenchum in promptu est. Dockerfile.j2 ut variabilis item.

In casu de quo exactoris create.yml и destroy.yml, sectioni suppetat in iis molecule_yml.platformsatque iterationes in his fasciculis iam descriptae sunt.

Cum Moleculus instantiarum modulorum possibilium potestatem praebet, index occasus possibilium etiam ibi requirendus est. Nam dock, exempli gratia, modulus adhibetur docker_container_module. Quod moduli in aliis rectoribus reperiri possunt documentum.

Tum exempla usuum variorum rectorum inveniri possunt in probat ipsius Moleculi.

Repone hic centos: 7 on Ubuntu.

dispensator

"Provisor" est res quae instantias administrat. In casu Molecule hoc est ansibile, subsidium aliis non destinatis, sic haec sectio, cum reservatione, figuratio ansibilis extensa dici potest.
Multus hic notare potes, sed praecipua, mea sententia, illustrabo:

  • playbooks: specificare potes quibus fabulae libri certis gradibus utendi sint.

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

  • options: Ansible options and environment variables

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

sem

Nomen et descriptio scriptorum sequentiarum.
Matriculam alicuius praecepti addendo clavem actio default mutare potes <command>_sequence et ut valor ipsius, definiendo elenchum graduum indigemus.
Dicamus nos velle ordinem actionum mutare, cum currit praeceptum fabularum curriculo; molecule converge

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

reprehendo

Prorepit sol- menta et linter ad eam. Quod default linter est testinfra и flake8. Optiones possibilis eadem sunt quae supra:

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

Ad munus nostrum redeamus. Sit scriptor lima recensere tasks/main.yml ad hoc genus;

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

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

Et adde probat to 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")

Factum, omne quod reliquum est currere (ex radice partes, me monere);

> molecule test

Diu sub praedo exhaurit;

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

Munus nostrum simplex sine problematibus probatum est.
Memorabile est quod si quaestiones sunt in opere molecule testMoleculum delebit instantia.

Praecepta haec utilia sunt ad debugging:

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

Existens munus

Addit novum scriptum ad munus existentium is ex partes Directory cum his mandatis:

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

Si hoc est primum missionis munus, deinde modularis -s omitti potest sicut scriptum erit creare default.

conclusio,

Ut videre potes, Moleculum non admodum complexum est, et utens tuis propriis exemplaribus, novum scriptionem explicans reduci potest ad variabilium emendandas in instantia creationis et deletionis fabularum. Moleculum compagem cum CI systematibus integrat, quae te sinit augere celeritatem evolutionis reducendo tempus ad probationes fabularum manualium.

Tibi gratias ago pro attente. Si experientiam habes in muneribus ansibilis experiendi et ad Moleculum non refertur, nobis de eo in commenta narra!

Source: www.habr.com

Add a comment