Puncte:1

gazde selectate în inventar pe baza subsetului de nume din ansible

drapel dz

Sunt destul de nou în ansible, așa că poate că acest lucru este ușor de făcut.

Avem un număr mare de dispozitive care au o convenție de denumire consecventă între diferite medii.

app0[01:25].dev.domain.com
aplicație[01:25].qa.domain.com
app[01:25].uat.domain.com
aplicație[01:25].prod.domain.com

Diverse dispozitive din interiorul acestor servere de aplicații au roluri specifice, cum ar fi server web, server de aplicații, server api etc. și este același în mediul înconjurător. Deci app05 este un server web în dev, qa, uat, uat, prod.

În acest moment, folosesc group_vars și asignez anumite roluri de server numelor de grup. Dar aș prefera să nu fiu nevoit să configurez nume de grup pentru fiecare mediu (webdev, webqa, webuat etc.)

Există o soluție simplă la asta? Cred că rolurile ar complica puțin lucrurile, dar poate asta este soluția?

Puncte:0
drapel br

Î: "Configurați nume de grup pentru fiecare mediu (webdev, webqa, webuat etc.)"

R: Creați variabila în mod dinamic, de ex.

- gazde: toate
  gather_facts: false
  vars:
    env:
      app05: web
  sarcini:
    - set_fact:
        env_local: „{{ env[_host]|d('none') }}{{ _group }}”
      vars:
        _arr: „{{ inventory_hostname.split('.') }}”
        _host: „{{ _arr.0 }}”
        _group: „{{ _arr.1 }}”
    - depanare:
        var: env_local

ok: [app01.dev.domain.com] => 
  env_local: nonedev
ok: [app02.dev.domain.com] => 
  env_local: nonedev
ok: [app03.dev.domain.com] => 
  env_local: nonedev
ok: [app04.dev.domain.com] => 
  env_local: nonedev
ok: [app05.dev.domain.com] => 
  env_local: webdev

Utilizați modulul add_host și creați grupurile în mod dinamic. De exemplu, creați fișierul

shell> cat add_host_to_groups.yml
- add_host:
    nume: „{{ i }}”
    grupuri: „{{ item }}{{ (i.split('.')).1 }}”
  buclă: „{{ _hosts }}”
  loop_control:
    loop_var: i

și includeți-l în bucla regulilor de atribuire

- gazde: toate
  gather_facts: false
  vars:
    env:
      web: app05
  sarcini:
    - include_tasks: add_host_to_groups.yml
      buclă: „{{ env.keys()|listă }}”
      vars:
        _hosts: „{{ ansible_play_hosts_all|select('match', env[item] ~ '.*') }}"
      run_once: adevărat
    - depanare:
        var: grupuri
      run_once: adevărat

  grupuri:
    toate:
    - app01.dev.domain.com
    - app02.dev.domain.com
    - app03.dev.domain.com
      ...
    - app25.prod.domain.com
    webdev:
    - app05.dev.domain.com
    webprod:
    - app05.prod.domain.com
    webqa:
    - app05.qa.domain.com
    webuat:
    - app05.uat.domain.com

Folosiți grupurile în piese consecutive, de ex.

- gazde: webqa
  gather_facts: false
  sarcini:
    - depanare:
        var: ansible_play_hosts_all

  ansible_play_hosts_all:
  - app05.qa.domain.com

Potriviți dicționarul înv la nevoile tale.

flyerhawk avatar
drapel dz
BINE. Va trebui să procesez asta puțin, dar arată grozav. Voi reveni după ce mi-am dat seama ce sugerezi aici. LAUGH OUT LOUD.
Puncte:0
drapel cn

O schemă de inventar care stabilește o sursă de adevăr ar fi interogarea acestor grupuri dintr-un sistem. Ceva mai sofisticat decât șirurile din numele DNS.

De exemplu, sistemul de baze de date de inventar netbox are un rol de dispozitiv care s-ar putea potrivi. Nu pentru a alege netbox, dar are un plugin de inventar Ansible și un model de bază de date deschisă, așa că este ușor de vorbit.


Cu toate acestea, poate că o bază de date externă frumoasă nu există încă. O astfel de schemă obișnuită de denumire poate fi generată. Cu cel mai recursiv dintre pluginurile de inventar Ansible, generator:

# inventar.yml
plugin: generator
gazde:
    nume: „{{ aplicație }}{{ număr }}.{{ mediu }}.example.com”
    părinţi:
      - nume: „{{ aplicație }}_{{ mediu }}”
        părinţi:
          - nume: „{{ aplicație }}”
            vars:
              aplicație: „{{ aplicație }}”
          - nume: „{{ mediu }}”
            vars:
              mediu: „{{ mediu }}”
straturi:
    aplicatie:
        - aplicație
        - api
    mediu inconjurator:
        - dev
        - qa
        - uat
        - prod
    număr:
        - "01"
        - "02"
        - "05"

Numele straturilor sunt arbitrare.Având în vedere rădăcina „gazde” și notația „părinți”, numele cu indentație mai profundă sunt grupuri care conțin numele exterioare.

ansible-inventory -i inventory.yml --list va imprima gazde în documentul JSON de inventar al Ansible. Ieșire parțială:

{
    „_meta”: {
        „hostvars”: {

           „app05.qa.example.com”: {
                "application": "aplicație",
                „mediu”: „qa”
            }
        }
    },

    „app_qa”: {
        „gazde”: [
            „app01.qa.example.com”,
            „app02.qa.example.com”,
            „app05.qa.example.com”
        ]
    },

    „aplicație”: {
        „copii”: [
            "app_dev",
            "app_prod",
            "app_qa",
            "app_uat"
        ]
    },

    "qa": {
        „copii”: [
            "api_qa",
            „app_qa”
        ]
    },


}

Și continuăm pentru alte combinații.

Observați că a făcut:

  • grupuri de „aplicații”.
  • grupuri de „mediu”.
  • grupuri de combinații „mediu de aplicație”.
  • nume de gazdă conform modelului de nume DNS
  • vars care conțin „aplicația” și „mediul” pentru fiecare gazdă

Limitările acestui plugin includ:

Făcând mereu produsul cartezian al combinațiilor de straturi. Nu pot avea mai mult sau mai puțin dintr-un anumit grup și nici nu pot începe schemele de numerotare pe valori diferite.

Neavând intervale de gazdă compacte. Nici sintaxa [01:25], nici funcția range() nu funcționează. Luați în considerare să solicitați acest lucru prin depunerea unei probleme. Ca o soluție, zeci de numere din fișierul de configurare sunt funcționale.

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.