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.
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 . ?
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 # ( ) *
, , . , , . , , , .
, , .
, .
, , SSL , SSL . , , .
1, 2 Java , .
, :
- 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
, .
.
:
, , :
# 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
: . , . , , , .
, , . .
. , .