Domanda

Sto usando Ansible per distribuire coppie di istanze Nginx / Tomcat e sto cercando di migliorare la disponibilità durante la distribuzione.

Un'istanza logica è 1 Nginx + 1 Tomcat: ho 4 istanze logiche distribuite su 2 posizioni distanti (vedere il file host Bellow).

Avvio un PlayBook chiamato Deploy.xml che assomiglia a questo:

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

Quello che voglio è distribuire il 50% delle mie 4 istanze logiche prima di distribuire gli altri (e fermare tutto se qualcosa va storto). Una soluzione potrebbe rivolgersi prima di mirare i server MONTIGNY-APP-Server / Montigny-NGX-server (anziché App-Server / NGX-server) e quindi la seconda posizione, ma avrei bisogno di duplicare il contenuto di riproduzione (e così via se necessario aggiungereAltre posizioni del server).

Qualche idea per renderlo correttamente?

Ecco il mio file host:

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

È stato utile?

Soluzione

.

Una soluzione potrebbe rivolgersi a MONTIGNY-App-Server / Montigny-NGX-server (anziché APP-Server / NGX-Server) e quindi la seconda posizione

Questo è ciò che facciamo, coppia cambia:

Aggiungi gruppi geolocalizzati:

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

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

Quindi è possibile eseguire il tuo libro di riproduzione sui sottoinsiemi con le opzioni -L / - Limnit

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

In questo modo ti mancherà per la prima volta istanze logiche da Montigny, e se tutto è andato bene (uscita 0), eseguirà il playbook per le istanze di Bievre

Trova più esempi: http://docs.ansible.com/playbooks_best_practices.html#what-Questo-organizzazione-abilita-esempi

Altri suggerimenti

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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top