Ansible仅在变量的子元素存在时运行

Ansible仅在变量的子元素存在时运行,ansible,yaml,Ansible,Yaml,我有一些变量定义如下: x_php_versions_installed: php70: - php70-curl - php70-xml - php70-xmlrpc - php70-zip - pecl-memcached php71: - php71-curl - php71-xml - php71-xmlrpc - php71-zip php72: - php72-curl - php72

我有一些变量定义如下:

x_php_versions_installed:
  php70:
    - php70-curl
    - php70-xml
    - php70-xmlrpc
    - php70-zip
    - pecl-memcached
  php71:
    - php71-curl
    - php71-xml
    - php71-xmlrpc
    - php71-zip
  php72:
    - php72-curl
    - php72-xml
    - php72-xmlrpc
    - php72-zip
    - pecl-memcached
- name: memcached pecl install
  pear:
    executable: '/usr/local/{{ item }}/bin/pecl'
    name: 'pecl/memcached'
    state: 'latest'
  with_items: '{{ x_php_versions_installed | list }}'
  when: 'item.pecl-memcached is defined'
我想检查所有变量(php70、php71、php72等等)是否有这个变量:pecl memcached,如果有,那么运行一个命令。我的剧本是这样的:

x_php_versions_installed:
  php70:
    - php70-curl
    - php70-xml
    - php70-xmlrpc
    - php70-zip
    - pecl-memcached
  php71:
    - php71-curl
    - php71-xml
    - php71-xmlrpc
    - php71-zip
  php72:
    - php72-curl
    - php72-xml
    - php72-xmlrpc
    - php72-zip
    - pecl-memcached
- name: memcached pecl install
  pear:
    executable: '/usr/local/{{ item }}/bin/pecl'
    name: 'pecl/memcached'
    state: 'latest'
  with_items: '{{ x_php_versions_installed | list }}'
  when: 'item.pecl-memcached is defined'

这应该调用
/usr/local/php70/bin/pecl
/usr/local/php72/bin/pecl
二进制文件来安装memcached。只要我删除
when
条件,它就工作得很好,但是它将调用
x\u php\u versions\u安装的
中的每个变量,而不仅仅是在定义了pecl memcached的地方。因此,在这种情况下,我需要修复
when
条件,但我所有的尝试都会给我一个错误。

如果您想让
when
正确检查列表,您必须使用Jinja的测试操作符:

-名称:memcached pecl安装
梨:
可执行文件:'/usr/local/{{item}}}/bin/pecl'
名称:“pecl/memcached”
声明:“最新”
带有以下项:“{x_php_versions_installed | list}”
当:“'pecl-memcached'在x_php_版本中安装[项目]”
根据剧本:

-hosts:localhost
收集事实:不
变量:
已安装的x_php_版本:
php70:
-php70卷曲
-php70 xml
-php70 xmlrpc
-php70拉链
-pecl内存缓存
php71:
-php71卷曲
-php71 xml
-php71 xmlrpc
-php71拉链
php72:
-php72卷曲
-php72 xml
-php72 xmlrpc
-php72拉链
-pecl内存缓存
任务:
-调试:
msg:“{{item}}”
带有项目:{x_php_versions_installed | list}”
当:“'pecl-memcached'在x_php_版本中安装[项目]”
总结如下:

TASK [debug] *******************************************************************
ok: [localhost] => (item=php70) => {
    "msg": "php70"
}
skipping: [localhost] => (item=php71) 
ok: [localhost] => (item=php72) => {
    "msg": "php72"
}
TASK [debug] *******************************************************************
ok: [localhost] => (item=php70) => {
    "msg": "php70"
}
skipping: [localhost] => (item=php71) 
ok: [localhost] => (item=php72) => {
    "msg": "php72"
}

您的子元素是一个列表,而不是一个字典,因此访问像您在这里尝试的元素键,即:

when:“x_php_versions_installed[项目]['pecl-memcached']已定义”
我会写一本这样的字典:

x\u php\u版本\u已安装:
php70:
php70卷曲:
php70 xml:
php70 xmlrpc:
php70拉链:
pecl memcached:
#其他版本的PHP也是如此
根据剧本:

-hosts:localhost
收集事实:不
变量:
已安装的x_php_版本:
php70:
php70卷曲:
php70 xml:
php70 xmlrpc:
php70拉链:
pecl memcached:
php71:
php71卷曲:
php71 xml:
php71 xmlrpc:
php71拉链:
php72:
php72卷曲:
php72 xml:
php72 xmlrpc:
php72拉链:
pecl memcached:
任务:
-调试:
msg:“{{item}}”
带有项目:{x_php_versions_installed | list}”
定义“x_php_versions_installed[item]['pecl-memcached']时”
总结如下:

TASK [debug] *******************************************************************
ok: [localhost] => (item=php70) => {
    "msg": "php70"
}
skipping: [localhost] => (item=php71) 
ok: [localhost] => (item=php72) => {
    "msg": "php72"
}
TASK [debug] *******************************************************************
ok: [localhost] => (item=php70) => {
    "msg": "php70"
}
skipping: [localhost] => (item=php71) 
ok: [localhost] => (item=php72) => {
    "msg": "php72"
}

这对我来说很好,而且很高兴,我也不需要修改dict(
在每个phpXY元素之后),如果没有它们,它就可以工作了。是的,有两种味道,一种是在编写时与
在一起,需要一本字典,另一种是在列表上工作