Loops Ansible如果列表为空,如何跳过循环
我正在运行Ansible,我试图使这项任务正常工作。我已将变量“docker\u registries”的默认值定义为空列表: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添加到查找调用中,或使用
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
值(akaNone
);在这两种情况下,您可能会在循环中成功地使用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”。是的,你自己的回答帮助了我,谢谢!