我们假设我有以下示例,将所有git config
值存储在Ansible变量中:
- shell: git config --global --list
register: git_config_list
Ansible将此命令的结果存储在git_config_list
变量中,其中一个项目为stdout_lines
,其中包含条目数组中命令的输出,例如
[
"user.name=Foo Bar",
"user.email=foo@example.com"
]
如何检查是否已设置某个值,例如用于验证user.name
是否有值?
有没有办法在数组上调用像contains
这样的东西,结合正则表达式,让我找到我正在寻找的值?或者我是否必须遍历stdout_lines
条目才能找到我要查找的内容?
如何做这样的事情的例子将不胜感激。
答案 0 :(得分:17)
简单的python in
会很好,注意我使用stdout
代替stdout_lines
:
- debug: git_config_list contains user.name
when: "'user.name=' in '{{git_config_list.stdout}}'"
总而言之ansible
编程很糟糕。尝试在playbook之外尽可能多地做,并在playbook中只编写编排逻辑。以下是使用--get
的{{1}}选项如何执行此操作的一些示例。
git
答案 1 :(得分:5)
理论上,这可以通过组合过滤器match
和select
来实现。后者仅返回通过另一个过滤器的列表元素。然后你可以测试结果的长度。
理论上。我只是测试了它,我无法让它工作。通常,select
(以及reject
)过滤器会返回类似<generator object _select_or_reject at 0x10531bc80>
的字符串,即使使用简单的过滤器,例如来自带odd
的文档的示例。还没有找到解决方案。也许你有更多的成功。
虽然您可以简单地join
将您的列表添加到字符串中,然后使用match
搜索字符串。虽然很难看,但它确实有效。
git_config_list.stdout_lines | join("|") | match("user.name=[^|]+")
答案 2 :(得分:1)
选择并匹配(扩展乌冬丹的答案):
git_config_list.stdout_lines | select('match', 'user\.name=.+') | list