Ansible: переход к следующей задаче, если задача выполнена на одном хосте

#ansible

#ansible

Вопрос:

В ansible мне нужно проверить, доступен ли файл на двух хостах. Но если файл доступен даже на одном хосте, мне нужно отменить задачу на другом хосте и перейти к следующей задаче. Причина, по которой я требую этого, заключается в том, что следующая задача может быть выполнена только в том случае, если этот конкретный файл доступен, и этот файл может быть случайным образом записан на любой из хостов.

Комментарии:

1. для проверки статистики можно использовать модуль stat

Ответ №1:

Следующая игра делает именно то, что вы хотите:

 ---
- hosts:
    - server1
    - server2
  gather_facts: False
  vars:
    file_name: 'foo.bar'

  tasks:
  - name: wait for file
    wait_for:
      path: '{{ file_name }}'
      state: present
      timeout: 30
    ignore_errors: True

  - name: stat
    stat:
      path: '{{ file_name }}'
    register: result

  - name: next
    debug:
      msg: "File {{ file_name }} available on {{ ansible_host }}"
    when: result.stat.isreg is defined and result.stat.isreg
 

Вывод:

 PLAY [server1,server2] *********************************************************

TASK [wait for file] ***********************************************************
ok: [server1]
fatal: [server2]: FAILED! => {"changed": false, "elapsed": 3, "msg": "Timeout when waiting for file foo.bar"}
...ignoring

TASK [stat] ********************************************************************
ok: [server1]
ok: [server2]

TASK [next] ********************************************************************
skipping: [server2]
ok: [server1] => {
    "msg": "File foo.bar available on server1"
}

PLAY RECAP *********************************************************************
server1                  : ok=3    changed=0    unreachable=0    failed=0
server2                  : ok=0    changed=0    unreachable=0    failed=0
 

Комментарии:

1. Привет, спасибо за ваш ответ. но когда я попытался выполнить задачу отладки на одном сервере, произошел сбой. более того, что мне нужно, так это остановить задачу проверки файлов playbook on, пока файл не станет доступен на одном из серверов. для этого требуется еще одна параллельная задача, которая также выполняется с моим playbook. я могу продолжить выполнение остальных задач, когда эта другая задача будет завершена. только. когда эта задача будет завершена, она случайным образом запишет файл на один из серверов. я попытался сделать это с помощью модуля wait_for и модуля stat с опросом, оба из которых не работают так, как мне нужно.

2. Расширенный ответ

3. еще раз спасибо. Но все равно это будет ждать на server2 в течение 30, даже если файл найден на server1. как я уже упоминал, мне нужно немедленно перейти к следующей задаче, если файл найден на одном сервере.

4. Спасибо, это было именно то, что я искал!

Ответ №2:

Вы можете использовать модуль stat для проверки статуса, как показано ниже, а также для того, чтобы добавить serial:1 ниже hosts: в свой плейбук

  • stat: path: /path/to/something регистр: p
  • debug: сообщение: «Путь существует и является каталогом», когда: p.stat.isdir определен и p.stat.isdir

https://docs.ansible.com/ansible/latest/modules/stat_module.html для получения более подробной информации