我在vars文件中配置了如下数据库:
project_dbs:
- { project_db_name: "project1", project_db_user: "user", tenon_db_password: "pass" }
- { project_db_name: "project2", project_db_user: "dev", tenon_db_password: "pass2"}
- { project_db_name: "project3", project_db_user: "{{datadog_mysql_username}}", project_db_password: "{{datadog_mysql_password}}" }
现在在剧本中我有一张支票:
- name: copy config.json template to server
tags: provision
template: src=config.json dest={{ project_root }}/config
when: item.project_db_name == "project2"
with_items: project_dbs
但检查失败的时候 . 知道如何做到这一点吗?
错误消息如下所示:
致命:[测试]:失败! => {“failed”:true,“msg”:“条件检查'item.projects_db_name == \”project2 \“'失败 . 错误是:评估条件时出错(item.projects_db_name == \”project2 \“ ):'unicode object'没有属性'projects_db_name'\ n \ n错误似乎出现在'/var/lib/jenkins/project/ansible/roles/project2/tasks/main.yml'中:第28行第3列,但可能在文件的其他位置,具体取决于确切的语法问题 . \ n \ n违规行似乎是:\ n \ n \ n-名称:将config.json模板复制到服务器\ n ^ here \ n“}
2 回答
您在
with_items
中使用名为"bare variables"的过时语法:这样,
item
成为一个字符串对象,其值为project_dbs
,Ansible报告它没有属性("'unicode object' has no attribute 'projects_db_name'") .在Ansible 2.x中,您应该按以下方式引用变量:
也就是说,您的任务不会使用循环中的值 . 以下将具有相同的效果:
您可以只过滤project_dbs列表,而不是使用
when
,所以它看起来像这样: