当运行Ansible ad-hoc命令时,只获得 "stdout_lines "或 "stdout "的输出。

0 人关注

我试图运行下面的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
      systemctl status $service_1
      echo "There is No $Service_1 Here !"

当运行ad-hoc命令时,我得到了太多的输出,我只想把输出限制在stdout_linesstdout,有什么方法可以在不创建带有debug或任何其他模块的特定playbook的情况下,仅仅通过添加一个选项或将输出输送到grep来实现?

4 个评论
因为你的实际例子和用例目前看起来像是Ansible的反模式,应该避免,你能解释一下为什么你在寻找" ... 有一种方法可以在不创建带有 "debug "或任何其他模块的特定游戏手册的情况下,仅仅通过添加一个选项或将输出结果输送到grep... "?
将ad-hoc命令行stout回调插件改为json .用 jq 这样的工具来过滤输出是很简单的。
谢谢@U880D的意见,我只是想知道是否有办法,我知道可以通过注册输出,然后使用 "debug "模块打印想要的部分来使用playbook,我已经尝试了所提供的答案,它是可行的。
谢谢@Zeitounator的意见,我只是想知道是否有办法在不使用playbooks或任何插件的情况下,仅仅通过使用本地选项就能做到这一点,我已经尝试了所提供的答案,它是有效的。
linux
ansible
Mostafa Ramzy
Mostafa Ramzy
发布于 2022-09-12
3 个回答
U880D
U880D
发布于 2022-09-12
0 人赞同

在我看来,在最初的问题中尝试了收集服务状态的方法 应该避免,因为这个例子似乎是一个反模式。 的报告。然而,有一些选项可以满足报告的要求。

一个更简单的解决方案是,要么

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

或几乎是要求的,在启用用于临时命令的回调插件

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

Config

[defaults]
bin_ansible_callbacks   = True

Further Q&A

  • How can I get the output of Ansible ad-hoc command in JSON, CSV or other format?
  • 最后,如果你现在对定制更多的输出感兴趣,你可能需要开始Developing plugins并创建你自己的回调插件. The source of lib/ansible/plugins/callback/default.py可以是一个好的开始。

    谢谢你的意见,这个插件真的很有帮助,但所提到的要求是在不使用playbook或任何插件的情况下,只使用本地选项,我已经尝试了所提供的答案,它是有效的。
    Zeitounator
    Zeitounator
    发布于 2022-09-12
    0 人赞同

    有没有一种方法可以在不创建带有调试或任何其他模块的特定playbook的情况下,仅仅通过添加一个选项或将输出结果输送到grep来实现?

    我很确定我在上面的评论中提出的建议满足了你的期望。唯一的要求是在控制器上安装一个解析json的工具,这样你就可以把Ansible的输出结果放在你的shell里。

    在下面的例子中,我使用 jq 它被广泛使用,在大多数Linux发行版中都有。

    The trick here is to:

  • enable loading callbacks for ad-hoc commands .
  • change the stdout callback plugin to use json for ad-hoc commands.
  • 由于你似乎在寻找一个单线和非 "破坏性 "的解决方案,我使用了直接在同一命令行上设置的环境变量。

    Long story short, typing in your shell:

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

    gives

    谢谢你的意见,这个插件真的很有帮助,但所提到的要求是在不使用playbook或任何插件的情况下,只使用本地选项,我已经尝试了所提供的答案,它是有效的。
    @MostafaRamzy 这个方案不使用任何playbook,只使用默认ansible安装中的插件(除非你决定只走ansible-core路线,在这种情况下必须安装posix集合)。实际上,当你用默认配置启动一个临时的ansible命令时,你也会使用一个stdout插件(即 默认回调插件 )
    Prasad Patil
    Prasad Patil
    发布于 2022-09-12
    0 人赞同