我正在尝试运行下面的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_lines
或stdout
。有没有一种方法可以做到这一点,而不需要通过添加一个选项或将输出管道连接到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中都得到了广泛使用和可用。
这里的诀窍是:
- 启用为特定命令加载回调
- 将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}'`