假设我有以下示例,将所有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)
理论上,这应该是通过组合过滤器match和select.后者仅返回通过另一个过滤器的列表元素.然后你可以测试结果的长度.
理论上.我只是测试了它,我无法让它工作.通常,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)
通过选择和匹配(乌东丹的扩展答案):
git_config_list.stdout_lines | select('match', 'user\.name=.+') | list
Run Code Online (Sandbox Code Playgroud)