如何在Ansible中重启动态计算的主机

时间:2019-04-01 19:22:37

标签: ansible

如何使用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

2 个答案:

答案 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连接到目标计算机,然后重新启动。

要连接到机器,您可以:

  1. 交换SSH嘿
  2. 在您的本地主机上安装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,而无需提交密码”。

希望这些帮助