Как Π½Π°Ρ‡Π°Ρ‚ΡŒ Ρ‚Π΅ΡΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ansible, ΠΎΡ‚Ρ€Π΅Ρ„Π°ΠΊΡ‚ΠΎΡ€ΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ Π·Π° Π³ΠΎΠ΄ ΠΈ Π½Π΅ ΡΠ»Π΅Ρ‚Π΅Ρ‚ΡŒ с ΠΊΠ°Ρ‚ΡƒΡˆΠ΅ΠΊ

Как Π½Π°Ρ‡Π°Ρ‚ΡŒ Ρ‚Π΅ΡΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ansible, ΠΎΡ‚Ρ€Π΅Ρ„Π°ΠΊΡ‚ΠΎΡ€ΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ Π·Π° Π³ΠΎΠ΄ ΠΈ Π½Π΅ ΡΠ»Π΅Ρ‚Π΅Ρ‚ΡŒ с ΠΊΠ°Ρ‚ΡƒΡˆΠ΅ΠΊ

Π­Ρ‚ΠΎ Ρ€Π°ΡΡˆΠΈΡ„Ρ€ΠΎΠ²ΠΊΠ° выступлСния Π½Π° DevOps-40 2020-03-18:

Начиная со Π²Ρ‚ΠΎΡ€ΠΎΠ³ΠΎ ΠΊΠΎΠΌΠΌΠΈΡ‚Π° любой ΠΊΠΎΠ΄ становится legacy, Ρ‚.ΠΊ. ΠΈΠ·Π½Π°Ρ‡Π°Π»ΡŒΠ½Ρ‹Π΅ Π·Π°Π΄ΡƒΠΌΠΊΠΈ Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‚ Ρ€Π°ΡΡ…ΠΎΠ΄ΠΈΡ‚ΡŒΡΡ с суровой Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΡΡ‚ΡŒΡŽ. Π­Ρ‚ΠΎ Π½Π΅ Ρ…ΠΎΡ€ΠΎΡˆΠΎ ΠΈ Π½Π΅ ΠΏΠ»ΠΎΡ…ΠΎ, это Π΄Π°Π½Π½ΠΎΡΡ‚ΡŒ с ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ слоТно ΡΠΏΠΎΡ€ΠΈΡ‚ΡŒ ΠΈ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡƒΠΆΠΈΠ²Π°Ρ‚ΡŒΡΡ. Π§Π°ΡΡ‚ΡŒΡŽ этого процСсса являСтся Ρ€Π΅Ρ„Π°ΠΊΡ‚ΠΎΡ€ΠΈΠ½Π³. Π Π΅Ρ„Π°ΠΊΡ‚ΠΎΡ€ΠΈΠ½Π³ Infrastructure as Code. Π”Π° начнСтся история ΠΊΠ°ΠΊ ΠΎΡ‚Ρ€Π΅Ρ„Π°ΠΊΡ‚ΠΎΡ€ΠΈΡ‚ΡŒ Ansible Π·Π° Π³ΠΎΠ΄ ΠΈ Π½Π΅ ΡΠ»Π΅Ρ‚Π΅Ρ‚ΡŒ с ΠΊΠ°Ρ‚ΡƒΡˆΠ΅ΠΊ.

Π—Π°Ρ€ΠΎΠΆΠ΄Π΅Π½ΠΈΠ΅ Legacy

Π”Π΅Π½ΡŒ β„– 1: НулСвой ΠΏΠ°Ρ†ΠΈΠ΅Π½Ρ‚

Как Π½Π°Ρ‡Π°Ρ‚ΡŒ Ρ‚Π΅ΡΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ansible, ΠΎΡ‚Ρ€Π΅Ρ„Π°ΠΊΡ‚ΠΎΡ€ΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ Π·Π° Π³ΠΎΠ΄ ΠΈ Π½Π΅ ΡΠ»Π΅Ρ‚Π΅Ρ‚ΡŒ с ΠΊΠ°Ρ‚ΡƒΡˆΠ΅ΠΊ

Π–ΠΈΠ» Π±Ρ‹Π» условный ΠΏΡ€ΠΎΠ΅ΠΊΡ‚. На Π½Π΅ΠΌ Π±Ρ‹Π»Π° Dev ΠΊΠΎΠΌΠ°Π½Π΄Π° Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΈ Ops ΠΈΠ½ΠΆΠ΅Π½Π΅Ρ€Ρ‹. Они Ρ€Π΅ΡˆΠ°Π»ΠΈ ΠΎΠ΄Π½Ρƒ ΠΈ Ρ‚Ρƒ ΠΆΠ΅ Π·Π°Π΄Π°Ρ‡Ρƒ: ΠΊΠ°ΠΊ Ρ€Π°Π·Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ сСрвСра ΠΈ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅. ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΠ° Π±Ρ‹Π»Π° Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ каТдая ΠΊΠΎΠΌΠ°Π½Π΄Π° Ρ€Π΅ΡˆΠ°Π»Π° эту Π·Π°Π΄Π°Ρ‡Ρƒ ΠΏΠΎ своСму. На ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π΅ Π±Ρ‹Π»ΠΎ принято Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ansible для синхронизации Π·Π½Π°Π½ΠΈΠΉ ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΊΠΎΠΌΠ°Π½Π΄Π°ΠΌΠΈ Dev ΠΈ Ops.

Π”Π΅Π½ΡŒ β„– 89: Π—Π°Ρ€ΠΎΠΆΠ΄Π΅Π½ΠΈΠ΅ Legacy

Как Π½Π°Ρ‡Π°Ρ‚ΡŒ Ρ‚Π΅ΡΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ansible, ΠΎΡ‚Ρ€Π΅Ρ„Π°ΠΊΡ‚ΠΎΡ€ΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ Π·Π° Π³ΠΎΠ΄ ΠΈ Π½Π΅ ΡΠ»Π΅Ρ‚Π΅Ρ‚ΡŒ с ΠΊΠ°Ρ‚ΡƒΡˆΠ΅ΠΊ

Π‘Π°ΠΌΠΈ Ρ‚ΠΎΠ³ΠΎ Π½Π΅ Π·Π°ΠΌΠ΅Ρ‚ΠΈΠ², Ρ…ΠΎΡ‚Π΅Π»ΠΈ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ Π»ΡƒΡ‡ΡˆΠ΅, Π° ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΎΡΡŒ legacy. Как Ρ‚Π°ΠΊ получаСтся?

  • Π£ нас Ρ‚ΡƒΡ‚ срочная таска, сдСлаСм грязный Ρ…Π°ΠΊ β€” ΠΏΠΎΡ‚ΠΎΠΌ исправим.
  • Π”ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΡŽ ΠΌΠΎΠΆΠ½ΠΎ Π½Π΅ ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΈ Ρ‚Π°ΠΊ всё понятно Ρ‡Ρ‚ΠΎ Ρ‚ΡƒΡ‚ происходит.
  • Π― знаю Ansible / Python / Bash / Terraform! Π‘ΠΌΠΎΡ‚Ρ€ΠΈΡ‚Π΅ ΠΊΠ°ΠΊ я ΠΌΠΎΠ³Ρƒ ΠΈΠ·Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒΡΡ!
  • Π― Full Stack Overflow Developer скопировал это со stackoverflow, Π½Π΅ знаю ΠΊΠ°ΠΊ это Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚, Π½ΠΎ выглядит ΠΏΡ€ΠΈΠΊΠΎΠ»ΡŒΠ½ΠΎ ΠΈ Ρ€Π΅ΡˆΠ°Π΅Ρ‚ Π·Π°Π΄Π°Ρ‡Ρƒ.

Π’ ΠΈΡ‚ΠΎΠ³Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΊΠΎΠ΄ нСпонятного Π²ΠΈΠ΄Π°, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π½Π΅Ρ‚ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ, нСпонятно Ρ‡Ρ‚ΠΎ ΠΎΠ½ Π΄Π΅Π»Π°Π΅Ρ‚, Π½ΡƒΠΆΠ΅Π½ Π»ΠΈ ΠΎΠ½, Π½ΠΎ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Π²Π°ΠΌ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π΅Π³ΠΎ Ρ€Π°Π·Π²ΠΈΠ²Π°Ρ‚ΡŒ, Π΄ΠΎΡ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ, Π΄ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒ костыли с ΠΏΠΎΠ΄ΠΏΠΎΡ€ΠΊΠ°ΠΌΠΈ, дСлая ΡΠΈΡ‚ΡƒΠ°Ρ†ΠΈΡŽ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ СшС Ρ…ΡƒΠΆΠ΅.

- hosts: localhost
  tasks:
    - shell: echo -n Z >> a.txt && cat a.txt
      register: output
      delay: 1
      retries: 5
      until: not output.stdout.find("ZZZ")

Π”Π΅Π½ΡŒ β„– 109: ОсознаниС ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹

Как Π½Π°Ρ‡Π°Ρ‚ΡŒ Ρ‚Π΅ΡΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ansible, ΠΎΡ‚Ρ€Π΅Ρ„Π°ΠΊΡ‚ΠΎΡ€ΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ Π·Π° Π³ΠΎΠ΄ ΠΈ Π½Π΅ ΡΠ»Π΅Ρ‚Π΅Ρ‚ΡŒ с ΠΊΠ°Ρ‚ΡƒΡˆΠ΅ΠΊ

Π˜Π·Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎ задуманная ΠΈ рСализованная модСль IaC пСрСстаёт ΠΎΡ‚Π²Π΅Ρ‡Π°Ρ‚ΡŒ Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ с запросами ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ / бизнСса / Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΊΠΎΠΌΠ°Π½Π΄, врСмя внСсСниС ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ Π² инфраструктуру пСрСстаёт Π±Ρ‹Ρ‚ΡŒ ΠΏΡ€ΠΈΠ΅ΠΌΠ»Π΅ΠΌΡ‹ΠΌ. Π’ этот ΠΌΠΎΠΌΠ΅Π½Ρ‚ ΠΏΡ€ΠΈΡ…ΠΎΠ΄ΠΈΡ‚ ΠΏΠΎΠ½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ ΠΏΠΎΡ€Π° ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Ρ‚ΡŒ ΠΌΠ΅Ρ€Ρ‹.

Π Π΅Ρ„Π°ΠΊΡ‚ΠΎΡ€ΠΈΠ½Π³ IaC

Π”Π΅Π½ΡŒ β„– 139: А Π²Π°ΠΌ Ρ‚ΠΎΡ‡Π½ΠΎ Π½ΡƒΠΆΠ΅Π½ Ρ€Π΅Ρ„Π°ΠΊΡ‚ΠΎΡ€ΠΈΠ½Π³?

Как Π½Π°Ρ‡Π°Ρ‚ΡŒ Ρ‚Π΅ΡΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ansible, ΠΎΡ‚Ρ€Π΅Ρ„Π°ΠΊΡ‚ΠΎΡ€ΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ Π·Π° Π³ΠΎΠ΄ ΠΈ Π½Π΅ ΡΠ»Π΅Ρ‚Π΅Ρ‚ΡŒ с ΠΊΠ°Ρ‚ΡƒΡˆΠ΅ΠΊ

ΠŸΡ€Π΅ΠΆΠ΄Π΅ Ρ‡Π΅ΠΌ ΠΊΠΈΠ΄Π°Ρ‚ΡŒΡΡ Ρ€Π΅Ρ„Π°ΠΊΡ‚ΠΎΡ€ΠΈΡ‚ΡŒ Π²Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΎΡ‚Π²Π΅Ρ‚ΠΈΡ‚ΡŒ Π½Π° ряд Π²Π°ΠΆΠ½Ρ‹Ρ… вопросов:

  1. Π—Π°Ρ‡Π΅ΠΌ Π²Π°ΠΌ всё это?
  2. Π•ΡΡ‚ΡŒ Π»ΠΈ Ρƒ вас врСмя?
  3. Достаточно Π»ΠΈ Π·Π½Π°Π½ΠΈΠΉ?

Если Π²Ρ‹ Π½Π΅ Π·Π½Π°Π΅Ρ‚Π΅ ΠΊΠ°ΠΊ ΠΎΡ‚Π²Π΅Ρ‚ΠΈΡ‚ΡŒ Π½Π° вопросы, Ρ‚ΠΎ Ρ€Π΅Ρ„Π°ΠΊΡ‚ΠΎΡ€ΠΈΠ½Π³ закончится Ρ‚Π°ΠΊ ΠΈ Π½Π΅ Π½Π°Ρ‡Π°Π²ΡˆΠΈΡΡŒ ΠΈΠ»ΠΈ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ…ΡƒΠΆΠ΅. Π’.ΠΊ. Π±Ρ‹Π» ΠΎΠΏΡ‹Ρ‚( Π§Ρ‚ΠΎ я ΡƒΠ·Π½Π°Π», протСстировав 200 000 строк инфраструктурного ΠΊΠΎΠ΄Π°), Ρ‚ΠΎ ΠΎΡ‚ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° ΠΏΡ€ΠΈΡˆΠ΅Π» запрос ΠΏΠΎΠΌΠΎΡ‰ΠΈ ΠΈΡΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ Ρ€ΠΎΠ»ΠΈ ΠΈ ΠΏΠΎΠΊΡ€Ρ‹Ρ‚ΡŒ ΠΈΡ… тСстами.

Π”Π΅Π½ΡŒ β„– 149: ΠŸΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΊΠ° Ρ€Π΅Ρ„Π°ΠΊΡ‚ΠΎΡ€ΠΈΠ½Π³Π°

Как Π½Π°Ρ‡Π°Ρ‚ΡŒ Ρ‚Π΅ΡΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ansible, ΠΎΡ‚Ρ€Π΅Ρ„Π°ΠΊΡ‚ΠΎΡ€ΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ Π·Π° Π³ΠΎΠ΄ ΠΈ Π½Π΅ ΡΠ»Π΅Ρ‚Π΅Ρ‚ΡŒ с ΠΊΠ°Ρ‚ΡƒΡˆΠ΅ΠΊ

ΠŸΠ΅Ρ€Π²ΠΎΠΎΡ‡Π΅Ρ€eΠ΄Π½ΠΎΠ΅ это Π½Π°Π΄ΠΎ ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΈΡ‚ΡŒΡΡ. ΠžΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒΡΡ Ρ‡Ρ‚ΠΎ Π±ΡƒΠ΄Π΅ΠΌ Π΄Π΅Π»Π°Ρ‚ΡŒ. Для этого общаСмся, Π½Π°Ρ…ΠΎΠ΄ΠΈΠΌ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ½Ρ‹Π΅ Ρ‚ΠΎΡ‡ΠΊΠΈ ΠΈ ΠΏΡ€ΠΈΠΊΠΈΠ΄Ρ‹Π²Π°Π΅ΠΌ ΠΏΡƒΡ‚ΠΈ ΠΈΡ… Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ. ΠŸΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹Π΅ ΠΊΠΎΠ½Ρ†Π΅ΠΏΡ‚Ρ‹ ΠΊΠ°ΠΊ-Ρ‚ΠΎ фиксируСм, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΡΡ‚Π°Ρ‚ΡŒΡ Π² confluence, Ρ‡Ρ‚ΠΎ Π±Ρ‹ ΠΏΡ€ΠΈ появлСниС вопроса "ΠΊΠ°ΠΊ Π»ΡƒΡ‡ΡˆΠ΅?" ΠΈΠ»ΠΈ "ΠΊΠ°ΠΊ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Π΅Π΅?" ΠΌΡ‹ Π½Π΅ сбились с курса. Π’ нашСм случаС ΠΌΡ‹ ΠΏΡ€ΠΈΠ΄Π΅Ρ€ΠΆΠΈΠ²Π°Π»ΠΈΡΡŒ ΠΈΠ΄Π΅ΠΈ раздСляй ΠΈ властвуй: Π΄Ρ€ΠΎΠ±ΠΈΠΌ инфраструктуру Π½Π° малСнькиС кусочки / ΠΊΠΈΡ€ΠΏΠΈΡ‡ΠΈΠΊΠΈ. Π’Π°ΠΊΠΎΠΉ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ позволяСт Π²Π·ΡΡ‚ΡŒ ΠΈΠ·ΠΎΠ»ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ кусок инфраструктуры, ΠΏΠΎΠ½ΡΡ‚ΡŒ Ρ‡Ρ‚ΠΎ ΠΎΠ½ Π΄Π΅Π»Π°Π΅Ρ‚, ΠΏΠΎΠΊΡ€Ρ‹Ρ‚ΡŒ Π΅Π³ΠΎ тСстами ΠΈ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ Π½Π΅ побоявшись Ρ‡Ρ‚ΠΎ-Π½ΠΈΠ±ΡƒΠ΄ΡŒ ΡΠ»ΠΎΠΌΠ°Ρ‚ΡŒ.

Как Π½Π°Ρ‡Π°Ρ‚ΡŒ Ρ‚Π΅ΡΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ansible, ΠΎΡ‚Ρ€Π΅Ρ„Π°ΠΊΡ‚ΠΎΡ€ΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ Π·Π° Π³ΠΎΠ΄ ΠΈ Π½Π΅ ΡΠ»Π΅Ρ‚Π΅Ρ‚ΡŒ с ΠΊΠ°Ρ‚ΡƒΡˆΠ΅ΠΊ

ΠŸΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ΡΡ, Ρ‡Ρ‚ΠΎ тСстированиС инфраструктуры становится ΠΊΡ€Π°Π΅ΡƒΠ³ΠΎΠ»ΡŒΠ½Ρ‹ΠΌ ΠΊΠ°ΠΌΠ½Π΅ΠΌ ΠΈ Ρ‚ΡƒΡ‚ стоит ΡƒΠΏΠΎΠΌΡΠ½ΡƒΡ‚ΡŒ ΠΏΠΈΡ€Π°ΠΌΠΈΠ΄Ρƒ тСстирования инфраструктуры. Π ΠΎΠ²Π½ΠΎ Ρ‚Π°ΠΆΠ΅ идСя, Ρ‡Ρ‚ΠΎ Π² Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅, Π½ΠΎ для инфраструктуры: ΠΈΠ΄Π΅ΠΌ ΠΎΡ‚ Π΄Π΅ΡˆΠ΅Π²Ρ‹Ρ… быстрых тСстов ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡΡŽΡ‚ простыС Π²Π΅Ρ‰ΠΈ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ отступы, ΠΊ Π΄ΠΎΡ€ΠΎΠ³ΠΈΠΌ ΠΏΠΎΠ»Π½ΠΎΡ†Π΅Π½Π½Ρ‹ΠΌ тСстами Ρ€Π°Π·Π²ΠΎΡ€Π°Ρ‡ΠΈΠ²Π°ΡŽΡ‰ΠΈΡ… Ρ†Π΅Π»ΡŒΠ½ΡƒΡŽ инфраструктуру.

ΠŸΠΎΠΏΡ‹Ρ‚ΠΊΠΈ тСстирования Ansible

ΠŸΡ€Π΅ΠΆΠ΄Π΅ Ρ‡Π΅ΠΌ ΠΏΠΎΠΉΠ΄Π΅ΠΌ ΠΎΠΏΠΈΡΡ‹Π²Π°Ρ‚ΡŒ ΠΊΠ°ΠΊ ΠΏΠΎΠΊΡ€Ρ‹Π²Π°Π»ΠΈ тСстами Ansible Π½Π° ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π΅, ΠΎΠΏΠΈΡˆΡƒ ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠΈ ΠΈ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Ρ‹ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ довСлось ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ€Π°Π½Π΅Π΅, Ρ‡Ρ‚ΠΎ Π±Ρ‹ ΠΏΠΎΠ½ΡΡ‚ΡŒ контСкст ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅ΠΌΡ‹Ρ… Ρ€Π΅ΡˆΠ΅Π½ΠΈΠΉ.

Π”Π΅Π½ΡŒ β„– -997: SDS provision

Как Π½Π°Ρ‡Π°Ρ‚ΡŒ Ρ‚Π΅ΡΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ansible, ΠΎΡ‚Ρ€Π΅Ρ„Π°ΠΊΡ‚ΠΎΡ€ΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ Π·Π° Π³ΠΎΠ΄ ΠΈ Π½Π΅ ΡΠ»Π΅Ρ‚Π΅Ρ‚ΡŒ с ΠΊΠ°Ρ‚ΡƒΡˆΠ΅ΠΊ

ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ Ρ€Π°Π· Ρ‚Π΅ΡΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ansible довСлось Π½Π° ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π΅ ΠΏΠΎ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ SDS (Software Defined Storage). Π•ΡΡ‚ΡŒ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Π°Ρ ΡΡ‚Π°Ρ‚ΡŒΡ Π½Π° эту Ρ‚Π΅ΠΌΡƒ
Как Π½Π°Π»ΠΎΠΌΠ°Ρ‚ΡŒ вСлосипСдов ΠΏΠΎΠ²Π΅Ρ€Ρ… костылСй ΠΏΡ€ΠΈ тСстировании своСго дистрибутива, Π½ΠΎ Ссли ΠΊΡ€Π°Ρ‚ΠΊΠΎ, Ρ‚ΠΎ Ρƒ нас ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»Π°ΡΡŒ пСрСвСрнутая ΠΏΠΈΡ€Π°ΠΌΠΈΠ΄Π° тСстирования ΠΈ тСстированиС ΠΌΡ‹ Ρ‚Ρ€Π°Ρ‚ΠΈΠ»ΠΈ 60-90 ΠΌΠΈΠ½ΡƒΡ‚ Π½Π° ΠΎΠ΄Π½Ρƒ Ρ€ΠΎΠ»ΡŒ, Ρ‡Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ Π΄ΠΎΠ»Π³ΠΎ. Основа Π±Ρ‹Π»Π° e2e тСсты, Ρ‚.Π΅. ΠΌΡ‹ Ρ€Π°Π·Π²ΠΎΡ€Π°Ρ‡ΠΈΠ²Π°Π»ΠΈ ΠΏΠΎΠ»Π½ΠΎΡ†Π΅Π½Π½ΡƒΡŽ ΠΈΠ½ΡΡ‚Π°Π»Π»ΡΡ†ΠΈΡŽ, ΠΈ ΠΏΠΎΡ‚ΠΎΠΌ Π΅Π΅ тСстировали. Π•Ρ‰Π΅ ΠΎΡ‚ΡΠ³Ρ‡Π°ΡŽΡ‰ΠΈΠΌ Π±Ρ‹Π»ΠΎ ΠΈΠ·ΠΎΠ±Ρ€Π΅Ρ‚Π΅Π½ΠΈΠ΅ своСго вСлосипСда. Но Π½Π°Π΄ΠΎ ΠΏΡ€ΠΈΠ·Π½Π°Ρ‚ΡŒΡΡ это Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ Ρ€Π°Π±ΠΎΡ‚Π°Π»ΠΎ ΠΈ позволяло ΡΡ‚Π°Π±ΠΈΠ»ΡŒΠ½ΠΎ Ρ€Π΅Π»ΠΈΠ·ΠΈΡ‚ΡŒΡΡ.

Π”Π΅Π½ΡŒ β„– -701: Ansible ΠΈ test kitchen

Как Π½Π°Ρ‡Π°Ρ‚ΡŒ Ρ‚Π΅ΡΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ansible, ΠΎΡ‚Ρ€Π΅Ρ„Π°ΠΊΡ‚ΠΎΡ€ΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ Π·Π° Π³ΠΎΠ΄ ΠΈ Π½Π΅ ΡΠ»Π΅Ρ‚Π΅Ρ‚ΡŒ с ΠΊΠ°Ρ‚ΡƒΡˆΠ΅ΠΊ

Π Π°Π·Π²ΠΈΡ‚ΠΈΠ΅ΠΌ ΠΈΠ΄Π΅ΠΈ тСстирования Ansible стало использованиС Π³ΠΎΡ‚ΠΎΠ²Ρ‹Ρ… инструмСнтов, Π° ΠΈΠΌΠ΅Π½Π½ΠΎ test kitchen / kitchen-ci ΠΈ inspec. Π’Ρ‹Π±ΠΎΡ€ Π±Ρ‹Π» обусловСн Π·Π½Π°Π½ΠΈΠ΅ΠΌ Ruby ( ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅ΠΉ Π² ΡΡ‚Π°Ρ‚ΡŒΠ΅ Π½Π° Ρ…Π°Π±Ρ€Π΅: ΠœΠ΅Ρ‡Ρ‚Π°ΡŽΡ‚ Π»ΠΈ YML программисты ΠΎ тСстировании ansible?) Ρ€Π°Π±ΠΎΡ‚Π°Π»ΠΎ быстрСС порядка 40 ΠΌΠΈΠ½ΡƒΡ‚ Π½Π° 10 Ρ€ΠΎΠ»Π΅ΠΉ. ΠœΡ‹ создавали ΠΏΠ°Ρ‡ΠΊΡƒ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Ρ… машин ΠΈ Π²Π½ΡƒΡ‚Ρ€ΠΈ гоняли тСсты.

Как Π½Π°Ρ‡Π°Ρ‚ΡŒ Ρ‚Π΅ΡΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ansible, ΠΎΡ‚Ρ€Π΅Ρ„Π°ΠΊΡ‚ΠΎΡ€ΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ Π·Π° Π³ΠΎΠ΄ ΠΈ Π½Π΅ ΡΠ»Π΅Ρ‚Π΅Ρ‚ΡŒ с ΠΊΠ°Ρ‚ΡƒΡˆΠ΅ΠΊ

Π’ Ρ†Π΅Π»ΠΎΠΌ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ Ρ€Π°Π±ΠΎΡ‚Π°Π»ΠΎ, Π½ΠΎ Π±Ρ‹Π» осадочСк ΠΈΠ·-Π·Π° нСоднородности. Когда ΠΆΠ΅ ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ»ΠΈ количСство тСстируСмых Π΄ΠΎ 13 Π±Π°Π·ΠΎΠ²Ρ‹Ρ… Ρ€ΠΎΠ»Π΅ΠΉ ΠΈ 2 ΠΌΠ΅Ρ‚Π° Ρ€ΠΎΠ»Π΅ΠΉ ΠΊΠΎΠΌΠ±ΠΈΠ½ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠ΅ Π±ΠΎΠ»Π΅Π΅ ΠΌΠ΅Π»ΠΊΠΈΠ΅ Ρ€ΠΎΠ»ΠΈ, Ρ‚ΠΎ Π²Π΄Ρ€ΡƒΠ³ тСсты стали Π±Π΅ΠΆΠ°Ρ‚ΡŒ 70 ΠΌΠΈΠ½ΡƒΡ‚, Ρ‡Ρ‚ΠΎ ΠΏΠΎΡ‡Ρ‚ΠΈ Π² 2 Ρ€Π°Π·Π° дольшС. Об XP (extreme programming) ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ°Ρ… Π±Ρ‹Π»ΠΎ слоТно Π³ΠΎΠ²ΠΎΡ€ΠΈΡ‚ΡŒ Ρ‚.ΠΊ. Π½ΠΈΠΊΡ‚ΠΎ Π½Π΅ Π·Π°Ρ…ΠΎΡ‡Π΅Ρ‚ ΠΆΠ΄Π°Ρ‚ΡŒ 70 ΠΌΠΈΠ½ΡƒΡ‚. Π­Ρ‚ΠΎ стало ΠΏΠΎΠ΄ΠΎΠ²ΠΎΠ΄ΠΎΠΌ для измСнСния ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Π°

Π”Π΅Π½ΡŒ β„– -601: Ansible ΠΈ molecule

Как Π½Π°Ρ‡Π°Ρ‚ΡŒ Ρ‚Π΅ΡΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ansible, ΠΎΡ‚Ρ€Π΅Ρ„Π°ΠΊΡ‚ΠΎΡ€ΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ Π·Π° Π³ΠΎΠ΄ ΠΈ Π½Π΅ ΡΠ»Π΅Ρ‚Π΅Ρ‚ΡŒ с ΠΊΠ°Ρ‚ΡƒΡˆΠ΅ΠΊ

ΠšΠΎΠ½Ρ†Π΅ΠΏΡ‚ΡƒΠ°Π»ΡŒΠ½ΠΎ это ΠΏΠΎΡ…ΠΎΠΆΠ΅ Π½Π° testkitchen, Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΌΡ‹ ΠΏΠ΅Ρ€Π΅Π²Π΅Π»ΠΈ тСстированиС Ρ€ΠΎΠ»Π΅ΠΉ Π² docker ΠΈ смСнили стэк. Π˜Ρ‚ΠΎΠ³ΠΎΠΌ, врСмя ΡΠΎΠΊΡ€Π°Ρ‚ΠΈΠ»ΠΎΡΡŒ Π΄ΠΎ ΡΡ‚Π°Π±ΠΈΠ»ΡŒΠ½Ρ‹Ρ… 20-25 ΠΌΠΈΠ½ΡƒΡ‚ для 7 Ρ€ΠΎΠ»Π΅ΠΉ.

Как Π½Π°Ρ‡Π°Ρ‚ΡŒ Ρ‚Π΅ΡΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ansible, ΠΎΡ‚Ρ€Π΅Ρ„Π°ΠΊΡ‚ΠΎΡ€ΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ Π·Π° Π³ΠΎΠ΄ ΠΈ Π½Π΅ ΡΠ»Π΅Ρ‚Π΅Ρ‚ΡŒ с ΠΊΠ°Ρ‚ΡƒΡˆΠ΅ΠΊ

Π£Π²Π΅Π»ΠΈΡ‡ΠΈΠ² количСство тСстирумых Ρ€ΠΎΠ»Π΅ΠΉ Π΄ΠΎ 17 ΠΈ Π»ΠΈΠ½Ρ‚ΠΎΠ²ΠΊΡƒ 45 Ρ€ΠΎΠ»Π΅ΠΉ ΠΌΡ‹ прогоняли это Π·Π° 28 ΠΌΠΈΠ½ΡƒΡ‚ Π½Π° 2 jenkins slave.

Π”Π΅Π½ΡŒ β„– 167: ДобавляСм Π½Π° ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ тСсты Ansible

Как Π½Π°Ρ‡Π°Ρ‚ΡŒ Ρ‚Π΅ΡΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ansible, ΠΎΡ‚Ρ€Π΅Ρ„Π°ΠΊΡ‚ΠΎΡ€ΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ Π·Π° Π³ΠΎΠ΄ ΠΈ Π½Π΅ ΡΠ»Π΅Ρ‚Π΅Ρ‚ΡŒ с ΠΊΠ°Ρ‚ΡƒΡˆΠ΅ΠΊ

Π‘ наскоку Π·Π°Π΄Π°Ρ‡Ρƒ Ρ€Π΅Ρ„Π°ΠΊΡ‚ΠΎΡ€ΠΈΠ½Π³Π°, скорСй всСго ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Π½Π΅ получится. Π—Π°Π΄Π°Ρ‡Π° Π΄ΠΎΠ»ΠΆΠ½Π° Π±Ρ‹Ρ‚ΡŒ ΠΈΠ·ΠΌΠ΅Ρ€ΠΈΠΌΠΎΠΉ, Ρ‡Ρ‚ΠΎ Π±Ρ‹ Π²Ρ‹ ΠΌΠΎΠ³Π»ΠΈ Π΅Π΅ Ρ€Π°Π·Π±ΠΈΡ‚ΡŒ Π½Π° ΠΌΠ΅Π»ΠΊΠΈΠ΅ кусочки ΠΈ ΡΡŠΠ΅ΡΡ‚ΡŒ слона ΠΏΠΎ частям Ρ‡Π°ΠΉΠ½ΠΎΠΉ Π»ΠΎΠΆΠΊΠΎΠΉ. Π”ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ ΠΏΠΎΠ½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π² ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠΌ Π»ΠΈ Π²Ρ‹ Π½Π°ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠΈ ΠΈΠ΄Π΅Ρ‚ Π΄Π²ΠΈΠΆΠ΅Π½ΠΈΠ΅, Π΄ΠΎΠ»Π³ΠΎ Π»ΠΈ Π΅Ρ‰Π΅ ΠΈΠ΄Ρ‚ΠΈ.

Как Π½Π°Ρ‡Π°Ρ‚ΡŒ Ρ‚Π΅ΡΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ansible, ΠΎΡ‚Ρ€Π΅Ρ„Π°ΠΊΡ‚ΠΎΡ€ΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ Π·Π° Π³ΠΎΠ΄ ΠΈ Π½Π΅ ΡΠ»Π΅Ρ‚Π΅Ρ‚ΡŒ с ΠΊΠ°Ρ‚ΡƒΡˆΠ΅ΠΊ

Π’ Ρ†Π΅Π»ΠΎΠΌ Π½Π΅ ΡΡƒΡ‚ΡŒ Π²Π°ΠΆΠ½ΠΎ ΠΊΠ°ΠΊ это Π±ΡƒΠ΄Π΅Ρ‚ сдСлано, ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΈΡΠ°Ρ‚ΡŒ Π½Π° Π±ΡƒΠΌΠ°ΠΆΠΊΡƒ, ΠΌΠΎΠΆΠ½ΠΎ ΠΊΠ»Π΅ΠΈΡ‚ΡŒ стикСры Π½Π° ΡˆΠΊΠ°Ρ„, ΠΌΠΎΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ таски Π² jira, Π° ΠΌΠΎΠΆΠ½ΠΎ завСсти google docs И Ρ‚ΡƒΠ΄Π° Π·Π°ΠΏΠΈΡΡ‹Π²Π°Ρ‚ΡŒ Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ статус. Ноги растут ΠΈΠ· Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ процСсс Π½Π΅ ΡΠΈΡŽΠΌΠΈΠ½ΡƒΡ‚Π½Ρ‹ΠΉ, ΠΎΠ½ Π±ΡƒΠ΄Π΅Ρ‚ Π΄ΠΎΠ»Π³ΠΈΠΉ ΠΈ Π½ΡƒΠ΄Π½Ρ‹ΠΉ. ΠœΠ°Π»ΠΎΠ²Π΅Ρ€ΠΎΡΡ‚Π½ΠΎ, Ρ‡Ρ‚ΠΎ ΠΊΡ‚ΠΎ-Ρ‚ΠΎ Ρ…ΠΎΡ‡Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Π±Ρ‹ Π·Π° врСмя Ρ€Π΅Ρ„Π°ΠΊΡ‚ΠΎΡ€ΠΈΠ½Π³Π° Π²Ρ‹ ΠΏΠ΅Ρ€Π΅Π³ΠΎΡ€Π΅Π»ΠΈ ΠΈΠ΄Π΅ΠΉ, устали ΠΈ Π·Π°Π±ΠΈΠ»ΠΈ.

Π Π΅Ρ„Π°ΠΊΡ‚ΠΎΡ€ΠΈΠ½Π³ прост:

  • Eat.
  • Sleep.
  • Code.
  • IaC test.
  • Repeat

ΠΈ Ρ‚Π°ΠΊ повторяСм ΠΏΠΎΠΊΠ° Π½Π΅ достигнСм Π½Π°ΠΌΠ΅Ρ‡Π΅Π½Π½ΠΎΠΉ Ρ†Π΅Π»ΠΈ.

Как Π½Π°Ρ‡Π°Ρ‚ΡŒ Ρ‚Π΅ΡΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ansible, ΠΎΡ‚Ρ€Π΅Ρ„Π°ΠΊΡ‚ΠΎΡ€ΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ Π·Π° Π³ΠΎΠ΄ ΠΈ Π½Π΅ ΡΠ»Π΅Ρ‚Π΅Ρ‚ΡŒ с ΠΊΠ°Ρ‚ΡƒΡˆΠ΅ΠΊ

ВсС сразу Π½Π°Ρ‡Π°Ρ‚ΡŒ Ρ‚Π΅ΡΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΌΠΎΠΆΠ΅Ρ‚ Π½Π΅ получится, поэтому Ρƒ нас ΠΏΠ΅Ρ€Π²ΠΎΠΉ Π·Π°Π΄Π°Ρ‡Π΅ΠΉ Π±Ρ‹Π»ΠΎ Π½Π°Ρ‡Π°Ρ‚ΡŒ с Π»ΠΈΠ½Ρ‚ΠΎΠ²ΠΊΠΈ ΠΈ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ синтаксиса.

Π”Π΅Π½ΡŒ β„– 181: Green Build Master

Как Π½Π°Ρ‡Π°Ρ‚ΡŒ Ρ‚Π΅ΡΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ansible, ΠΎΡ‚Ρ€Π΅Ρ„Π°ΠΊΡ‚ΠΎΡ€ΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ Π·Π° Π³ΠΎΠ΄ ΠΈ Π½Π΅ ΡΠ»Π΅Ρ‚Π΅Ρ‚ΡŒ с ΠΊΠ°Ρ‚ΡƒΡˆΠ΅ΠΊ

Π›ΠΈΠ½Ρ‚ΠΎΠ²ΠΊΠ° это нСбольшой ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ шаг ΠΊ Green Build Master. Π­Ρ‚ΠΎ ΠΏΠΎΡ‡Ρ‚ΠΈ Π½ΠΈΡ‡Π΅Π³ΠΎ Π½Π΅ сломаСт, Π½ΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚ ΠΎΡ‚Π»Π°Π΄ΠΈΡ‚ΡŒ процСссы ΠΈ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ зСлСнСнькиС Π±ΠΈΠ»Π΄Ρ‹ Π² jenkins. ИдСя Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Π±Ρ‹ Π²Ρ‹Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ ΠΏΡ€ΠΈΠ²Ρ‹Ρ‡ΠΊΠΈ Ρƒ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹:

  • ΠšΡ€Π°ΡΠ½Ρ‹Π΅ тСсты ΠΏΠ»ΠΎΡ…ΠΎ.
  • ΠŸΡ€ΠΈΡˆΡ‘Π» ΠΈΡΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ Π·Π°ΠΎΠ΄Π½ΠΎ сдСлай ΠΊΠΎΠ΄ Ρ‡ΡƒΡ‚ΡŒ Π»ΡƒΡ‡ΡˆΠ΅, Ρ‡Π΅ΠΌ ΠΎΠ½ Π±Ρ‹Π» Π΄ΠΎ тСбя.

Π”Π΅Π½ΡŒ β„– 193: ΠžΡ‚ Π»ΠΈΠ½Ρ‚ΠΎΠ²ΠΊΠΈ ΠΊ unit тСстам

Как Π½Π°Ρ‡Π°Ρ‚ΡŒ Ρ‚Π΅ΡΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ansible, ΠΎΡ‚Ρ€Π΅Ρ„Π°ΠΊΡ‚ΠΎΡ€ΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ Π·Π° Π³ΠΎΠ΄ ΠΈ Π½Π΅ ΡΠ»Π΅Ρ‚Π΅Ρ‚ΡŒ с ΠΊΠ°Ρ‚ΡƒΡˆΠ΅ΠΊ

Выстроив процСсс попадания ΠΊΠΎΠ΄Π° Π² мастСр ΠΌΠΎΠΆΠ½ΠΎ Π½Π°Ρ‡ΠΈΠ½Π°Ρ‚ΡŒ процСсс поэтапного ΡƒΠ»ΡƒΡ‡ΡˆΠ΅Π½ΠΈΡ β€” замСняя Π»ΠΈΠ½Ρ‚ΠΎΠ²ΠΊΡƒ Π½Π° запуск Ρ€ΠΎΠ»Π΅ΠΉ, ΠΌΠΎΠΆΠ½ΠΎ Π΄Π°ΠΆΠ΅ Π±Π΅Π· идСмпотСнтности. НСобходимо ΠΏΠΎΠ½ΡΡ‚ΡŒ ΠΊΠ°ΠΊ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒ Ρ€ΠΎΠ»ΠΈ, ΠΊΠ°ΠΊ ΠΎΠ½ΠΈ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚.

Π”Π΅Π½ΡŒ β„– 211: ΠžΡ‚ unit ΠΊ integration тСстам

Как Π½Π°Ρ‡Π°Ρ‚ΡŒ Ρ‚Π΅ΡΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ansible, ΠΎΡ‚Ρ€Π΅Ρ„Π°ΠΊΡ‚ΠΎΡ€ΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ Π·Π° Π³ΠΎΠ΄ ΠΈ Π½Π΅ ΡΠ»Π΅Ρ‚Π΅Ρ‚ΡŒ с ΠΊΠ°Ρ‚ΡƒΡˆΠ΅ΠΊ

Когда unit тСстами ΠΏΠΎΠΊΡ€Ρ‹Ρ‚ΠΎ Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ Ρ€ΠΎΠ»Π΅ΠΉ ΠΈ всё линтуСтся, ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΡ‚ ΠΊ добавлСнию ΠΈΠ½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΠΎΠ½Π½Ρ‹Ρ… тСстов. Π’.Π΅. Ρ‚Π΅ΡΡ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡŽ Π½Π΅ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ ΠΊΠΈΡ€ΠΏΠΈΡ‡ΠΈΠΊΠ° Π² инфраструктурС, Π° ΠΈΡ… ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΠΈ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΏΠΎΠ»Π½ΠΎΡ†Π΅Π½Π½ΡƒΡŽ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡŽ инстанса.

Как Π½Π°Ρ‡Π°Ρ‚ΡŒ Ρ‚Π΅ΡΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ansible, ΠΎΡ‚Ρ€Π΅Ρ„Π°ΠΊΡ‚ΠΎΡ€ΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ Π·Π° Π³ΠΎΠ΄ ΠΈ Π½Π΅ ΡΠ»Π΅Ρ‚Π΅Ρ‚ΡŒ с ΠΊΠ°Ρ‚ΡƒΡˆΠ΅ΠΊ

На jenkins ΠΌΡ‹ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Π»ΠΈ мноТСство стадий, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π² ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒ Π»ΠΈΠ½Ρ‚ΠΎΠ²Π°Π»ΠΈ Ρ€ΠΎΠ»ΠΈ / плэйбуки, ΠΏΠΎΡ‚ΠΎΠΌ ΡŽΠ½ΠΈΡ‚ тСсты Π² ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π°Ρ… ΠΈ Π² ΠΊΠΎΠ½Ρ†Π΅ ΠΈΠ½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΠΎΠ½Π½Ρ‹Π΅ тСсты.

Jenkins + Docker + Ansible = Tests

Как Π½Π°Ρ‡Π°Ρ‚ΡŒ Ρ‚Π΅ΡΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ansible, ΠΎΡ‚Ρ€Π΅Ρ„Π°ΠΊΡ‚ΠΎΡ€ΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ Π·Π° Π³ΠΎΠ΄ ΠΈ Π½Π΅ ΡΠ»Π΅Ρ‚Π΅Ρ‚ΡŒ с ΠΊΠ°Ρ‚ΡƒΡˆΠ΅ΠΊ

  1. CheckoutΒ repoΒ and generate build stages.
  2. Run lint playbook stages in parallel.
  3. Run lint role stages in parallel.
  4. RunΒ syntax check role stages in parallel.
  5. RunΒ test role stages in parallel.
    1. Lint role.
    2. Check dependency on other roles.
    3. Check syntax.
    4. Create docker instance
    5. Run molecule/default/playbook.yml.
    6. CheckΒ idempotency.
  6. Run integration tests
  7. Finish

Π”Π΅Π½ΡŒ β„– 271: Bus Factor

Как Π½Π°Ρ‡Π°Ρ‚ΡŒ Ρ‚Π΅ΡΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ansible, ΠΎΡ‚Ρ€Π΅Ρ„Π°ΠΊΡ‚ΠΎΡ€ΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ Π·Π° Π³ΠΎΠ΄ ΠΈ Π½Π΅ ΡΠ»Π΅Ρ‚Π΅Ρ‚ΡŒ с ΠΊΠ°Ρ‚ΡƒΡˆΠ΅ΠΊ

ΠŸΠ΅Ρ€Π²ΠΎΠ΅ врСмя Ρ€Π΅Ρ„Π°ΠΊΡ‚ΠΎΡ€ΠΈΠ½Π³ΠΎΠΌ занималась нСбольшая Π³Ρ€ΡƒΠΏΠΏΠ° людСй Π² ΠΏΠ°Ρ€Ρƒ-Ρ‚Ρ€ΠΎΠΉΠΊΡƒ Ρ‡Π΅Π»ΠΎΠ²Π΅ΠΊ. Они Π΄Π΅Π»Π°Π»ΠΈ Ρ€Π΅Π²ΡŒΡŽ ΠΊΠΎΠ΄Π° Π² мастСрe. Π‘ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½Π΅ΠΌ Π² ΠΊΠΎΠΌΠ°Π½Π΄Π΅ Π²Ρ‹Ρ€Π°Π±Π°Ρ‚ΠΎΠ»ΠΎΡΡŒ Π·Π½Π°Π½ΠΈΠ΅ ΠΊΠ°ΠΊ ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΊΠΎΠ΄ ΠΈ code review способствовало Ρ€Π°ΡΠΏΡ€ΠΎΡΡ‚Ρ€Π°Π½Π΅Π½ΠΈΡŽ Π·Π½Π°Π½ΠΈΠΉ ΠΎΠ± инфраструктурС ΠΈ Ρ‚ΠΎΠΌ ΠΊΠ°ΠΊ ΠΎΠ½Π° устроСна. Изюминкой здСсь Π±Ρ‹Π»ΠΎ, Ρ‚ΠΎ Ρ‡Ρ‚ΠΎ Ρ€Π΅Π²ΡŒΡŽΠ²Π΅Ρ€Ρ‹ Π²Ρ‹Π±ΠΈΡ€Π°Π»ΠΈΡΡŒ ΠΏΠΎ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ, ΠΏΠΎ Π³Ρ€Π°Ρ„ΠΈΠΊΡƒ, Ρ‚.Π΅. с Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Π΄ΠΎΠ»Π΅ΠΉ вСроятности Ρ‚Ρ‹ залСзСшь Π² Π½ΠΎΠ²Ρ‹ΠΉ участок инфраструктуры.

Как Π½Π°Ρ‡Π°Ρ‚ΡŒ Ρ‚Π΅ΡΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ansible, ΠΎΡ‚Ρ€Π΅Ρ„Π°ΠΊΡ‚ΠΎΡ€ΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ Π·Π° Π³ΠΎΠ΄ ΠΈ Π½Π΅ ΡΠ»Π΅Ρ‚Π΅Ρ‚ΡŒ с ΠΊΠ°Ρ‚ΡƒΡˆΠ΅ΠΊ

И здСсь Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ ΡƒΠ΄ΠΎΠ±Π½ΠΎ. Π£Π΄ΠΎΠ±Π½ΠΎ Π΄Π΅Π»Π°Ρ‚ΡŒ Ρ€Π΅Π²ΡŒΡŽ, Π²ΠΈΠ΄Π΅Ρ‚ΡŒ Π² Ρ€Π°ΠΌΠΊΠ°Ρ… ΠΊΠ°ΠΊΠΎΠΉ Π·Π°Π΄Π°Ρ‡ΠΈ ΠΎΠ½ΠΎ сдСлано, ΠΈΡΡ‚ΠΎΡ€ΠΈΡŽ обсуТдСний. ΠœΡ‹ ΠΈΠ½Ρ‚Π΅Π³Ρ€ΠΈΡ€ΠΎΠ²Π°Π»ΠΈ jenkins + bitbucket + jira.

Но ΠΊΠ°ΠΊ Ρ‚Π°ΠΊΠΎΠ²ΠΎΠ΅ Ρ€Π΅Π²ΡŒΡŽ Π½Π΅ панацСя, ΠΊΠ°ΠΊ-Ρ‚ΠΎ, Ρƒ нас ΠΏΡ€ΠΎΠ»Π΅Π· Π² мастСр ΠΊΠΎΠ΄, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ сдСлал Π½Π°ΠΌ Ρ„Π»Π°ΠΏΠ°ΡŽΡ‰ΠΈΠ΅ тСсты:

- get_url:
    url: "{{ actk_certs }}/{{ item.1 }}"
    dest: "{{ actk_src_tmp }}/"
    username: "{{ actk_mvn_user }}"
    password: "{{ actk_mvn_pass }}"
  with_subelements:
    - "{{ actk_cert_list }}"
    - "{{ actk_certs }}"
  delegate_to: localhost

- copy:
    src: "{{ actk_src_tmp }}/{{ item.1 }}"
    dest: "{{ actk_dst_tmp }}"
  with_subelements:
    - "{{ actk_cert_list }}"
    - "{{ actk_certs }}"

ΠŸΠΎΡ‚ΠΎΠΌ это исправили, Π½ΠΎ осадочСк остался.

get_url:
    url: "{{ actk_certs }}/{{ actk_item }}"
    dest: "{{ actk_src_tmp }}/{{ actk_item }}"
    username: "{{ actk_mvn_user }}"
    password: "{{ actk_mvn_pass }}"
  loop_control:
    loop_var: actk_item
  with_items: "{{ actk_cert_list }}"
  delegate_to: localhost

- copy:
    src: "{{ actk_src_tmp }}/{{ actk_item }}"
    dest: "{{ actk_dst_tmp }}"
  loop_control:
    loop_var: actk_item
  with_items: "{{ actk_cert_list }}"

Π”Π΅Π½ΡŒ β„– 311: УскоряСм тСсты

Как Π½Π°Ρ‡Π°Ρ‚ΡŒ Ρ‚Π΅ΡΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ansible, ΠΎΡ‚Ρ€Π΅Ρ„Π°ΠΊΡ‚ΠΎΡ€ΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ Π·Π° Π³ΠΎΠ΄ ΠΈ Π½Π΅ ΡΠ»Π΅Ρ‚Π΅Ρ‚ΡŒ с ΠΊΠ°Ρ‚ΡƒΡˆΠ΅ΠΊ

Π‘ΠΎ Π²Ρ€Π΅Π½Π΅ΠΌ тСстов ΡΡ‚Π°Π½ΠΎΠ²ΠΈΠ»ΠΎΡΡŒ большС, Π±ΠΈΠ»Π΄Ρ‹ Π±Π΅ΠΆΠ°Π»ΠΈ ΠΌΠ΅Π΄Π»Π΅Π½Π½Π΅Π΅ Π΄ΠΎ часа Π² ΠΏΠ»ΠΎΡ…ΠΎΠΌ случаС. На ΠΎΠ΄Π½ΠΎΠΌ ΠΈΠ· Ρ€Π΅Ρ‚Ρ€ΠΎ Π±Ρ‹Π»Π° Ρ„Ρ€Π°Π·Π° ΠΏΠΎ Ρ‚ΠΈΠΏΡƒ "Ρ…ΠΎΡ€ΠΎΡˆΠΎ Ρ‡Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ тСсты, Π½ΠΎ ΠΎΠ½ΠΈ ΠΌΠ΅Π΄Π»Π΅Π½Π½Ρ‹Π΅". Π’ ΠΈΡ‚ΠΎΠ³Π΅ ΠΌΡ‹ ΠΎΡ‚ΠΊΠ°Π·Π°Π»ΠΈΡΡŒ ΠΎΡ‚ ΠΈΠ½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΠΎΠ½Π½Ρ‹Ρ… тСстов Π½Π° Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Ρ… ΠΌΠ°ΡˆΠΈΠ½Π°Ρ… ΠΈ Π°Π΄Π°ΠΏΡ‚ΠΈΡ€ΠΎΠ²Π°Π»ΠΈ ΠΏΠΎΠ΄ docker, Π΄Π°Π±Ρ‹ Π±Ρ‹Π»ΠΎ быстрСС. Π’Π°ΠΊ ΠΆΠ΅ Π·Π°ΠΌΠ΅Π½ΠΈΠ»ΠΈ testinfra Π½Π° ansible verifier Ρ‡Ρ‚ΠΎ Π±Ρ‹ ΡƒΠΌΠ΅Π½ΡŒΡˆΠΈΡ‚ΡŒ ΠΊΠΎΠ»-Π²ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Ρ… инструмСнтов.

Как Π½Π°Ρ‡Π°Ρ‚ΡŒ Ρ‚Π΅ΡΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ansible, ΠΎΡ‚Ρ€Π΅Ρ„Π°ΠΊΡ‚ΠΎΡ€ΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ Π·Π° Π³ΠΎΠ΄ ΠΈ Π½Π΅ ΡΠ»Π΅Ρ‚Π΅Ρ‚ΡŒ с ΠΊΠ°Ρ‚ΡƒΡˆΠ΅ΠΊ

Π‘Ρ‚Ρ€ΠΎΠ³ΠΎ говоря Ρ‚ΡƒΡ‚ Π±Ρ‹Π» комплСкс ΠΌΠ΅Ρ€:

  1. ΠŸΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ Π½Π° docker.
  2. Π£Π±Ρ€Π°Ρ‚ΡŒ тСстированиС Ρ€ΠΎΠ»Π΅ΠΉ, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ дублируСтся Π·Π° счСт зависимостСй.
  3. Π£Π²Π΅Π»ΠΈΡ‡ΠΈΡ‚ΡŒ ΠΊΠΎΠ»-Π²ΠΎ слэйвов.
  4. ΠŸΠΎΡ€ΡΠ΄ΠΎΠΊ запуска тСстов.
  5. Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π»ΠΈΠ½Ρ‚ΠΎΠ²Π°Ρ‚ΡŒ ВБЁ локально ΠΎΠ΄Π½ΠΎΠΉ ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ.

Как Π½Π°Ρ‡Π°Ρ‚ΡŒ Ρ‚Π΅ΡΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ansible, ΠΎΡ‚Ρ€Π΅Ρ„Π°ΠΊΡ‚ΠΎΡ€ΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ Π·Π° Π³ΠΎΠ΄ ΠΈ Π½Π΅ ΡΠ»Π΅Ρ‚Π΅Ρ‚ΡŒ с ΠΊΠ°Ρ‚ΡƒΡˆΠ΅ΠΊ

Π’ ΠΈΡ‚ΠΎΠ³Π΅ Pipeline Π½Π° jenkins Ρ‚ΠΎΠΆΠ΅ унифицировался

  1. Generate build stages.
  2. Lint all in parallel.
  3. RunΒ test role stages in parallel.
  4. Finish.

Lessons learned

Avoid global variables

Ansible ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅, Π΅ΡΡ‚ΡŒ частичный workaround Π² Π²ΠΈΠ΄Π΅ private_role_vars, Π½ΠΎ это Π½Π΅ панацСя.

ΠŸΡ€ΠΈΠ²Π΅Π΄Ρƒ ΠΏΡ€ΠΈΠΌΠ΅Ρ€. ΠŸΡƒΡΡ‚ΡŒ Ρƒ нас Π΅ΡΡ‚ΡŒ role_a ΠΈ role_b

# cat role_a/defaults/main.yml
---
msg: a

# cat role_a/tasks/main.yml
---
- debug:
    msg: role_a={{ msg }}

# cat role_b/defaults/main.yml
---
msg: b

# cat role_b/tasks/main.yml
---
- set_fact:
    msg: b
- debug:
    msg: role_b={{ msg }}

- hosts: localhost
  vars:
    msg: hello
  roles:
    - role: role_a
    - role: role_b
  tasks:
    - debug:
        msg: play={{msg}}

Как Π½Π°Ρ‡Π°Ρ‚ΡŒ Ρ‚Π΅ΡΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ansible, ΠΎΡ‚Ρ€Π΅Ρ„Π°ΠΊΡ‚ΠΎΡ€ΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ Π·Π° Π³ΠΎΠ΄ ΠΈ Π½Π΅ ΡΠ»Π΅Ρ‚Π΅Ρ‚ΡŒ с ΠΊΠ°Ρ‚ΡƒΡˆΠ΅ΠΊ

Забавная Π²Π΅Ρ‰ΡŒ, Ρ‡Ρ‚ΠΎ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Ρ€Π°Π±ΠΎΡ‚Ρ‹ плэйбуков Π±ΡƒΠ΄Π΅Ρ‚ Π·Π°Π²ΠΈΡΠ΅Ρ‚ΡŒ ΠΎΡ‚ Π½Π΅ всСгда ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½Ρ‹Ρ… Π²Π΅Ρ‰Π΅ΠΉ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ очСрСдности пСрСчислСния Ρ€ΠΎΠ»Π΅ΠΉ. К соТалСнию это Π² Π½Π°Ρ‚ΡƒΡ€Π΅ Ansible ΠΈ Π»ΡƒΡ‡ΡˆΠ΅Π΅ Ρ‡Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ, Ρ‚ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠ°ΠΊΠΈΠ΅-Ρ‚ΠΎ договорСнности, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π²Π½ΡƒΡ‚Ρ€ΠΈ Ρ€ΠΎΠ»ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ описанныС Π² этой Ρ€ΠΎΠ»ΠΈ.

BAD: ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½ΡƒΡŽ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ.

# cat roles/some_role/tasks/main.yml
---
debug:
  var: java_home

GOOD: Π’ defaults ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡ‚ΡŒ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ ΠΈ ΠΏΠΎΠ·ΠΆΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΈΡ….

# cat roles/some_role/defaults/main.yml
---
r__java_home:
 "{{ java_home | default('/path') }}"

# cat roles/some_role/tasks/main.yml
---
debug:
  var: r__java_home

Prefix role variables

BAD: ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½ΡƒΡŽ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ.

# cat roles/some_role/defaults/main.yml
---
db_port: 5432

GOOD: Π’ Ρ€ΠΎΠ»ΠΈ для ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ с прСфиксом ΠΈΠΌΠ΅Π½ΠΈ Ρ€ΠΎΠ»ΠΈ, это посмотрСв Π½Π° inventory ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚ ΠΏΡ€ΠΎΡ‰Π΅ ΠΏΠΎΠ½ΡΡ‚ΡŒ Ρ‡Ρ‚ΠΎ происходит.

# cat roles/some_role/defaults/main.yml
---
some_role__db_port: 5432

Use loop control variable

BAD: Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π² Ρ†ΠΈΠΊΠ»Π°Ρ… ΡΡ‚Π°Π½Π΄Π°Ρ€Ρ‚Π½ΡƒΡŽ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ item, Ссли этот таск/плэйбук Π±ΡƒΠ΄Π΅Ρ‚ Π³Π΄Π΅-Ρ‚ΠΎ заинклюдан Ρ‚ΠΎ это ΠΌΠΎΠΆΠ΅Ρ‚ привСсти ΠΊ Π½Π΅ΠΏΡ€Π΅Π΄Π²ΠΈΠ΄Π΅Π½Π½ΠΎΠΌΡƒ повСдСнию

---
- hosts: localhost
  tasks:
    - debug:
        msg: "{{ item }}"
      loop:
        - item1
        - item2

GOOD: ΠŸΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡ‚ΡŒ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ Π² Ρ†ΠΈΠΊΠ»Π΅ Ρ‡Π΅Ρ€Π΅Π· loop_var.

---
- hosts: localhost
  tasks:
    - debug:
        msg: "{{ item_name }}"
      loop:
        - item1
        - item2
      loop_control:
        loop_var: item_name

Check input variables

ΠœΡ‹ Π΄ΠΎΠ³ΠΎΠ²ΠΎΡ€Π»ΠΈΡΡŒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ прСфиксы ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…, Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ лишним ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ Ρ‡Ρ‚ΠΎ ΠΎΠ½ΠΈ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Ρ‹ ΠΊΠ°ΠΊ ΠΌΡ‹ ΠΎΠΆΠΈΠ΄Π°Π΅ΠΌ ΠΈ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π½Π΅ Π±Ρ‹Π»ΠΈ ΠΏΠ΅Ρ€Π΅ΠΊΡ€Ρ‹Ρ‚Ρ‹ пустым Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ

GOOD: ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡΡ‚ΡŒ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅.

- name: "Verify that required string variables are defined"
  assert:
    that: ahs_var is defined and ahs_var | length > 0 and ahs_var != None
    fail_msg: "{{ ahs_var }} needs to be set for the role to work "
    success_msg: "Required variables {{ ahs_var }} is defined"
  loop_control:
    loop_var: ahs_var
  with_items:
    - ahs_item1
    - ahs_item2
    - ahs_item3

Avoid hashes dictionaries, use flat structure

Если Ρ€ΠΎΠ»ΡŒ ΠΎΠΆΠΈΠ΄Π°Π΅Ρ‚ hash/dictionary Π² ΠΎΠ΄Π½ΠΎΠΌΡƒ ΠΈΠ· ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ², Ρ‚ΠΎ Ссли ΠΌΡ‹ Π·Π°Ρ…ΠΎΡ‚ΠΈΠΌ ΠΏΠΎΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ ΠΎΠ΄ΠΈΠ½ ΠΈΠ· Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΡ… ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ², Π½Π°ΠΌ Π½Π°Π΄ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡ‚ΡŒ вСсь hash/dictionary, Ρ‡Ρ‚ΠΎ повысит ΡΠ»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ конфигурирования.

BAD: Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ hash/dictionary.

---
user:
  name: admin
  group: admin

GOOD: Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠ»ΠΎΡΠΊΡƒΡŽ структуру ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ….

---
user_name: admin
user_group: "{{ user_name }}"

Create idempotent playbooks & roles

Π ΠΎΠ»ΠΈ ΠΈ плэйбуки Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ ΠΈΠ΄Π΅ΠΌΠΏΠΎΡ‚Π΅Π½Ρ‚Π½Ρ‹ΠΌΠΈ, Ρ‚.ΠΊ. ΡƒΠΌΠ΅Π½ΡŒΡˆΠ°Π΅Ρ‚ configuration drift ΠΈ страх ΡΠ»ΠΎΠΌΠ°Ρ‚ΡŒ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ. Но Ссли Π²Ρ‹ ΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ molecule, Ρ‚ΠΎ это ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ.

Avoid using command shell modules

ИспользованиС shell модуля ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ ΠΈΠΌΠΏΠ΅Ρ€Π°Ρ‚ΠΈΠ²Π½ΠΎΠΉ ΠΏΠ°Ρ€Π°Π΄ΠΈΠ³ΠΌΠ΅ описания, вмСсто Π΄Π΅ΠΊΠ»Π°Ρ€Π°Ρ‚ΠΈΠ²Π½ΠΎΠΉ, которая являСтся основной Ansible.

Test your roles via molecule

Molecule позволяСт вСсьма Π³ΠΈΠ±ΠΊΠ° ΡˆΡ‚ΡƒΠΊΠ°, Π΄Π°Π²Π°ΠΉ посмотрим нСсколько сцСнариСв.

Molecule Multiple instances

Π’ molecule.yml Π² сСкции platforms ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠΏΠΈΡΠ°Ρ‚ΡŒ мноТСство хостов ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Ρ€Π°Π·Π²ΠΎΡ€Π°Ρ‡ΠΈΠ²Π°Ρ‚ΡŒ.

---
    driver:
      name: docker
    platforms:
      - name: postgresql-instance
        hostname: postgresql-instance
        image: registry.example.com/postgres10:latest
        pre_build_image: true
        override_command: false
        network_mode: host
      - name: app-instance
        hostname: app-instance
        pre_build_image: true
        image: registry.example.com/docker_centos_ansible_tests
        network_mode: host

БоотвСтствСнно эти хосты, ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΡ‚ΠΎΠΌ Π² converge.yml ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ:

---
- name: Converge all
  hosts: all
  vars:
    ansible_user: root
  roles:
    - role: some_role

- name: Converge db
  hosts: db-instance
  roles:
    - role: some_db_role

- name: Converge app
  hosts: app-instance
  roles:
    - role: some_app_role

Ansible verifier

Π’ molecule Π΅ΡΡ‚ΡŒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ansible Для ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ инстанс Π±Ρ‹Π» настроСн ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ, Π±ΠΎΠ»Π΅Π΅ Ρ‚ΠΎΠ³ΠΎ это ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ с 3 Ρ€Π΅Π»ΠΈΠ·Π°. Π­Ρ‚ΠΎ Π½Π΅ Ρ‚Π°ΠΊ Π³ΠΈΠ±ΠΊΠΎ ΠΊΠ°ΠΊ testinfra/inspec, Π½ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ содСрТимоС Ρ„Π°ΠΉΠ»Π° соотвСтствуСт нашим оТиданиям:

---
- name: Verify
  hosts: all
  tasks:
    - name: copy config
      copy:
        src: expected_standalone.conf
        dest: /root/wildfly/bin/standalone.conf
        mode: "0644"
        owner: root
        group: root
      register: config_copy_result

    - name: Certify that standalone.conf changed
      assert:
        that: not config_copy_result.changed

Или Ρ€Π°Π·Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ сСрвис, Π΄ΠΎΠΆΠ΄Π°Ρ‚ΡŒΡΡ Π΅Π³ΠΎ доступности ΠΈ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ smoke test:

---
  - name: Verify
    hosts: solr
    tasks:
      - command: /blah/solr/bin/solr start -s /solr_home -p 8983 -force
      - uri:
          url: http://127.0.0.1:8983/solr
          method: GET
          status_code: 200
        register: uri_result
        until: uri_result is not failed
        retries: 12
        delay: 10
      - name: Post documents to solr
        command: /blah/solr/bin/post -c master /exampledocs/books.csv

Put complex logic into modules & plugins

Ansible ΠΏΡ€ΠΎΠΏΠΎΠ²Π΅Π΄ΡƒΠ΅Ρ‚ Π΄Π΅ΠΊΠ»Π°Ρ€Π°Ρ‚ΠΈΠ²Π½Ρ‹ΠΉ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄, поэтому ΠΊΠΎΠ³Π΄Π° Π²Ρ‹ Π΄Π΅Π»Π°Π΅Ρ‚Π΅ Π²Π΅Ρ‚Π²Π»Π΅Π½ΠΈΠ΅ ΠΊΠΎΠ΄Π°, Ρ‚Ρ€Π°Π½ΡΡ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ Π΄Π°Π½Π½Ρ‹Ρ…, shell ΠΌΠΎΠ΄ΡƒΠ»ΠΈ, Ρ‚ΠΎ ΠΊΠΎΠ΄ становится слоТно Ρ‡ΠΈΡ‚Π°Π΅ΠΌΡ‹ΠΌ. Π§Ρ‚ΠΎ Π±Ρ‹ ΠΏΠΎΠ±ΠΎΡ€ΠΎΡ‚ΡŒΡΡ с этим ΠΈ ΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Π΅Π³ΠΎ простым для понимания, Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ лишним, Π±ΠΎΡ€ΠΎΡ‚ΡŒΡΡ с этой ΡΠ»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒΡŽ ΠΏΡƒΡ‚Ρ‘ΠΌ создания своих ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ.

Summarize Tips & Tricks

  1. Avoid global variables.
  2. Prefix role variables.
  3. Use loop control variable.
  4. Check input variables.
  5. Avoid hashes dictionaries, use flat structure.
  6. Create idempotent playbooks & roles.
  7. Avoid using command shell modules.
  8. Test your roles via molecule.
  9. Put complex logic into modules & plugins.

Π—Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅

Как Π½Π°Ρ‡Π°Ρ‚ΡŒ Ρ‚Π΅ΡΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ansible, ΠΎΡ‚Ρ€Π΅Ρ„Π°ΠΊΡ‚ΠΎΡ€ΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ Π·Π° Π³ΠΎΠ΄ ΠΈ Π½Π΅ ΡΠ»Π΅Ρ‚Π΅Ρ‚ΡŒ с ΠΊΠ°Ρ‚ΡƒΡˆΠ΅ΠΊ

НСльзя просто Ρ‚Π°ΠΊ Π²Π·ΡΡ‚ΡŒ ΠΈ ΠΎΡ‚Ρ€Π΅Ρ„Π°ΠΊΡ‚ΠΎΡ€ΠΈΡ‚ΡŒ инфраструктуру Π½Π° ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π΅, Π΄Π°ΠΆΠ΅ Ссли Ρƒ вас IaC. Π­Ρ‚ΠΎ Π΄ΠΎΠ»Π³ΠΈΠΉ процСсс Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‰ΠΈΠΉ тСрпСния, Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ ΠΈ Π·Π½Π°Π½ΠΈΠΉ.

UPD1 2020.05.01 20:30 β€” Для ΠΏΠ΅Ρ€Π²ΠΈΡ‡Π½ΠΎΠ³ΠΎ профилирования плэйбуков ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ callback_whitelist = profile_tasks Ρ‡Ρ‚ΠΎ Π±Ρ‹ ΠΏΠΎΠ½ΡΡ‚ΡŒ Ρ‡Ρ‚ΠΎ ΠΈΠΌΠ΅Π½Π½ΠΎ Π΄ΠΎΠ»Π³ΠΎ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚. ПослС Ρ‡Π΅Π³ΠΎ проходимся ΠΏΠΎ классикС ускорСния ansible. МоТно ΠΏΠΎΠΏΡ€ΠΎΠ±ΠΎΠ²Π°Ρ‚ΡŒ mitogen
UPD2 2020.05.03 16:34 β€” English version

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: habr.com