Pendekatan sistem pikeun variabel dina Ansible

ansible devops codestyle

Héy! Nami abdi Denis Kalyuzhny Abdi damel salaku insinyur di departemen automation prosés pangwangunan. Saban poé, ngawangun aplikasi anyar digulung dina ratusan server kampanye. Sareng dina tulisan ieu kuring ngabagi pangalaman kuring ngagunakeun Ansible pikeun tujuan ieu.

Pituduh ieu nawiskeun cara pikeun ngatur variabel dina panyebaran. Pituduh ieu ditujukeun pikeun jalma anu parantos ngagunakeun peran dina buku kaulinan sareng parantos maca Praktek Pangalusna, tapi nyanghareupan masalah anu sami:

  • Saatos mendakan variabel dina kode, mustahil pikeun langsung ngartos naon tanggung jawabna;
  • Aya sababaraha kalungguhan, sarta variabel kudu pakait sareng hiji nilai, tapi ngan teu dianggo;
  • Ngabogaan kasusah ngajelaskeun ka batur kumaha logika variabel dina playbooks Anjeun jalan

Kami mendakan masalah-masalah ieu dina proyék-proyék di perusahaan kami, salaku akibatna kami sumping kana aturan pikeun ngarancang variabel dina playbooks kami, anu dina sababaraha tingkatan ngarengsekeun masalah ieu.

Pendekatan sistem pikeun variabel dina Ansible

Variabel dina kalungguhan

Peran mangrupikeun Objék anu misah tina sistem panyebaran. Sapertos naon waé obyék sistem, éta kedah gaduh antarmuka pikeun interaksi sareng sistem anu sanés. Antarbeungeut sapertos variabel peran.

Hayu urang nyandak, contona, peran api, nu masang aplikasi Java dina server. Variabel naon anu tiasa dipibanda?

Pendekatan sistem pikeun variabel dina Ansible

Peran variabel tiasa dibagi kana 2 jinis dumasar kana jinisna:

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

sipat variabel mangrupa variabel anu nangtukeun paripolah hiji peran.

Variabel Query - ieu variabel anu nilai dipaké pikeun nunjuk sumberdaya éksternal peran.

Variabel listeners - ieu variabel anu nilaina dipaké pikeun ngabentuk variabel pamundut.

Di sisi anu sanés, 1a, 2a, 2b mangrupikeun variabel anu henteu gumantung kana lingkungan (hardware, sumber éksternal, jsb) sareng tiasa dieusi ku nilai standar dina peran standar. Nanging, mustahil pikeun ngeusian variabel jinis 1.b sareng 2.c kalayan nilai lian ti 'conto', sabab bakal robih tina stand ka stand gumantung kana lingkungan.

Gaya kode

  • Ngaran variabel kudu dimimitian ku ngaran peran. Ieu bakal ngagampangkeun pikeun terang ka hareupna naon peran variabel sareng naon tanggung jawabna.
  • Nalika nganggo variabel dina peran, anjeun kedah mastikeun nuturkeun prinsip enkapsulasi sareng nganggo variabel anu didefinisikeun boh dina peran sorangan atanapi dina peran anu ayeuna gumantung.
  • Hindarkeun ngagunakeun kamus pikeun variabel. Ansible henteu ngamungkinkeun anjeun gampang nimpa nilai individu dina kamus.

    Conto variabel goréng:

    myrole_user:
        login: admin
        password: admin

    Di dieu login mangrupa variabel bebas, sarta sandi mangrupa variabel gumantung. Tapi
    Kusabab aranjeunna digabungkeun kana kamus, anjeun kedah netepkeun éta lengkep
    salawasna. Nu kacida teu merenah. Langkung saé ku cara kieu:

    myrole_user_login: admin
    myrole_user_password: admin

Variabel dina playbooks deployment

Nalika nyusun playbook deployment (saterusna disebut playbook nu), urang taat kana aturan yén éta kudu ditempatkeun dina Repository misah. Sarua sareng peran: masing-masing dina gudang git sorangan. Ieu ngidinan Anjeun pikeun ngarti yén peran jeung playbook mangrupakeun objék bebas béda tina sistem deployment, sarta parobahan dina hiji obyék teu kudu mangaruhan operasi lianna. Ieu kahontal ku cara ngarobah nilai standar variabel.

Nalika nyusun playbook, pikeun nyimpulkeun, mungkin waé pikeun nimpa nilai standar variabel peran dina dua tempat: dina variabel playbook sareng dina 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 sarta Vaults

Bédana téh variabel playbook sok dipaké nalika nelepon playbooks lokasina di tingkat anu sarua sakumaha eta. Ieu ngandung harti yén variabel ieu hadé pikeun ngarobah nilai standar variabel bebas lingkungan. Sabalikna, variabel inventaris ngan bakal dianggo pikeun lingkungan khusus, anu idéal pikeun variabel khusus lingkungan.

Kadé dicatet yén prioritas variabel moal ngidinan Anjeun pikeun override variabel munggaran dina variabel playbook lajeng misah dina hiji inventory.

Ieu ngandung harti yén geus dina tahap ieu perlu mutuskeun variabel gumantung lingkungan atawa henteu tur nempatkeun eta dina tempat luyu.

Contona, dina hiji proyék, variabel jawab sangkan SSL geus lila gumantung lingkungan, saprak urang teu bisa ngaktipkeun SSL alesan saluareun kontrol urang di salah sahiji lapak. Saatos kami ngalereskeun masalah ieu, janten lingkungan bebas sareng ngalih ka variabel playbook.

Variabel Harta pikeun Grup

Hayu urang dilegakeun model urang dina Gambar 1 ku nambahkeun 2 grup server kalawan aplikasi Java béda, tapi kalawan setélan béda.

Pendekatan sistem pikeun variabel dina Ansible

Hayu urang ngabayangkeun kumaha playbook bakal kasampak kawas dina hal ieu:

- hosts: myapi
  roles:
    - api

- hosts: bbauth
  roles:
    - auth

- hosts: ghauth
  roles:
    - auth

Simkuring gaduh tilu grup dina playbook nu, kitu eta disarankeun geuwat nyieun jumlah sarua file grup dina variabel inventory group_vars jeung variabel playbook. Hiji file grup dina hal ieu mangrupa pedaran hiji komponén tina aplikasi di luhur dina playbook nu. Nalika anjeun muka file grup dina variabel playbook, anjeun langsung ningali sagala bédana tina paripolah standar tina peran anu dipasang dina grup. Dina variabel inventory: béda dina kabiasaan grup ti stand ka stand.

Gaya Kode

  • Coba teu nganggo variabel host_vars pisan, sabab henteu ngajelaskeun sistem, tapi ngan ukur kasus khusus, anu di hareup bakal nyababkeun patarosan: "Naha host ieu béda ti anu sanés?", Jawaban anu henteu. salawasna gampang pikeun manggihan.

Variabel Komunikasi

Sanajan kitu, éta naon variabel sipat téh sadayana ngeunaan, tapi kumaha upami variabel komunikasi?
Bédana maranéhanana nyaéta maranéhanana kudu boga harti sarua dina grup béda.

Mimitina éta gagasan ngagunakeun konstruksi monstrous kawas:
hostvars[groups['bbauth'][0]]['auth_bind_port'], tapi aranjeunna langsung nampik
sabab boga kalemahan. Anu mimiti, bulkiness. Bréh, gumantungna kana host husus dina grup. Katilu, sateuacan ngamimitian panyebaran, perlu pikeun ngumpulkeun fakta ti sadaya host upami urang henteu hoyong kéngingkeun kasalahan tina variabel anu teu ditangtukeun.

Hasilna, diputuskeun ngagunakeun variabel komunikasi.

Variabel Komunikasi - ieu variabel anu milik playbook tur diperlukeun pikeun nyambungkeun objék sistem.

Variabel komunikasi dieusi dina variabel sistem umum group_vars/all/vars sarta dibentuk ku miceun kabeh variabel pangdéngé ti unggal grup, sarta nambahkeun ngaran grup ti mana pangdéngé ieu dihapus ka awal variabel.

Ieu mastikeun kaseragaman sareng henteu tumpang tindih nami.

Hayu urang coba ngabeungkeut variabel tina conto di luhur:

Pendekatan sistem pikeun variabel dina Ansible

Hayu urang ngabayangkeun yén urang gaduh variabel anu silih gumantung:

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

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

Hayu urang nempatkeun kana variabel umum group_vars/all/vars sadaya pamirsa, sareng tambahkeun nami grup kana judulna:

# 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 }}"

Ayeuna, ku cara ngarobah nilai konektor, urang bakal mastikeun yén pamundut bakal balik ka tempat anu sarua dimana port ieu lokasina.

Gaya Kode

  • Kusabab peran sareng grup mangrupikeun objék sistem anu béda, aranjeunna kedah gaduh nami anu béda, maka variabel tautan bakal nunjukkeun yén aranjeunna kagolong kana grup server khusus, sareng sanés peran dina sistem.

File gumantung lingkungan

Peran tiasa nganggo file anu béda-béda ti lingkungan ka lingkungan.

Conto file sapertos nyaéta sertipikat SSL. Simpen aranjeunna dina bentuk téks
dina variabel teu pisan merenah. Tapi éta merenah pikeun nyimpen jalur ka aranjeunna di jero variabel.

Salaku conto, urang nganggo variabel api_ssl_key_file: "/path/to/file".

Kusabab écés yén sertipikat konci bakal robih ti lingkungan ka lingkungan, ieu mangrupikeun variabel anu gumantung kana lingkungan, anu hartosna kedah aya dina file.
group_vars/myapi/vars inventaris variabel, sareng ngandung nilai 'contona'.

Cara anu paling merenah dina hal ieu nyaéta nempatkeun file konci dina gudang playbook sapanjang jalur
files/prod/certs/myapi.key, mangka nilai variabel bakal kieu:
api_ssl_key_file: "prod/certs/myapi.key". Genahna aya dina kanyataan yén jalma-jalma anu tanggung jawab nyebarkeun sistem dina tempat khusus ogé gaduh rohangan khusus sorangan dina gudang pikeun nyimpen file na. Dina waktos anu sami, tetep mungkin pikeun netepkeun jalur mutlak ka sertipikat dina server, upami sertipikat disayogikeun ku sistem anu sanés.

Sababaraha nangtung dina hiji lingkungan

Sering aya anu peryogi nyebarkeun sababaraha lapak ampir idéntik dina lingkungan anu sami sareng bédana minimal. Dina hal ieu, urang ngabagi variabel gumantung lingkungan kana variabel anu henteu robih dina lingkungan ieu sareng variabel anu robih. Sareng urang mindahkeun anu terakhir langsung kana file inventaris sorangan. Saatos manipulasi ieu, janten tiasa nyiptakeun inventaris sanés langsung dina diréktori lingkungan.

Bakal make deui inventory group_vars, sarta ogé bakal bisa ngartikeun ulang sababaraha variabel langsung keur dirina.

Struktur diréktori ahir pikeun proyék panyebaran:

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

Nyimpulkeun

Saatos ngatur variabel luyu jeung artikel: unggal file variabel jawab tugas husus. Sareng saprak filena ngagaduhan tugas-tugas anu tangtu, janten mungkin pikeun napelkeun batur anu tanggung jawab kana kabeneran unggal file. Contona, pamekar ti deployment sistem jadi tanggung jawab ngeusian bener variabel playbook, bari administrator anu nangtung dijelaskeun dina inventory langsung jawab ngeusian inventory variabel.

Peran janten unit pamekaran sorangan sareng antarmuka sorangan, ngamungkinkeun pamekar peran ngembangkeun kamampuan tinimbang nyaluyukeun peran kana sistem. masalah ieu utamana prihatin peran umum pikeun sakabéh sistem dina kampanye.

Administrator sistem henteu kedah ngartos deui kode panyebaran. Sadaya anu diperyogikeun pikeun panyebaran suksés nyaéta ngeusian file variabel anu gumantung kana lingkungan.

pustaka

  1. Dokuméntasi

nu ngarang

Kalyuzhny Denis Alexandrovich

sumber: www.habr.com

Tambahkeun komentar