如何检查Ansible数组中是否存在项目?

时间:2015-03-20 07:12:12

标签: ansible

我们假设我有以下示例,将所有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条目才能找到我要查找的内容?

如何做这样的事情的例子将不胜感激。

3 个答案:

答案 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)

理论上,这可以通过组合过滤器matchselect来实现。后者仅返回通过另一个过滤器的列表元素。然后你可以测试结果的长度。

理论上。我只是测试了它,我无法让它工作。通常,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