Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Loops Ansible如果列表为空,如何跳过循环_Loops_Variables_Ansible_Yaml_Jinja2 - Fatal编程技术网

Loops Ansible如果列表为空,如何跳过循环

Loops Ansible如果列表为空,如何跳过循环,loops,variables,ansible,yaml,jinja2,Loops,Variables,Ansible,Yaml,Jinja2,我正在运行Ansible,我试图使这项任务正常工作。我已将变量“docker\u registries”的默认值定义为空列表:docker\u registries:[]我注意到,如果列表为空,则在运行ansible playbook时会出错。这是我得到的错误: 致命:[***.cloudapp.azure.com]:失败!=>{“msg”:“传递到“loop”的数据无效,它需要一个列表,改为:无。提示:如果只传递了一个元素的列表/目录,请尝试将wantlist=True添加到查找调用中,或使用

我正在运行Ansible,我试图使这项任务正常工作。我已将变量“docker\u registries”的默认值定义为空列表:
docker\u registries:[]
我注意到,如果列表为空,则在运行ansible playbook时会出错。这是我得到的错误:

致命:[***.cloudapp.azure.com]:失败!=>{“msg”:“传递到“loop”的数据无效,它需要一个列表,改为:无。提示:如果只传递了一个元素的列表/目录,请尝试将wantlist=True添加到查找调用中,或使用q/query代替查找。”}

我试图添加一个条件,即如果“docker_注册表”为空,则任务将继续,而不会引发错误。 这是此任务的代码:

- name: Log into additional docker registries, when required
  command: docker login -u {{item.username}} -p {{item.password}} {{item.server}}
  become: true
  loop: "{{docker_registries}}"
我试图将循环更改为
循环:“{{lookup(docker_注册表,{'skip_missing':True}}}}”
但是我得到了错误

任务执行期间发生异常。看到全部 回溯,使用-vvv。错误为:AttributeError:“非类型”对象 没有“较低”致命属性: [***.cloudapp.azure.com]:失败!=> {“msg”:“模块执行期间发生意外故障”。,“stdout”:“”}

我对这个很陌生。有人能帮忙吗?

您可以将in-aison与Jinja测试结合使用。
因为,如果你想循环你的变量,那么它应该是可测试的

-name:需要时登录其他docker注册表
命令:docker login-u{{item.username}}-p{{{item.password}}{{item.server}
变成:真的
循环:“{{docker_Registeries}}”
何时:docker_注册表不可编辑

根据变量的内容,when条件仍然不能起作用,因为传递给
循环的数据的有效性将首先被考虑

现在,您可以使用循环内声明本身来解决这个问题:

-name:需要时登录其他docker注册表
命令:docker login-u{{item.username}}-p{{{item.password}}{{item.server}
变成:真的
循环:{{docker_注册表,如果docker_注册表是iterable else[]}”

还要注意,字符串在Python中是一个iterable,简单地说,就是一个字符列表

所以你可能想去:

-name:需要时登录其他docker注册表
命令:docker login-u{{item.username}}-p{{{item.password}}{{item.server}
变成:真的
循环:“{docker_注册表,如果docker_注册表是可写的,并且docker_注册表不是字符串else[]}”

谢谢大家。我在我的group\u vars文件中有一行注释掉了所有docker\u注册表用户名和密码以及所有内容,但我没有注释
docker\u注册表:
行本身。这就是为什么给我的是None而不是空列表。

至少根据错误,您实际上没有将空列表传递给
循环:
您传递了
null
值(aka
None
);在这两种情况下,您可能会在
循环中成功地使用as:“{{docker_registries | default([])}”
我之前确实添加了默认值,但运气不好。我在添加后出现此错误:致命:[atefeh-atefeh-domain-lm0.centralus.cloudapp.azure.com]:失败!=>{“msg”:“传递到“loop”的数据无效,它需要一个列表,改为:。提示:如果只传递了一个元素的列表/dict,请尝试将wantlist=True添加到查找调用中,或使用q/query代替查找。”}如果您共享定义空列表的位置,或者将空列表的默认值传递给docker_registries变量,则会有所帮助。如果它是空列表,它将完全跳过该任务。如果是None,那么您将得到错误。快速问题:@mdaniel的想法在这种情况下有效吗?在这种情况下,变量被定义为值
None
default
过滤器是否适用,或者默认值是否仅适用于完全未定义的变量?确实适用,但需要设置为true:
hello{{{None | default(“world”,true)}
我仍然收到相同的错误:致命:[***.cloudapp.azure.com]:失败!=>{“msg”:“传递到“loop”的数据无效,它需要一个列表,而不是:None。提示:如果只传递了一个元素的列表/目录,请尝试将wantlist=True添加到查找调用中,或者使用q/query而不是lookup。”}+1,因为我在使用AWX时遇到了这个问题。我在调查中询问变量值,并将默认值设置为空白。这导致我的变量没有被定义,但值为“None”。是的,你自己的回答帮助了我,谢谢!