Question

J'utilise une sieste pour déployer des paires d'instances Nginx / Tomcat et j'essaie d'améliorer la disponibilité lors du déploiement.

Un exemple logique est 1 Nginx + 1 Tomcat: j'ai 4 instances logiques réparties sur 2 emplacements distants (voir le fichier d'hôtes ci-dessous).

Je lance un jeu de jeu appelé Déploy.xml qui ressemble à ceci:

- hosts: ngx-servers
  pre_tasks:
    - include: tasks/remove-server.yml
  roles:
    - role: ngx-server

- hosts: app-servers
  roles:
    - role: app-server

- hosts: ngx-servers
  tasks:
    - include: tasks/add-server.yml

Ce que je veux, c'est de déployer 50% de mes 4 instances logiques avant de déployer les autres (et de tout arrêter si quelque chose ne va pas). Une solution pourrait cibler d'abord cibler les serveurs Montigny-app-servers / Montigny-ngx (au lieu de serveurs d'applications / serveurs NGX), puis du deuxième emplacement, mais j'aurais besoin de dupliquer le contenu du jeu de lecture (et ainsi de suite si je dois ajouterautres emplacements de serveurs).

aucune idée de la rendre correctement?

Voici mes hôtes Fichier:

#
# Serveurs d'application
#

# Montigny
[montigny-app-servers]
mo-app-server-1 ansible_ssh_host=1y.domain.fr ansible_ssh_user=devops
mo-app-server-2 ansible_ssh_host=2y.domain.fr ansible_ssh_user=devops

# Bievre
[bievre-app-servers]
bi-app-server-1 ansible_ssh_host=1b.domain.fr ansible_ssh_user=devops
bi-app-server-2 ansible_ssh_host=2b.domain.fr ansible_ssh_user=devops

# Tous
[app-servers:children]
montigny-app-servers
bievre-app-servers

#
# Serveurs NGinx
#

# Montigny
[montigny-ngx-servers]
mo-ngx-server-1 ansible_ssh_host=1y.domain.fr ansible_ssh_user=devops
mo-ngx-server-2 ansible_ssh_host=2y.domain.fr ansible_ssh_user=devops

# Bievre
[bievre-ngx-servers]
bi-ngx-server-1 ansible_ssh_host=1b.domain.fr ansible_ssh_user=devops
bi-ngx-server-2 ansible_ssh_host=2b.domain.fr ansible_ssh_user=devops

# Tous
[ngx-servers:children]
montigny-ngx-servers
bievre-ngx-servers

Était-ce utile?

La solution

Une solution pourrait cibler les serveurs Montigny-App-serveurs / Montigny-NGX-SERVERS (au lieu de serveurs d'applications / serveurs NGX), puis le deuxième emplacement

C'est ce que nous faisons, des changements de couple:

Ajouter des groupes géolocalisés:

[Montigny-servers:children]
montigny-app-servers
montigny-ngx-servers

[bievre-servers:children]
bievre-app-servers
bievre-ngx-servers

Ensuite, vous pouvez vous exécuter Playbook sur les sous-ensembles avec les options -L / - limnit

$ ansible-playbooks -i inventory site.yml -l Montigny-servers && \
  ansible-playbooks -i inventory site.yml -l bievre-servers

De cette façon, cela vous dirigera d'abord des instances logiques de Montigny, et si tout s'est bien passé (sortie 0), il exécutera le jeu de jeu pour les instances de Bievre

Trouver plus d'exemples: http://docs.ansible.com/playbooks_best_practices.html#Que-C'est-ce qu'on l'organisation-active-exemples

Autres conseils

I agree with the idea of putting your hosts in separate groups so that you can run commands on first one group and then the other.

You should be able to put that in one playbook though - if you create the fundamental actions in an include script, you can then create a playbook that will have multiple '- hosts' sections, each of which will call the include script.

That would look something like:

---
- hosts: firstgroupname
  tasks:
    - include: pathandnameofincludescript.yaml
- hosts: secondgroupname
  tasks:
    - include: pathandnameofincludescript.yaml

and your include script would look something like:

---
- name: action 1
  command: echo hello world
- name: action 2
  command: echo hello again

Note the indentation difference for include scripts - its very important! YAML can be annoying at times....

Okay, here is what I think you actually want.

You can use the serial keyword to say how many hosts ansible should manage at a single time in a play. So in the example below, ansible would only run the plays on two hosts at a time.

By default, anisble will keep running the plays even if the first two machines fail, so you can use the max_fail_percentage keyword to define the percentage of failures acceptable before stopping. In the example below, Ansible will stop if 1 percent of machines failed.

Source: http://docs.ansible.com/playbooks_delegation.html#rolling-update-batch-size

- hosts: app-servers`
  serial: 2 
  max_fail_percentage: 1
  roles: 
   - role: deploy-env

And then in your deploy-env role have:

- name: remove from LB
  include: remove-server.yml
  delegate_to: paired_nginx_box

  /* app-server tasks */

- name: add to LB
  include: add-server.yml
  delegate_to: paired_nginx_box
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top