在 Ansible 中构建映射时发出警告

Warning while constructing a mapping in Ansible

每当我 运行 我的剧本时,就会出现以下警告:

[WARNING]: While constructing a mapping from /etc/ansible/roles/foo/tasks/main.yml, line 17, column 3, found a duplicate dict key (file). Using last defined value only.

任务文件夹中我的main.yml相关部分是这样的:

(第 17 行是清理文件的任务,看起来有点不对劲,所以我猜问题出在前面的 "script" 行)

- name: Run script to format output
  script: foo.py {{ taskname }} /tmp/fcpout.log
- name: Clean temp files
  file: path=/tmp/fcpout.log state=absent

还有我的 vars 文件:

---
my_dict: {SLM: "114", Regular: "255", Production: "1"}
taskid: "{{my_dict[taskname]}}"

为了 运行 我的剧本:

ansible-playbook playbooks/foo.yml --extra-vars "server=bar taskname=SLM"

我想做的是获取命令行参数,设置主机:使用 "server" 参数,获取任务名称并从中找出 id 所指的。此 ID 用作我的 python 脚本的第一个输入,该脚本远程 运行。

剧本运行良好,但我不明白为什么会收到警告。谁能解释这里出了什么问题?

您确定第 17 行周围没有更多内容吗?当任务中有两个相同的键时(或通常在字典中的任何地方),会触发此警告。

警告声称有两个 file 键,建议任务如下所示:

- name: Clean temp files
  file: ...
  file: ...

一个常见的错误是人们忘记为下一个任务开始一个新的列表项。以下内容有效,而以上内容无效:

- name: Clean temp files
  file: ...
- file: ...

我注意到 Ansible 有时会在错误消息中弄错行甚至文件。我看到它抱怨 tasks/main.yml,而问题实际上是在 handlers/main.yml。如果在该行附近找不到具有重复 file 键的此类任务,请搜索整个文件甚至其他文件。如果在任何地方都找不到这样的东西,那么您似乎在 Ansible 中发现了一个错误。在那种情况下,你应该 repot it on github.

我遇到这个警告是因为在模块中使用了重复的选项。例如,我不小心在模块定义中使用了 "host" 选项 2 次,如下所示:

 name: Create NEW DB User
 mysql_user:
   name: NEW USER NAME
   login_user: root
   login_password: Root Passwd
   password: NEW USER'S PASSWD
   host: localhost
   priv: 'DB NAME.*:ALL,GRANT'
   state: present
   host: localhost

警告已通过省略主机选项之一消失。