Pendekatan sistem kanggo variabel ing Ansible

ansible devops codestyle

Hey! jenengku Denis Kalyuzhny Aku kerja minangka insinyur ing departemen otomasi proses pembangunan. Saben dina, mbangun aplikasi anyar diluncurake ing atusan server kampanye. Lan ing artikel iki aku nuduhake pengalaman nggunakake Ansible kanggo tujuan kasebut.

Pandhuan iki nawakake cara kanggo ngatur variabel ing panyebaran. Pandhuan iki ditujokake kanggo wong sing wis nggunakake peran ing playbook lan wis maca BestPctices, nanging ngadhepi masalah sing padha:

  • Sawise nemokake variabel ing kode kasebut, ora bisa langsung ngerti apa tanggung jawabe;
  • Ana sawetara peran, lan variabel kudu digandhengake karo siji nilai, nanging mung ora bisa;
  • Duwe kangelan nerangake marang wong liya carane logika variabel ing playbook sampeyan bisa digunakake

Kita nemoni masalah kasebut ing proyek ing perusahaan kita, minangka asil saka aturan kanggo ngrancang variabel ing playbooks, sing bisa ngatasi masalah kasebut.

Pendekatan sistem kanggo variabel ing Ansible

Variabel ing peran

Peran minangka Obyek kapisah saka sistem penyebaran. Kaya obyek sistem, kudu duwe antarmuka kanggo interaksi karo sistem liyane. Antarmuka kasebut minangka variabel peran.

Ayo njupuk, contone, peran api, sing nginstal aplikasi Java ing server. Apa variabel sing bisa diduweni?

Pendekatan sistem kanggo variabel ing Ansible

Peran variabel bisa dipérang dadi 2 jinis miturut jinis:

1. Свойства
    a) независимые от среды
    б) зависимые от среды
2. Связи
    a) слушатели 
    б) запросы внутри системы
    в) запросы в среду

Sifat variabel yaiku variabel sing nemtokake prilaku peran.

Variabel Pitakonan - iki minangka variabel sing nilai digunakake kanggo nemtokake sumber daya njaba peran.

Variabel pamireng - iki variabel sing nilai digunakake kanggo mbentuk variabel request.

Ing sisih liya, 1a, 2a, 2b minangka variabel sing ora gumantung ing lingkungan (perangkat keras, sumber daya eksternal, lsp) lan bisa diisi nilai standar ing peran standar. Nanging, ora mungkin kanggo ngisi variabel jinis 1.b lan 2.c kanthi nilai liyane saka 'conto', amarga bakal ganti saka stand menyang stand gumantung saka lingkungan.

Gaya kode

  • Jeneng variabel kudu diwiwiti kanthi jeneng peran. Iki bakal luwih gampang kanggo mangerteni ing mangsa ngarep apa peran variabel kasebut lan apa tanggung jawabe.
  • Nalika nggunakake variabel ing peran, sampeyan kudu ngetutake prinsip enkapsulasi lan nggunakake variabel sing ditetepake ing peran kasebut utawa ing peran sing saiki gumantung.
  • Aja nggunakake kamus kanggo variabel. Ansible ora ngidini sampeyan ngganti nilai individu kanthi gampang ing kamus.

    Tuladha variabel ala:

    myrole_user:
        login: admin
        password: admin

    Ing kene login minangka variabel bebas, lan tembung sandi minangka variabel gumantung. Nanging
    amarga digabungake dadi kamus, sampeyan kudu nemtokake kanthi lengkap
    tansah. Kang banget ora trep. Luwih apik kanthi cara iki:

    myrole_user_login: admin
    myrole_user_password: admin

Variabel ing playbooks penyebaran

Nalika nyusun playbook penyebaran (sabanjuré diarani minangka playbook), kita netepi aturan sing kudu diselehake ing gudang sing kapisah. Padha peran: saben ing repositori git dhewe. Iki ngidini sampeyan ngerti yen peran lan playbook minangka obyek independen sing beda saka sistem penyebaran, lan owah-owahan ing siji obyek kudu ora mengaruhi operasi liyane. Iki digayuh kanthi ngganti nilai standar variabel.

Nalika nyusun playbook, kanggo ngringkes, sampeyan bisa ngilangi nilai standar variabel peran ing rong panggonan: ing variabel playbook lan ing variabel inventaris.

mydeploy                        # Каталог деплоя
├── deploy.yml                  # Плейбук деплоя
├── group_vars                  # Каталог переменных плейбука
│   ├── all.yml                 # Файл для переменных связи всей системы
│   └── myapi.yml               # Файл переменных свойств группы myapi
└── inventories                 #
    └── prod                    # Каталог окружения prod
        ├── prod.ini            # Инвентори файл
        └── group_vars          # Каталог для переменных инвентори
            └── myapi           #
                ├── vars.yml    # Средозависимые переменные группы myapi
                └── vault.yml   # Секреты (всегда средозависимы) *

* - Variabel lan Vaults

Bentenipun punika variabel playbook tansah digunakake nalika nelpon playbooks dumunung ing tingkat padha. Iki tegese variabel kasebut apik kanggo ngganti nilai standar variabel bebas lingkungan. Kosok baline, variabel inventaris mung bakal digunakake kanggo lingkungan tartamtu, sing becik kanggo variabel khusus lingkungan.

Wigati dimangerteni manawa prioritas variabel ora ngidini sampeyan ngganti variabel dhisik ing variabel playbook banjur kanthi kapisah ing siji persediaan.

Iki tegese wis ing tahap iki perlu kanggo mutusake manawa variabel kasebut gumantung karo lingkungan utawa ora lan dilebokake ing papan sing cocog.

Contone, ing sawijining proyek, variabel sing tanggung jawab kanggo ngaktifake SSL wis suwe gumantung karo lingkungan, amarga kita ora bisa ngaktifake SSL amarga alasan sing ora bisa dikontrol ing salah sawijining stand. Sawise kita ndandani masalah iki, dadi lingkungan independen lan dipindhah menyang variabel playbook.

Variabel Properti kanggo Grup

Ayo nggedhekake model kita ing Gambar 1 kanthi nambahake 2 klompok server kanthi aplikasi Java sing beda, nanging kanthi setelan sing beda.

Pendekatan sistem kanggo variabel ing Ansible

Ayo bayangake kaya apa playbook ing kasus iki:

- hosts: myapi
  roles:
    - api

- hosts: bbauth
  roles:
    - auth

- hosts: ghauth
  roles:
    - auth

We duwe telung klompok ing playbook, supaya langsung dianjurake kanggo nggawe nomer padha file grup ing variabel persediaan group_vars lan variabel playbook. Siji file grup ing kasus iki minangka katrangan babagan siji komponen aplikasi ing ndhuwur ing playbook. Nalika mbukak file grup ing variabel playbook, sampeyan langsung ndeleng kabeh beda saka prilaku standar peran diinstal ing grup. Ing variabel persediaan: beda ing prilaku klompok saka stand kanggo ngadeg.

Kode Gaya

  • Coba ora nggunakake variabel host_vars ing kabeh, amarga padha ora njlèntrèhaké sistem, nanging mung kasus khusus, kang ing mangsa bakal mimpin kanggo pitakonan: "Napa host iki beda saka liyane?", Jawaban sing ora. tansah gampang ditemokake.

Variabel Komunikasi

Nanging, apa variabel properti kabeh babagan, nanging babagan variabel komunikasi?
Bedane yaiku kudu padha tegese ing kelompok beda.

Ing kawitan iku idea nggunakake konstruksi sing nggegirisi kaya:
hostvars[groups['bbauth'][0]]['auth_bind_port'], nanging padha langsung nolak
amarga nduweni kekurangan. Kaping pisanan, bulkiness. Kapindho, katergantungan ing host tartamtu ing grup kasebut. Katelu, sadurunge miwiti panyebaran, perlu kanggo ngumpulake fakta saka kabeh host yen ora pengin entuk kesalahan saka variabel sing ora ditemtokake.

Akibaté, diputusake nggunakake variabel komunikasi.

Variabel Komunikasi - iki minangka variabel sing ana ing playbook lan dibutuhake kanggo nyambungake obyek sistem.

Variabel komunikasi diisi ing variabel sistem umum group_vars/all/vars lan kawangun kanthi mbusak kabeh variabel pamireng saka saben grup, lan nambah jeneng grup saka ngendi pamireng wis dibusak menyang awal variabel.

Iki njamin keseragaman lan ora tumpang tindih jeneng.

Ayo nyoba ngiket variabel saka conto ing ndhuwur:

Pendekatan sistem kanggo variabel ing Ansible

Ayo bayangake yen kita duwe variabel sing gumantung ing siji liyane:

# roles/api/defaults:
# Переменная запроса
api_auth1_address: "http://example.com:80"
api_auth2_address: "http://example2.com:80"

# roles/auth/defaults:
# Переменная слушатель
auth_bind_port: "20000"

Ayo dilebokake ing variabel umum group_vars/all/vars kabeh pamireng, lan tambahake jeneng grup menyang judhul:

# group_vars/all/vars
bbauth_auth_bind_port: "20000"
ghauth_auth_bind_port: "30000"

# group_vars/bbauth/vars
auth_bind_port: "{{ bbauth_auth_bind_port }}"

# group_vars/ghauth/vars
auth_bind_port: "{{ ghauth_auth_bind_port }}"

# group_vars/myapi/vars
api_auth1_address: "http://{{ bbauth_auth_service_name }}:{{ bbauth_auth_bind_port }}"
api_auth2_address: "http://{{ ghauth_auth_service_name }}:{{ ghauth_auth_bind_port }}"

Saiki, kanthi ngganti nilai konektor, kita bakal yakin manawa panyuwunan bakal menyang papan sing padha karo port kasebut.

Kode Gaya

  • Amarga peran lan klompok minangka obyek sistem sing beda, mula kudu duwe jeneng sing beda-beda, mula variabel link bakal nuduhake kanthi akurat manawa ana ing klompok server tartamtu, lan dudu peran ing sistem kasebut.

File gumantung lingkungan

Peran bisa nggunakake file sing beda-beda saka lingkungan menyang lingkungan.

Conto file kasebut yaiku sertifikat SSL. Simpen ing wangun teks
ing variabel ora trep banget. Nanging trep kanggo nyimpen dalan menyang wong-wong mau ing variabel.

Contone, kita nggunakake variabel api_ssl_key_file: "/path/to/file".

Amarga jelas manawa sertifikat kunci bakal ganti saka lingkungan menyang lingkungan, iki minangka variabel sing gumantung karo lingkungan, tegese kudu ana ing file kasebut.
group_vars/myapi/vars inventarisasi variabel, lan ngemot nilai 'contone'.

Cara sing paling trep ing kasus iki yaiku nyelehake file kunci ing repositori playbook ing sadawane dalan
files/prod/certs/myapi.key, banjur nilai variabel bakal dadi:
api_ssl_key_file: "prod/certs/myapi.key". Penak dumunung ing kasunyatan manawa wong sing tanggung jawab kanggo nyebarake sistem kasebut ing papan tartamtu uga duwe papan khusus ing gudang kanggo nyimpen file. Ing wektu sing padha, tetep bisa nemtokake path absolut menyang sertifikat ing server, yen sertifikat diwenehake dening sistem liyane.

Multiple stands ing siji lingkungan

Asring ana perlu kanggo masang sawetara stands meh podho rupo ing lingkungan padha karo minimal beda. Ing kasus iki, kita dibagi variabel gumantung lingkungan menyang sing ora owah ing lingkungan iki lan sing diganti. Lan kita nransfer sing terakhir langsung menyang file inventaris dhewe. Sawise manipulasi iki, bisa nggawe inventaris liyane langsung ing direktori lingkungan.

Bakal nggunakake maneh persediaan group_vars, lan uga bakal bisa redefine sawetara variabel langsung kanggo dhewe.

Struktur direktori pungkasan kanggo proyek penyebaran:

mydeploy                        # Каталог деплоя
├── deploy.yml                  # Плейбук деплоя
├── files                       # Каталог для файлов деплоя
│   ├── prod                    # Католог для средозависимых файлов стенда prod
│   │   └── certs               # 
│   │       └── myapi.key       #
│   └── test1                   # Каталог для средозависимых файлов стенда test1
├── group_vars                  # Каталог переменных плейбука
│   ├── all.yml                 # Файл для переменных связи всей системы
│   ├── myapi.yml               # Файл переменных свойств группы myapi
│   ├── bbauth.yml              # 
│   └── ghauth.yml              #
└── inventories                 #
    ├── prod                    # Каталог окружения prod
    │   ├── group_vars          # Каталог для переменных инвентори
    │   │   ├── myapi           #
    │   │   │   ├── vars.yml    # Средозависимые переменные группы myapi
    │   │   │   └── vault.yml   # Секреты (всегда средозависимы)
    │   │   ├── bbauth          # 
    │   │   │   ├── vars.yml    #
    │   │   │   └── vault.yml   #
    │   │   └── ghauth          #
    │   │       ├── vars.yml    #
    │   │       └── vault.yml   #
    │   └── prod.ini            # Инвентори стенда prod
    └── test                    # Каталог окружения test
        ├── group_vars          #
        │   ├── myapi           #
        │   │   ├── vars.yml    #
        │   │   └── vault.yml   #
        │   ├── bbauth          #
        │   │   ├── vars.yml    #
        │   │   └── vault.yml   #
        │   └── ghauth          #
        │       ├── vars.yml    #
        │       └── vault.yml   #
        ├── test1.ini           # Инвентори стенда test1 в среде test
        └── test2.ini           # Инвентори стенда test2 в среде test

Summing up

Sawise ngatur variabel sesuai karo artikel: saben file variabel tanggung jawab kanggo tugas tartamtu. Lan amarga file kasebut duwe tugas tartamtu, mula bisa nemtokake wong sing tanggung jawab kanggo bener saben file. Contone, pangembang penyebaran sistem dadi tanggung jawab kanggo ngisi variabel playbook sing bener, dene pangurus sing diterangake ing inventaris langsung tanggung jawab kanggo ngisi inventaris variabel.

Peran dadi unit pangembangan dhewe kanthi antarmuka dhewe, ngidini pangembang peran ngembangake kapabilitas tinimbang ngatur peran kasebut menyang sistem. Masalah iki utamané ngangap peran umum kanggo kabeh sistem ing kampanye.

Administrator sistem ora perlu maneh ngerti kode panyebaran. Kabeh sing dibutuhake kanggo panyebaran sukses yaiku ngisi file variabel sing gumantung ing lingkungan.

Sastra

  1. Dokumentasi

penulis

Kalyuzhny Denis Alexandrovich

Source: www.habr.com

Add a comment