我正在尝试操作 ansible 输出 [关闭]

Posted

技术标签:

【中文标题】我正在尝试操作 ansible 输出 [关闭]【英文标题】:I am trying to manipulate an ansible output [closed] 【发布时间】:2022-01-15 07:18:27 【问题描述】:

所以我正在尝试为 ansible 设置动态库存。我将服务器名称放入一个文件中,现在我想把它放在 ansible 可接受的格式中。这就是我问这个问题的原因。我通过 api 从 oracle pca 中提取数据。感谢您的回答以及您的 X/Y 问题

"msg": ["server1", "server2", " server3", " server4", " server5", " server6"], "failed": false, "changed": false

上面的输出取自一个文件。我的目标是删除所有内容,并且仅在 1 行中列出服务器名称,如下所示:

- server1
- server2
- server3
.....

如果我能得到像下面这样的输出就更好了

---
- server1
- server2
- server3
......

为什么关闭?我不确定,无论如何,感谢那些帮助过的人

【问题讨论】:

基本上类似于 (lookup('file', '/path/to/your_file') | from_json).msg | to_yaml 。但这闻起来很香X/Y problem。 所以我正在尝试为 ansible 设置动态库存。我将服务器名称放入一个文件中,现在我想把它放在 ansible 可接受的格式中。这就是我问这个问题的原因。我通过 api 从 oracle pca 中提取数据。感谢您的回答以及您的 X/Y 问题 这应该对您的问题进行编辑。 您的文件内容显然来自 ansible 任务运行。你为什么不直接使用注册的内容来动态创建库存(参见add_host 模块)或将内容作为 yaml 直接写入文件以供以后使用? 感谢您的帮助;但添加主机模块不会做我想要的。下面的答案正是我想要的。谢谢! 【参考方案1】:

使用sed

sed 's/]/, ]/;s/"//g;s/^[^[]*\|\[\|].*\|,//g;s/\([^ ]*.\) /- \1\n/g;i---' input_file
---
- server1
- server2
- server3
- server4
- server5
- server6

【讨论】:

您的解决方案也有效,只是您忘记删除引号,这很好。如果我决定使用它,我可以添加它。谢谢!注意:如果你修复它;我也会将其标记为正确。 @SenanT 哎呀!似乎我用echo 测试了这个并丢失了引号。道歉。固定【参考方案2】:

使用awk可以获取列表:

awk -F'[][]' 'sub(/"/, "- ",$2);gsub(/", *" */,"\n- ",$2);sub(/"/,"",$2);print "---\n"$2' file
---
- server1
- server2
- server3
- server4
- server5
- server6
设置分隔符为'[][]',你可以使用sub()gsub函数remove everything and have only servers name

【讨论】:

【参考方案3】:

通常(甚至可能需要),动态清单脚本在标准输出中返回 JSON。所以,你就快到了。

如果您获取一个非常基本的清单,并针对它运行ansible-inventory --list,您将看到输出格式。所以如果你拿这个:

# hosts.ini
server1
server2
server3

然后运行ansible-inventory --list -i hosts.ini,你会得到这个:


    "_meta": 
        "hostvars": 
    ,
    "all": 
        "children": [
            "ungrouped"
        ]
    ,
    "ungrouped": 
        "hosts": [
            "server1",
            "server2",
            "server3"
        ]
    

因此,您必须获取您的文件,并通过jq 运行它。我写了inv.sh

#!/bin/bash
echo ' "_meta":  "hostvars":  , "all":  "children": [ "ungrouped" ] , "ungrouped":  "hosts": '
cat file.json | jq .msg
echo '  '

您的服务器名称中确实有多余的空格。所以修复它。

$ ansible-inventory --list -i ./inv.sh 

    "_meta": 
        "hostvars": 
    ,
    "all": 
        "children": [
            "ungrouped"
        ]
    ,
    "ungrouped": 
        "hosts": [
            " server3",
            " server4",
            " server5",
            " server6",
            "server1",
            "server2"
        ]
    

【讨论】:

虽然您的解决方案有效;这不是我想要做的。谢谢你的帮助

以上是关于我正在尝试操作 ansible 输出 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

使用Ansible从Json输出中提取数据

Ansible - 对输出应用过滤器,然后注册为变量

尝试输出到文件时出现 Ansible 标准输出脚本错误

ansible实战应用之——自动化系统上线

Ansible Tower实战大全:第一篇

ansible python api 2.0使用