如何使用Ansible重新启动主机,该主机不是清单文件中存储的远程主机。主机IP从名为get_active_host.sh
的脚本中返回。我试图从脚本本身重新启动活动主机,但是即使使用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
答案 0 :(得分:1)
如果已经从脚本中输出了所需的变量,则应该非常接近。注册任务的输出时,它会将一堆东西转储到results
对象中,然后您需要挖掘该对象以获取所需的实际变量。使用active_host_location
上的调试模块可以确定确切的层次结构,但是您想要的可能类似于{{ active_host_location.results.stdout }}
。
答案 1 :(得分:1)
从脚本返回的IP保存在active_host_location
变量的结构中,由于输出是一行,因此您可以通过active_host_location.stdout
访问IP。
由于该脚本返回IP而不是主机名,我想您不能提前在清单中填充所有这些可能的结果,以便能够与已配置的用户/密码连接并运行重新启动任务。因此,我将尝试使用本地运行的ssh命令来完成restart
任务,该命令通过ssh连接到目标计算机,然后重新启动。
要连接到机器,您可以:
sshpass
。如果遵循1,则shell任务将如下所示:
- 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,而无需提交密码”。
希望这些帮助