#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 к целевой машине и запускает перезагрузку.
Для подключения к компьютеру вы можете:
- обмен SSH-сообщениями
- установите
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]
сегодня все по-другому!