如何使用Ansible获取系统状态

如何使用Ansible获取系统状态,ansible,Ansible,我有一个简单的ansibleplaybook来获取etcd服务的状态,如下所示 -名称:检查etcd服务是否正在运行 命令:systemctl status etcd 寄存器:结果 忽略错误:是 但是开始时,此服务可能没有运行 因此,如果服务没有运行,我想启动它。所以这一定是一个有条件的检查,以下是我所做的: -名称:显示报告 调试: var:result.ansible_facts.services[“etcd.service”]。state 但这会产生如下错误: 任务[显示报告]***

我有一个简单的
ansible
playbook来获取
etcd
服务的状态,如下所示

-名称:检查etcd服务是否正在运行
命令:systemctl status etcd
寄存器:结果
忽略错误:是
但是开始时,此服务可能没有运行

因此,如果服务没有运行,我想启动它。所以这一定是一个有条件的检查,以下是我所做的:


-名称:显示报告
调试:
var:result.ansible_facts.services[“etcd.service”]。state
但这会产生如下错误:

任务[显示报告]********************************************************** 确定:[35.236.98.212]=>{ “result.ansible_facts.services[“etcd.service”].state:”“未定义变量!”

我如何检查
etcd
服务的状态,如果它未运行,我想启动该服务,如果它已经运行,则保持原样


有人能帮帮我吗?

你把很多事情搞混了。
shell
如果你注册结果,会有效地返回一些信息。但是结果不会包含任何
ansible\u facts.services
条目

此名称与返回的名称类似。您需要运行它以填充主机事实中的相应信息:

-name:获取所有主机的服务事实
服务信息:
-名称:显示其工作的虚拟任务
调试:
var:ansible_事实服务
现在,您还应该了解ansible是关于描述您连接到的远程目标的预期状态的。在服务方面,如果您想确保特定的服务已启动并且将始终在引导时启动(并且理所当然地认为它由systemd管理),您所要做的就是:

-name:确保etcd已启动并启用
系统D:
姓名:etcd
国家:开始
已启用:true
这项任务将:

  • 启动时启用
    etcd
    (如果尚未启用)
  • 如果尚未启动,则启动
    etcd
  • 如果已启用并启动,则不执行任何操作,只报告“OK”

更一般地说,当已经有一个ansible模块在执行任务时,您应该避免使用
shell/command

您可以在此处使用service\u facts模块

比如说

-主机:主机组
收集事实:错误
变成:是的
任务:
-名称:将服务状态信息作为事实数据返回
服务信息:
-名称:显示etcd服务的状态
调试:
var:ansible_facts.services['etcd.service']['state']
-名称:如果etcd服务未运行,则启动etcd服务
服务:
名称:etcd.service
国家:开始
时间:ansible_facts.services['etcd.service']['state']!='running'

关于上一项任务的
when
子句的意义是什么?
服务
(几乎每个ansible模块都是如此)是幂等的。如果服务已经启动,它将不会做任何事情,只报告OK。@Zeitounator是的,您是对的。感谢您的响应。仍然“when”用作任务中的信息。IMO有一个冗余信息:“如果服务未启动,请启动服务”这已经是模块所做的。此外,这迫使您收集服务事实。