在ansible中使用for循环从保存在主机服务器上的文件中获取IP地址并ping到那些IP服务器以检查它们是不是还活着

Posted

技术标签:

【中文标题】在ansible中使用for循环从保存在主机服务器上的文件中获取IP地址并ping到那些IP服务器以检查它们是不是还活着【英文标题】:using for loop in ansible to fetch the ip address from a file kept on host server and ping to those ip servers to check wether those are alive or not在ansible中使用for循环从保存在主机服务器上的文件中获取IP地址并ping到那些IP服务器以检查它们是否还活着 【发布时间】:2017-03-14 14:54:03 【问题描述】:

我需要编写 ansible playbook,从放置在主机服务器上的记事本文件中获取 ip 地址。我需要编写一个将迭代到记事本文件并提供 IP 地址的 playbook。此外,我将使用 ping 命令检查这些服务器是否处于活动状态。请建议我如何编写将迭代到放置在主机上的一个记事本文件的剧本,拿起 ip 地址并 ping 它以检查 ip 是否存在。

这些是放置在主机服务器上的记事本文件的详细信息。

12.82.240.174   wnaca3012is #CLLI
12.82.240.166   ok3ca3022is #CLLI
12.82.224.62    dsail301is  #CLLI
12.82.224.70    prail301is  #CLLI

在剧本下方

- name: "Fetch the ip of all the servers from hosts.new file"
  command: for i in `awk 'print $1' hosts.new`
            do echo "$i"
            done
  args:
    chdir: "/home/dp794d/"
  failed_when: "output.rc > 1"
  register: output

错误是 -

fatal: [zlp12036]: FAILED! => "changed": false, "cmd": "for i in '`awk' 'print $1' 'hosts.new`' do echo '$i' done", "failed": true, "failed_when_result": true, "msg": "[Errno 2] No such file or directory", "rc": 2

致命:[zlp12037]:失败! => “更改”:假,“cmd”:“for i in 'awk' 'print $1' 'hosts.new' do echo '$i' done”,“失败”:真,“failed_when_result”:真,“msg”:“[Errno 2] 没有这样的文件或目录", "rc": 2

【问题讨论】:

请分享您已经尝试过的代码示例。 为什么需要为此编写 Ansible 剧本?您认为哪些独特的 Ansible 功能会促进这项任务? 请参阅剧本并建议需要做什么 【参考方案1】:

我只是在此处引用 ansible “最佳实践要点”Blog Post:

Ansible 在设计上是一个理想的状态引擎。如果你试图在你的剧本和角色中“编写代码”,那么你就是在为失败做好准备。我们基于 YAML 的剧本从来都不是用于编程的。

使用 shell 脚本会更容易完成您尝试完成的任务,该脚本会将您的文本文件转换为 ansible 清单。但这似乎仍然有点骇人听闻。在不知道确切情况的情况下,我建议询问这些 ips 来自哪里,以及是否有一种方法可以在不解析文本文件的情况下收集它们。另外,请查看 (Dynamic Inventories) ,以便您可以在执行期间创建库存。

希望这会有所帮助!

p.s:我宁愿将此作为评论,但我的声誉还不够高,无法评论每个问题。

【讨论】:

以上是关于在ansible中使用for循环从保存在主机服务器上的文件中获取IP地址并ping到那些IP服务器以检查它们是不是还活着的主要内容,如果未能解决你的问题,请参考以下文章

Ansible 文档译文主机清单文件

在 Ansible 中使用失败的任务循环获取项目值

Ansible:在循环中生成变量

Ansible配置

如何在Ansible中使用静态和动态库存

使用ansible批量推送秘钥