Рейтинг:0

How to make Ansible run batch of tasks on few nodes but one by one (nodes running in cluster)

флаг cn

I have an ansible playbook which looks roughly like this:

- hosts: node1
      tasks:
      - name: get cluster state 
        shell: "RESTAPI 1 command"
      - name: put cluster in upgrade mode
        shell: "RESTAPI 2 command"
- hosts: node 1
      tasks:
      - name: upgrade Apache
        shell: "upgrade Apache command"
      - name: start Apache
        shell: "start Apache command"
- hosts: node 1
      tasks:
      - name: healthy check for Apache is running
        shell: "RESTAPI command"
- hosts: node 2
      tasks:
      - name: upgrade Apache
        shell: "upgrade Apache command"
      - name: start Apache
        shell: "start Apache command"
- hosts: node 2
      tasks:
      - name: healthy check for Apache is running
        shell: "RESTAPI command"
- hosts: node 3
      tasks:
      - name: upgrade Apache
        shell: "upgrade Apache command"
      - name: start Apache
        shell: "start Apache command"
- hosts: node 3
      tasks:
      - name: healthy check for Apache is running
        shell: "RESTAPI command"

I want to improve the playbook that will run as a loop because for each node I have same commands that should be exec on each node one by one because all nodes running in cluster and I need only one node will be in upgrade process at the same time. also I have few environment (Test/Dev) that I want to use this playbook but I have different nodes number in cluster how can I make run the playbook no matter how many nodes I have into the cluster?

Рейтинг:1
флаг in

Вы можете поместить все повторяющиеся задачи в блок. В сочетании с сериал: 1 вы убедитесь, что только один блок выполняется за раз.

- хосты: узлы
  сериал: 1
  задачи:
    - имя: получить состояние кластера 
      оболочка: "Команда RESTAPI 1"
      run_once: да
    - имя: перевести кластер в режим обновления
      оболочка: "Команда RESTAPI 2"
      run_once: да
    - блокировать:
      - имя: обновить Apache
        оболочка: «обновить команду Apache»
      - имя: запустить Apache
        оболочка: «запустить команду Apache»
      - имя: выполняется проверка работоспособности для Apache
        оболочка: "Команда RESTAPI"
# повторов: 20
# задержка: 15

Я предполагаю, что команду для перевода кластера в режим обновления можно запустить на любом узле, поэтому вы можете просто использовать run_once. Если это не так и его нужно запустить на определенном узле, вы можете использовать когда ограничение для конкретного хоста.

Для здоровья проверьте параметры задерживать и повторяет может представлять интерес, если существует вероятность того, что проверка сначала завершится ошибкой, а затем завершится успешно, когда apache будет полностью запущен.

Чтобы использовать playbook в разных группах хостов, вы можете использовать хозяева: все а затем ограничить хосты группой во время выполнения.

ansible-playbook upgrade.yml --limit dev_nodes
флаг cn
Привет @GeraldSchneider, спасибо за ваш ответ, я попытался отредактировать свой файл yml на основе вашего предложения, но получаю синтаксические ошибки. ОШИБКА! «uri» не является допустимым атрибутом для блока `- хосты: узлы сериал: 1 задачи: - имя: получить состояние кластера ури: run_once: да блокировать: - название: копия копировать: - имя: файл файл - имя: системная проверка системный: - имя: блокинфайл блокировать файл # повторов: 20 # задержка: 15 `
флаг in
Это трудно прочитать в комментарии, но похоже, что вы используете двоеточие в названии задачи. Вы должны цитировать его, когда делаете это.

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.