Pendekatan sistematis terhadap variabel di Ansible

gaya kode pengembang yang mungkin



Hei! Nama saya Denis Kalyuzhny dan saya bekerja sebagai insinyur di departemen otomasi proses pengembangan. Setiap hari, versi baru aplikasi diluncurkan di ratusan server kampanye. Dan dalam artikel ini saya membagikan pengalaman saya menggunakan Ansible untuk tujuan ini.



Panduan ini memberikan cara untuk mengatur variabel dalam penerapan. Panduan ini dirancang untuk mereka yang sudah menggunakan peran dalam buku pedoman mereka dan membaca Praktik Terbaik , tetapi menghadapi masalah serupa:



  • Setelah menemukan variabel dalam kode, tidak mungkin untuk segera memahami apa yang menjadi tanggung jawabnya;
  • Ada beberapa peran, dan variabel harus terikat dengan nilai yang sama, tetapi tidak ada yang berhasil;
  • Kesulitan muncul dalam menjelaskan kepada orang lain bagaimana logika variabel dalam buku pedoman Anda bekerja


Kami menghadapi masalah ini pada proyek-proyek di perusahaan kami, sebagai akibatnya kami sampai pada aturan untuk desain variabel di buku pedoman kami, yang sampai batas tertentu memecahkan masalah ini.



gambar



Variabel dalam peran



Peran adalah Objek terpisah dari sistem penerapan. Seperti objek sistem lainnya, ia harus memiliki antarmuka untuk berinteraksi dengan seluruh sistem. Variabel peran adalah antarmuka seperti itu.



, , api, Java . ?



gambar



2 :



1. 
    a)   
    )   
2. 
    a)  
    )   
    )   


— , .



— , , , .



— , , .



, 1, 2, 2 — , (, ..) defaults . 1. 2. 'example' , .



Code style



  • . , .
  • , , .
  • . Ansible .



    :



    myrole_user:
        login: admin
        password: admin


    login — , password — .

    ,

    . . :



    myrole_user_login: admin
    myrole_user_password: admin






( ), , . , : git . , — , . .



, , : .



mydeploy                        #  
├── deploy.yml                  #  
├── group_vars                  #   
│   ├── all.yml                 #      
│   └── myapi.yml               #     myapi
└── inventories                 #
    └── prod                    #   prod
        ├── prod.ini            #  
        └── group_vars          #    
            └── myapi           #
                ├── vars.yml    #    myapi
                └── vault.yml   #  ( ) *


* — Variables and Vaults



, , . , , . , , , .



, , .



, .



, , SSL , SSL . , , .





1, 2 Java , .



gambar



, :



- hosts: myapi
  roles:
    - api

- hosts: bbauth
  roles:
    - auth

- hosts: ghauth
  roles:
    - auth


, group_vars , . , . . : .



Code Style



  • host_vars , , , : " ?", .




, , ?

, .



:

hostvars[groups['bbauth'][0]]['auth_bind_port'],

. -, . -, . -, , .



.



— , , .



group_vars/all/vars , .



.



:



gambar



, , :



# roles/api/defaults:
#  
api_auth1_address: "http://example.com:80"
api_auth2_address: "http://example2.com:80"

# roles/auth/defaults:
#  
auth_bind_port: "20000"


group_vars/all/vars , :



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


, , , , .



Code Style



  • , , , , .




, .



SSL-.

. .



, api_ssl_key_file: "/path/to/file".



, , ,

group_vars/myapi/vars , ' '.





files/prod/certs/myapi.key, :

api_ssl_key_file: "prod/certs/myapi.key". , , . , .











. , , . . .



group_vars, .









:



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




: . , . , , , .



, , . .



. , .












All Articles