Une approche systématique des variables dans Ansible

codestyle devops ansible



Hey! Je m'appelle Denis Kalyuzhny et je travaille comme ingénieur dans le département d'automatisation des processus de développement. Chaque jour, de nouvelles versions d'applications sont déployées sur des centaines de serveurs de campagne. Et dans cet article, je partage mon expérience d'utilisation d'Ansible à ces fins.



Ce guide fournit un moyen d'organiser les variables dans un déploiement. Ce guide est conçu pour ceux qui utilisent déjà des rôles dans leurs playbooks et lisent BestPractices , mais sont confrontés à des problèmes similaires:



  • Ayant trouvé une variable dans le code, il est impossible de comprendre immédiatement de quoi elle est responsable;
  • Il existe plusieurs rôles et les variables doivent être liées par la même valeur, mais rien ne fonctionne;
  • Des difficultés surviennent pour expliquer aux autres comment fonctionne la logique des variables dans vos playbooks


Nous avons fait face à ces problèmes sur des projets dans notre entreprise, à la suite desquels nous sommes arrivés aux règles de conception des variables dans nos playbooks, ce qui a dans une certaine mesure résolu ces problèmes.



image



Variables dans les rôles



Un rôle est un objet distinct du système de déploiement. Comme tout objet système, il doit avoir une interface pour interagir avec le reste du système. Cette interface est constituée de variables de rôle.



, , api, Java . ?



image



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



image



, :



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



.



:



image



, , :



# 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