Высокое развертывание доступности с неизбежным

StackOverflow https://stackoverflow.com//questions/25015122

  •  21-12-2019
  •  | 
  •  

Вопрос

Я использую Anbible для развертывания пары экземпляров Nginx / Tomcat, и я пытаюсь улучшить доступность во время развертывания.

Логический экземпляр 1 nginx + 1 Tomcat: у меня 4 логических экземпляра, распространяющихся более 2 удаленных местоположений (см. Файл Hosts Below).

Я запуску один PlayBook под названием deploy.xml, который выглядит так:

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

То, что я хочу, это развернуть 50% моих 4 логических экземпляров, прежде чем развертывать остальные (и остановить все, если что-то пойдет не так). Сначала один раствор может быть нацелен на Montigny-app-серверы / Montigny-NGX-серверы (вместо серверов App-Servers / NGX-серверов), а затем второе место, но мне нужно было дублировать контент Playbook (и так, если мне нужно добавитьДругие местоположения сервера).

Любая идея, чтобы сделать это правильно?

Вот файл My 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
.

Это было полезно?

Решение

Одно решение может быть нацелена на Montigny-серверы / Montigny-NGX-серверы (вместо приложений-серверов / NGX-серверов), а затем второе место

Это то, что мы делаем, пара меняется:

Добавить геологизированные группы:

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

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

Тогда вы можете выполнить вам PlayBook на подмножестве с опциями - l / - limnit

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

Таким образом, в первую очередь пройдет вам логические экземпляры из Монтиньи, и если все прошло нормально (выйти 0), он будет запустить Playbook для биевых экземпляров

Найти больше примеров: http://docs.ansable.com/playbooks_best_practices.html# что-Это-организация - включает в себя примеры

Другие советы

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
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top