#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
, но, вероятно, это должно сработать, если они первые в вашем файле.