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

nwi*_*ler 9 ansible

假设我有以下示例,将所有git config值存储在Ansible变量中:

- shell: git config --global --list
  register: git_config_list
Run Code Online (Sandbox Code Playgroud)

Ansible将此命令的结果存储在git_config_list变量中,其中一个项目stdout_lines包含条目数组中的命令输出,例如

[
"user.name=Foo Bar",
"user.email=foo@example.com"
]
Run Code Online (Sandbox Code Playgroud)

如何检查是否已设置某个值,例如验证user.name是否有值?

有没有办法调用像contains数组一样的东西,结合正则表达式,让我找到我正在寻找的值?或者我是否必须遍历stdout_lines条目以找到我正在寻找的内容?

关于如何做这样的事情的例子将不胜感激.

Kas*_*yap 17

简单的python in会做得很好,注意我使用stdout而不是stdout_lines:

- debug: git_config_list contains user.name
  when: "'user.name=' in '{{git_config_list.stdout}}'"
Run Code Online (Sandbox Code Playgroud)

总而言之,ansible编程很糟糕.尝试在playbook之外尽可能多地做,并在playbook中只编写编排逻辑.以下是一些使用--get选项的方法git.

- hosts: localhost
  tags: so
  gather_facts: False
  tasks:
  - shell: git config --global --get user.name
    register: g
    changed_when: False
    failed_when: False
  - debug: msg="config has user.name"
    when: "0 == {{g.rc}}"

- hosts: localhost
  tags: so
  gather_facts: False
  tasks:
  - name: assert user.name is set
    shell: git config --global --get user.name
    changed_when: False

# git config --global --unset user.name
# ansible pb.yml -t so
# git config --global --add user.name 'Kashyap Bhatt'
# ansible pb.yml -t so
Run Code Online (Sandbox Code Playgroud)


udo*_*dan 5

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

理论上.我只是测试了它,我无法让它工作.通常,select(以及reject)过滤器返回一个字符串,就像<generator object _select_or_reject at 0x10531bc80>使用简单的过滤器一样,例如来自docs的示例odd.还没有找到解决方案.也许你有更多的成功.

虽然您可以简单地join将您的列表添加到字符串中,然后在字符串中搜索match.虽然很丑,但它确实有效.

git_config_list.stdout_lines | join("|") | match("user.name=[^|]+")
Run Code Online (Sandbox Code Playgroud)


sim*_*ohe 5

通过选择和匹配(乌东丹的扩展答案):

git_config_list.stdout_lines | select('match', 'user\.name=.+') | list
Run Code Online (Sandbox Code Playgroud)