Ansible wait_for_connection, пока хосты не будут готовы к ansible?

#ansible

#ansible

Вопрос:

Я использую ansible для настройки некоторых виртуальных машин.

Проблема, с которой я сейчас сталкиваюсь, заключается в том, что я не могу выполнить команды ansible сразу после запуска виртуальных машин, это выдает connection time out ошибку. Это происходит, когда я выполняю ansible сразу после запуска виртуальных GCP машин.

Команды работают нормально, когда я запускаю ansible playbook через 60 секунд, но я ищу способ сделать это автоматически, не дожидаясь вручную 60 секунд и выполнения, поэтому я могу выполнить сразу после запуска виртуальных машин, и ansible будет ждать, пока они не будут готовы. Я также не хочу добавлять секунды задержки к задачам ansible,

Я ищу динамический способ, при котором ansible пытается выполнить playbook, и когда он терпит неудачу, он не покажет никакой ошибки, но подождет, пока виртуальные машины не будут готовы?

Я использовал это, но оно все равно не работает (поскольку оно терпит неудачу)

 ---
- hosts: all
  tasks:
    - name: Wait for connection
      wait_for_connection: # but this will still fails, am I doing this wrong?

    - name: Ping all hosts for connectivity check
      ping:
  

Может кто-нибудь, пожалуйста, помочь мне?

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

1. Не могли бы вы точно объяснить, что такое «сбой» и как при использовании wait_for_connection ? Примечание: если вы не хотите добавлять задержку / повторную попытку / тайм-аут, как ansible узнает, когда прекратить ожидание в случае возникновения проблемы?

Ответ №1:

У меня такая же проблема на моей стороне. Я исправил htis с помощью этой задачи wait_for. Основной способ — ожидать ssh-соединения следующим образом :

 - name: Wait 300 seconds for port 22 to become open and contain "OpenSSH"
  wait_for:
    port: 22
    host: '{{ (ansible_ssh_host|default(ansible_host))|default(inventory_hostname) }}'
    search_regex: OpenSSH
    delay: 10
  connection: local
  

Я предполагаю, что ваша виртуальная машина должна запустить приложение / службу, чтобы вы могли отслеживать на виртуальной машине в файле журнала, где запускается приложение, например, так (здесь для контейнера nexus):

 - name: Wait container is start and running
  become: yes
  become_user: "{{ ansible_nexus_user }}"
  wait_for:
    path: "{{ ansible_nexus_directory_data }}/log/nexus.log"
    search_regex: ".*Started Sonatype Nexus.*"
  

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

1. Не могли бы вы точно объяснить, что не так wait_for_connection и по какой причине вам пришлось использовать этот обходной путь?

Ответ №2:

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

 ---
- hosts: all
  gather_facts: no
  tasks:
    - name: Wait for connection (600s default)
      ansible.builtin.wait_for_connection:

    - name: Gather facts manually
      ansible.builtin.wait_for_connection
  

У меня они находятся в разделе pre_tasks вместо tasks , но, вероятно, это должно сработать, если они первые в вашем файле.