Pregunta

Estoy usando ansible de implementar pares de instancias de Nginx / Tomcat y estoy tratando de mejorar la disponibilidad durante la implementación.

Una instancia lógica es 1 nginx + 1 tomcat: Tengo 4 instancias lógicas repartidas en 2 ubicaciones distantes (consulte el archivo de hosts bello).

LANZO UNA UNO LIBRO DE PLAYBOOK llamado desplience.xml que se parece a esto:

- 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

Lo que quiero es implementar el 50% de mis 4 instancias lógicas antes de desplegar a los demás (y detener todo si algo sale mal). Una solución podría estar dirigida a los servidores Montigny-Apl-SERVERS / MONTIGNY-NGX: primero (en lugar de servidores de aplicaciones / servidores NGX) y luego la segunda ubicación, pero necesitaría duplicar el contenido de PlayBook (y así suceder si necesito agregarOtras ubicaciones de servidores).

¿Alguna idea de hacerlo correctamente?

Aquí está mi archivo de hosts:

#
# 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

¿Fue útil?

Solución

Una solución podría dirigirse a los servidores Montigny-App-SERVERS / MONTIGNY-NGX: primero (en lugar de servidores de aplicaciones / servidores ngx) y luego la segunda ubicación

Esto es lo que hacemos, los cambios de pareja:

Agregar grupos geolocados:

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

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

Luego, puede ejecutarlo a PlayBook en los subconjuntos con las opciones -L / - LIMNIT

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

De esta manera, primero se ejecutará instancias lógicas de Montigny, y si todo salió bien (salida 0), ejecutará el libro de PlayBook para las instancias de Bievre

Encuentra más ejemplos: http://docs.ansible.com/playbooks_best_practices.html#.-Esto-organización-habilita a ejemplos

Otros consejos

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
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top