Un enfoque sistemático de las variables en Ansible

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.



imagen



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 . ?



imagen



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 , .



imagen



, :



- 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 , .



.



:



imagen



, , :



# 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