pengantar
Ansible adalah sistem manajemen konfigurasi yang kuat yang digunakan untuk mengonfigurasi dan mengelola infrastruktur dan aplikasi di berbagai lingkungan. Meskipun Ansible menyediakan sintaks yang mudah dibaca, alur kerja yang fleksibel, dan alat yang canggih, mengelola sejumlah besar host dapat menjadi tantangan jika berbeda bergantung pada lingkungan penerapan dan fungsionalitas.
Dalam tutorial ini, kita akan membahas beberapa strategi untuk menggunakan Ansible untuk bekerja dengan lingkungan penerapan multi-tahap. Biasanya, persyaratan untuk tahapan yang berbeda mengarah pada jumlah dan konfigurasi komponen yang berbeda. Misalnya, persyaratan memori untuk server pengembangan mungkin berbeda dari persyaratan untuk lingkungan pementasan dan produksi, dan penting untuk memiliki kontrol eksplisit atas bagaimana variabel yang mewakili persyaratan tersebut diutamakan. Dalam artikel ini, kita akan membahas beberapa cara untuk mengabstraksi perbedaan ini dan beberapa konstruksi yang Ansible sediakan untuk mendorong penggunaan kembali konfigurasi.
Strategi yang tidak lengkap untuk mengelola lingkungan multistage dengan Ansible
Meskipun ada beberapa cara untuk mengelola lingkungan di Ansible, Ansible sendiri tidak menawarkan solusi yang lebih baik. Sebaliknya, ia menyediakan banyak konstruksi yang dapat digunakan untuk memanipulasi lingkungan dan memungkinkan pengguna untuk memilih.
Pendekatan, yang kami tunjukkan dalam panduan ini didasarkan pada sekelompok variabel yang memungkinkan dan beberapa register ( Inventaris ). Namun, ada beberapa strategi lain yang patut dipertimbangkan. Kami akan melihat beberapa ide di bawah ini dan mencari tahu mengapa ide tersebut bisa menjadi masalah saat diterapkan di lingkungan yang kompleks.
Jika Anda ingin memulai dengan strategi Ansible yang direkomendasikan, lompat ke bagian tentang menggunakan Ansible Groups dan Multiple Registries.
Mengandalkan hanya pada variabel kelompok
, Ansible . , . Ansible . . . :
- (, dev, stage, prod . .)
- (-, . .)
- (NYC, SFO . .)
. , - () ( ) - ( ).
, Ansible . , , , , Ansible .
Ansible . Ansible , , , . , .
Ansible , [groupname: children]
. . , .
. , environment
, dev
, stage
, prod
. , environment
dev
. , functions
, web
, database
loadbalancer
.
, . , , environments
functions
. .
, . , , :
, :
. . . [function:children] web database loadbalancer region [region:children] nyc sfo environments [environments:children] dev stage prod
, , region
function
. , environments
, . , dev
, nyc
web
, , , dev
.
. , . Ansible , . .
Ansible-,
Ansible , , vars_files
include_vars
. Ansible plays , . vars_files
, include_vars
.
, group_vars
, .
, group_vars
:
group_vars/dev
--- env: dev
group_vars/stage
--- env: stage
group_vars/web
---
function: web
group_vars/database
---
function: database
vars
, . vars. group_vars
, include_vars
.yml.
, server_memory_size
vars
. , , , . , - :
vars/dev.yml
--- server_memory_size: 512mb
vars/prod.yml
--- server_memory_size: 4gb
vars/web.yml
--- server_memory_size: 1gb
vars/database.yml
--- server_memory_size: 2gb
playbook, vars
, group_vars
. , .
vars_files
:
example_play.yml
---
- name: variable precedence test
hosts: all
vars_files:
- "vars/{{ env }}.yml"
- "vars/{{ function }}.yml"
tasks:
- debug: var=server_memory_size
, server_memory_size
var/web.yml
var/database.yml
:
ansible-playbook -i inventory example_play.yml
Output. . . TASK [debug] ******************************************************************* ok: [host1] => { "server_memory_size": "1gb" # value from vars/web.yml } ok: [host2] => { "server_memory_size": "1gb" # value from vars/web.yml } ok: [host3] => { "server_memory_size": "2gb" # value from vars/database.yml } ok: [host4] => { "server_memory_size": "2gb" # value from vars/database.yml } . . .
, :
example_play.yml
---
- name: variable precedence test
hosts: all
vars_files:
- "vars/{{ function }}.yml"
- "vars/{{ env }}.yml"
tasks:
- debug: var=server_memory_size
playbook , :
ansible-playbook -i inventory example_play.yml
Copy
Output. . . TASK [debug] ******************************************************************* ok: [host1] => { "server_memory_size": "512mb" # value from vars/dev.yml } ok: [host2] => { "server_memory_size": "4gb" # value from vars/prod.yml } ok: [host3] => { "server_memory_size": "512mb" # value from vars/dev.yml } ok: [host4] => { "server_memory_size": "4gb" # value from vars/prod.yml } . . .
include_vars
, , :
--- - name: variable precedence test hosts: localhost tasks: - include_vars: file: "{{ item }}" with_items: - "vars/{{ function }}.yml" - "vars/{{ env }}.yml" - debug: var=server_memory_size
, Ansible , . , , .
, vars_files
include_vars
, , , . group_vars
, vars
. . , Ansible group_vars
.
, . playbook , . Playbook . , ansible
-, .
Ansible:
, . Ansible , .
— , . , , . group_vars
.
:
. ├── ansible.cfg ├── environments/ # Parent directory for our environment-specific directories │ │ │ ├── dev/ # Contains all files specific to the dev environment │ │ ├── group_vars/ # dev specific group_vars files │ │ │ ├── all │ │ │ ├── db │ │ │ └── web │ │ └── hosts # Contains only the hosts in the dev environment │ │ │ ├── prod/ # Contains all files specific to the prod environment │ │ ├── group_vars/ # prod specific group_vars files │ │ │ ├── all │ │ │ ├── db │ │ │ └── web │ │ └── hosts # Contains only the hosts in the prod environment │ │ │ └── stage/ # Contains all files specific to the stage environment │ ├── group_vars/ # stage specific group_vars files │ │ ├── all │ │ ├── db │ │ └── web │ └── hosts # Contains only the hosts in the stage environment │ ├── playbook.yml │ └── . . .
, . (hosts
) group_vars
.
. web
db
. . , , , . group_vars
.
. , , . -, . .
, , — . . — Ansible . all
group_vars
all
.
, , . , . .
- . (environments
). :
cd environments
touch 000_cross_env_vars
group_vars
, all
all
. :
cd dev/group_vars mv all env_specific mkdir all mv env_specific all/
, :
cd all/ ln -s ../../../000_cross_env_vars .
, :
. ├── ansible.cfg ├── environments/ │ │ │ ├── 000_cross_env_vars │ │ │ ├── dev/ │ │ ├── group_vars/ │ │ │ ├── all/ │ │ │ ├── 000_cross_env_vars -> ../../../000_cross_env_vars │ │ │ │ └── env_specific │ │ │ ├── db │ │ │ └── web │ │ └── hosts │ │ │ ├── prod/ │ │ ├── group_vars/ │ │ │ ├── all/ │ │ │ │ ├── 000_cross_env_vars -> ../../../000_cross_env_vars │ │ │ │ └── env_specific │ │ │ ├── db │ │ │ └── web │ │ └── hosts │ │ │ └── stage/ │ ├── group_vars/ │ │ ├── all/ │ │ │ ├── 000_cross_env_vars -> ../../../000_cross_env_vars │ │ │ └── env_specific │ │ ├── db │ │ └── web │ └── hosts │ ├── playbook.yml │ └── . . .
, 000_cross_env_vars
, .
ansible.cfg
. .
-, ansible
ansible-playbook
. :
ansible -i environments/dev -m ping
, :
ansible -m ping
-, . . , , -i
.
, ansible.cfg
. /etc/ansible/ansible.cfg
.
. ansible.cfg
. /etc/ansibile/ansible.cfg
, . /etc/ansible/ansible.cfg
/etc/ansible
, .
nano ansible.cfg
, . , hosts:
[defaults] inventory = ./environments/dev
-i
. - -i
, .
Dalam artikel ini, kami menjelajahi fleksibilitas yang Ansible berikan untuk mengelola host Anda di berbagai lingkungan. Hal ini memungkinkan pengguna untuk menerapkan banyak strategi berbeda untuk menangani prioritas variabel ketika tuan rumah adalah anggota dari beberapa grup, tetapi ambiguitas dan kurangnya panduan resmi dapat menjadi masalah bagi Anda. Seperti halnya teknologi apa pun, yang paling sesuai untuk organisasi Anda akan bergantung pada kasus penggunaan dan kompleksitas persyaratan Anda. Cara terbaik untuk menemukan strategi yang tepat untuk Anda adalah dengan bereksperimen. Bagikan kasus penggunaan dan pendekatan Anda dalam komentar di bawah.