我正在尝试操作 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 输出 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章