在运行 ansible 临时命令时仅获取 "stdout_lines" 或"stdout"的输出



我正在尝试运行下面的ansible ad-hoc命令,该命令运行;status.sh";脚本:

ansible host -m script -a '/path/status.sh' -u root -i inventory

脚本简单地获取目标主机上服务的状态,如下所示:

service_1=$(ls /etc/systemd/system | grep -e jboss | awk -F ' ' '{print $1}')
if [ ! -z "$service_1" ] //if service exists
then
systemctl status $service_1
else
echo "There is No $Service_1 Here !"
fi

当运行ad-hoc命令时,我得到了太多的输出,我只想将输出限制为stdout_linesstdout。有没有一种方法可以做到这一点,而不需要通过添加一个选项或将输出管道连接到grep来创建debug或任何其他模块的特定剧本?

在我看来,应该避免最初尝试的收集服务状态的方法,因为该示例似乎是Ansible的反模式。但是,也有满足报告要求的选项。

一个更简单的解决方案是

ansible test -m systemd -a 'name=cntlm enabled=true'
test.example.com | SUCCESS => {
"changed": false,
"enabled": true,
"name": "cntlm",
"status": {
<a lot of output>
}
}

ansible test -m shell -a 'systemctl status cntlm'
test.example.com | CHANGED | rc=0 >>
● cntlm.service - CNTLM HTTP Accelerator For NTLM Secured Proxies Authenticator
Loaded: loaded (/usr/lib/systemd/system/cntlm.service; enabled; vendor preset: disabled)
Active: active (running) since Thu 2022-09-01 09:00:00 CEST; 1 weeks 4 days ago
Main PID: 234567 (cntlm)
CGroup: /system.slice/cntlm.service
└─234567 /usr/sbin/cntlm -c /etc/cntlm.conf -U cntlm -P /run/cntlm/cntlmd.pid

或者几乎是所请求的,在为ad hoc命令启用回调插件之后

ansible test -m shell -a 'systemctl status cntlm'
PLAY [Ansible Ad-Hoc] **************************************************************************************************
Monday 01 September 2022  09:00:00 +0200 (0:00:00.071)       0:00:00.071 ******
TASK [shell] ***********************************************************************************************************
changed: [test.example.com]
PLAY RECAP *************************************************************************************************************
test.example.com  : ok=1    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
Monday 01 September 2022  09:00:00 +0200 (0:00:02.171)       0:00:02.243 ******
===============================================================================
shell ----------------------------------------------------------------------------------------------------------- 2.17s
Playbook run took 0 days, 0 hours, 0 minutes, 2 seconds

配置

[defaults]
bin_ansible_callbacks   = True

进一步的问答;A

  • 如何获得JSON、CSV或其他格式的Ansible ad-hoc命令的输出

最后,如果您现在有兴趣更多地自定义输出,您可能需要开始开发插件并创建自己的回调插件。lib/ansible/plugins/callback/default.py的来源可能是一个良好的开端。

有没有一种方法可以做到这一点,而不需要通过添加一个选项或将输出管道连接到grep来创建带有调试或任何其他模块的特定剧本?

我确信我在评论中的上述主张符合您的期望。唯一的要求是在控制器上安装一个工具来解析json,这样您就可以在shell中管道传输Ansible输出结果。

对于下面的示例,我使用jq,它在大多数Linux发行版repos中都得到了广泛使用和可用。

这里的诀窍是:

  1. 启用为特定命令加载回调
  2. 将stdout回调插件更改为对特定命令使用json

因为你似乎在寻找一个内衬和非";破坏性的";解决方案中,我使用了直接在同一命令行上设置的环境变量。

长话短说,在你的壳里打字:

ANSIBLE_LOAD_CALLBACK_PLUGINS=1 
ANSIBLE_STDOUT_CALLBACK=json 
ansible localhost -a "echo toto" | jq -r ".plays[].tasks[].hosts[].stdout"

给出

toto

除非模块本身(例如设置模块(支持,否则不存在用于可解析adoc命令过滤输出的内置选项。

如果你想在单行中压缩输出,你可以使用"压缩"-o";选项

唯一的选择似乎是使用shell过滤输出。我想出了下面的命令,你可以试试

ansible test_node1 -m script -a "/root/python/test.sh" | grep ""stdout":" | tr -d  ','  | echo -e `awk '{print $2}'`

最新更新