Відповідь: Як запустити один хост завдань за допомогою хоста?


17

На рівні гри ми повинні serial: 1дозволити нам запускати всю гру по одному хосту за раз. Але я не знайшов простого способу зробити це за допомогою одного завдання. Це особливо актуально, якщо відповідна задача не виконує належне блокування (з будь-якої причини).

Одна очевидна відповідь - поставити завдання у власній грі. Але це не допомагає при ролях. (Доводиться ставити serial: 1п'єсу за допомогою ролі - це не дуже інтуїтивно.)


Відповіді:


13

Якщо ви не хочете паралелізму у виконанні кроків у вашій програмі, встановіть рівень вилки на 1:

ansible-playbook --forks=1 ...

Ви також можете помістити це у свій файл ansible cfg:

[defaults]
forks=1

але якщо ви хочете, щоб це було індивідуально, використовуйте варіант командного рядка вище.

Редагувати:

serial: 1робить щось зовсім інше: це як запуск чергової книги для кожного хоста по черзі, очікування завершення повної книги, перш ніж перейти до наступного хоста. forks=1означає запустити перше завдання в грі на одному хості перед тим, як виконати те саме завдання на наступному хості, тому перше завдання буде виконано для кожного хоста до того, як наступне завдання буде торкнутось.

Отже, вам потрібно forks=1лише одну виставу; на жаль, це наразі неможливо.


2
Я не шукав, щоб встановити це на цілу книжку. Це набагато незернисто. serial: 1давайте мені принаймні виставити його на виставу. Але я хочу лише встановити його в підпункті п’єси (як ніколи це правильна назва. Я думав, це "завдання", але коментар вище, здається, не погоджується).
Елронд

3
serial: 1робить щось зовсім інше: це як запуск чергової книги для кожного хоста по черзі, очікування завершення повної книги, перш ніж перейти до наступного хоста. forks=1означає запустити перше завдання в грі на одному хості перед тим, як виконати те саме завдання на наступному хості, тому перше завдання буде виконано для кожного хоста до того, як наступне завдання буде торкнутось. Отже, вам потрібно forks=1лише одну виставу; на жаль, це наразі неможливо.
wurtel

Влучне зауваження! Ви б не хотіли додати це до відповіді?
Елронд

2

Вирішення цієї проблеми є вирішенням - можна передати список хостів (або групу) до with_items, а потім скористатися delegate_toцим списком. Таким чином завдання буде виконано хостом.

Наприклад:

- name: start and enable rabbitmq (run task host by host)
  service:
    name: "rabbitmq-server"
    state: "started"
    enabled: true
  delegate_to: "{{ item }}"
  with_items: "{{ groups['rabbitmq-cluster'] }}"
  run_once: true

Для тих, хто цікавиться, чому run_once: trueтам, спробуйте вийняти його. Вам не сподобається те, що станеться. (стільки повторень пробіг ааааххх)
Альменон

1

Якщо ви виконуєте його на одній машині, виникає проблема ексклюзивного блокування для більш ніж одного хоста. Отже, ви повинні виконати один за одним для всіх хостів --forks=1. ЧОТИЙ приклад: ansible-playbook webserver.yml --forks=1де webserver.yml має app01 та app02 всередині вашого[webserver]


0

Подумайте, що ви хочете

run_once: вірно


4
nope: "run_once: true" означає виконати завдання саме для одного хоста у списку хостів. Я хочу запустити його для кожного хоста у списку, але один за одним.
Елронд

0

Для команд, які можна запустити локально, використовуйте цикл для перебору всіх хостів у програванні. Це ТОЛЬКО працює, якщо команду можна запустити локально. Ви також можете виконати команду з ssh в ній на віддалених машинах по одному таким чином, якщо ключі налаштовані, але це стає важко, коли говорити про ескалацію.

EG:

- name: Init New Appliances - Remove the known hosts entry for the server in case it has changed
  run_once: yes
  connection: local
  become: no
  command: "ssh-keygen -R {{ item }}"
  with_items:
  - "{{ inventory_hostname }}"

1
Ви повинні надати список хостів замість просто названого хоста inventory_hostname, інакше цикл не має сенсу.
Костянтин Суворов

0

Ви можете запустити одне завдання послідовно (тобто хост за хостом), додавши throttle: 1до нього.

Приклад:

---

- hosts: all
  tasks:
      - name: wait in parallel
        command: sleep 20
      - name: wait  in serial
        command: sleep 30
        throttle: 1

Список літератури:

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.