首页 文章

在剧本中的Ansible变量检查

提问于
浏览
-1

我在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 回答

  • 1

    您在 with_items 中使用名为"bare variables"的过时语法:

    with_items: project_dbs
    

    这样, item 成为一个字符串对象,其值为 project_dbs ,Ansible报告它没有属性("'unicode object' has no attribute 'projects_db_name'") .

    在Ansible 2.x中,您应该按以下方式引用变量:

    with_items: "{{ project_dbs }}"
    

    也就是说,您的任务不会使用循环中的值 . 以下将具有相同的效果:

    - name: copy config.json template to server
      tags: provision
      template: src=config.json dest={{ project_root }}/config
    
  • 0

    您可以只过滤project_dbs列表,而不是使用 when ,所以它看起来像这样:

    - name: "copy config.json template to server"
      tags: provision
      template: src=config.json dest={{ project_root }}/config
      with_items: "{{ project_dbs | selectattr("project_db_name", "project2") }}"
    

相关问题