ansible devops codestyle
¡Oye! Mi nombre es Denis Kalyuzhny y trabajo como ingeniero en el departamento de automatización de procesos de desarrollo. Todos los días, se implementan nuevas versiones de aplicaciones en cientos de servidores de campañas. Y en este artículo comparto mi experiencia de usar Ansible para estos propósitos.
Esta guía proporciona una forma de organizar las variables en una implementación. Esta guía está diseñada para aquellos que ya usan roles en sus guías y leen BestPractices , pero enfrentan problemas similares:
- Habiendo encontrado una variable en el código, es imposible entender inmediatamente de qué es responsable;
- Hay varios roles y las variables deben estar limitadas por el mismo valor, pero nada funciona;
- Surgen dificultades al explicar a los demás cómo funciona la lógica de las variables en sus libros de jugadas.
Encontramos estos problemas en proyectos en nuestra empresa, como resultado de lo cual llegamos a las reglas para el diseño de variables en nuestros libros de jugadas, que en cierta medida resolvieron estos problemas.
Variables en roles
Un rol es un objeto independiente del sistema de implementación. Como cualquier objeto del sistema, debe tener una interfaz para interactuar con el resto del sistema. Las variables de función son una interfaz de este tipo.
, , 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
: . , . , , , .
, , . .
. , .