Comment gérer un environnement multi-étapes avec Ansible

introduction







Ansible est un puissant système de gestion de configuration utilisé pour configurer et gérer l'infrastructure et les applications dans divers environnements. Alors qu'Ansible fournit une syntaxe facile à lire, des flux de travail flexibles et des outils puissants, la gestion d'un grand nombre d'hôtes peut être difficile si elles diffèrent en fonction de l'environnement de déploiement et des fonctionnalités.







Dans ce didacticiel, nous discuterons de certaines stratégies d'utilisation d'Ansible pour travailler avec des environnements de déploiement en plusieurs étapes. En règle générale, les exigences relatives aux différentes étapes conduisent à des quantités et à des configurations différentes des composants. Par exemple, les exigences de mémoire pour un serveur de développement peuvent différer de celles des environnements de préparation et de production, et il est important d'avoir un contrôle explicite sur la façon dont les variables qui représentent ces exigences sont prioritaires. Dans cet article, nous discuterons de certaines des façons d'abstraire ces différences et de certaines des constructions fournies par Ansible pour encourager la réutilisation de la configuration.







Stratégies incomplètes de gestion d'environnements à plusieurs niveaux avec Ansible







Bien qu'il existe plusieurs façons de gérer les environnements dans Ansible, Ansible lui-même n'offre pas une meilleure solution. Au contraire, il fournit de nombreuses constructions qui peuvent être utilisées pour manipuler des environnements et permet à l'utilisateur de choisir.







L'approche, que nous démontrons dans ce guide est basée sur un groupe de variables Ansible et plusieurs registres ( Inventories ). Cependant, il existe plusieurs autres stratégies à considérer. Nous examinerons certaines de ces idées ci-dessous et découvrirons pourquoi elles peuvent être problématiques lorsqu'elles sont mises en œuvre dans des environnements complexes.







Si vous souhaitez commencer avec la stratégie Ansible recommandée, passez à la section sur l'utilisation des groupes Ansible et de plusieurs registres.







S'appuyer uniquement sur des variables de groupe







, 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



, .













Dans cet article, nous avons exploré la flexibilité qu'offre Ansible pour gérer vos hôtes dans plusieurs environnements. Cela permet aux utilisateurs d'appliquer de nombreuses stratégies différentes pour gérer la priorité variable lorsque l'hôte est membre de plusieurs groupes, mais l'ambiguïté et le manque de conseils officiels peuvent être un problème pour vous. Comme pour toute technologie, la meilleure solution pour votre organisation dépendra de vos cas d'utilisation et de la complexité de vos exigences. La meilleure façon de trouver une stratégie qui vous convient est d'expérimenter. Partagez votre cas d'utilisation et votre approche dans les commentaires ci-dessous.








All Articles