Как перезагрузить динамически вычисляемый хост в ansible

#ansible

#ansible

Вопрос:

Как перезагрузить хост с помощью ansible, этот хост не является удаленным хостом, хранящимся в файле инвентаризации. IP-адрес хоста возвращается из вызванного скрипта get_active_host.sh . Я попытался перезагрузить активный хост из самого скрипта, однако выполнение playbook не удалось даже после использования wait_for_connection . хост, который следует перезагрузить, хранится в {{ active_host_location }}

 ---
# tasks file for GET_ACTIVE_HOST
 - name: GET ACTIVE HOST LOCATION
   script: get_active_host.sh
   args:
     executable: bash
   register: active_host_location
   async: 0
   poll: 0
   become: true

 - name: Wait for server to restart
   local_action:
     module: wait_for
       host={{ active_host_location }}
       port=22
       delay=1
       timeout=300



[my current machine] --->[ansible_host]---get_active_host.sh-->[active_host]
   1.2.3.4                   1.2.3.5                             1.2.3.6
  

Мне нужно перезагрузить, 1.2.3.6 который динамически вычисляется во время воспроизведения из скрипта. Возможно ли этого достичь и как?

вывод скрипта:

 ./get_active_host.sh
1.2.3.6
  

Ответ №1:

Если нужная вам переменная уже выводится из скрипта, вы должны быть довольно близки к этому. Когда вы регистрируете выходные данные задачи, она выгружает целую кучу материала в results объект, в котором вам затем нужно покопаться, чтобы получить фактическую переменную, которая вам нужна. Используйте модуль отладки на active_host_location , чтобы выяснить точную иерархию, но то, что вы хотите, вероятно, что-то вроде, {{ active_host_location.results.stdout }} .

Ответ №2:

IP, возвращаемый скриптом, сохраняется в active_host_location переменной structure of, и поскольку выходные данные представляют собой одну строку, вы можете получить доступ к IP с помощью active_host_location.stdout .

Поскольку скрипт возвращает IP, а не имя хоста, я думаю, вы не можете заранее заполнить все эти возможные результаты в своем инвентаре, чтобы ansible мог подключиться к подготовленному пользователю / пройти и запустить задачи перезагрузки. Итак, я бы попытался выполнить restart задачу с помощью локально выполняемой ssh-команды, которая подключается по ssh к целевой машине и запускает перезагрузку.

Для подключения к компьютеру вы можете:

  1. обмен SSH-сообщениями
  2. установите sshpass на свой локальный хост.

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

   - name: Run restart command
    shell: "ssh {{ remote_user }}{{ active_host_location.stdout }} 'sudo reboot'"
    delegate_to: localhost
    register: reboot_result

  - name: print result
    debug:
      var: reboot_result
  

если вы хотите использовать sshpass подход, командная задача может быть:

   - name: Run restart command
    shell: "sshpass -p "{{ remote_pass }}" ssh {{ remote_user }}@{{ active_host_location.stdout }} 'sudo reboot'"
    delegate_to: localhost
    register: reboot_result

  - name: print result
    debug:
      var: reboot_result
  

предполагается, что этот пользователь может «выполнять sudo, не требуя ввода пароля».

надеюсь, это поможет

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

1. спасибо за вашу любезную помощь, я узнал, что active_host_location.stdout и active_host_location.stdout[0] сегодня все по-другому!