9

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

[警告]:在从 /etc/ansible/roles/foo/tasks/main.yml 构建映射时,第 17 行第 3 列,发现重复的 dict 键(文件)。仅使用最后定义的值。

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

(第 17 行是清理文件的任务,这似乎有点不对劲,所以我猜问题出在前面的“脚本”行)

- 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"

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

该剧本工作正常,但我不明白为什么会收到警告。谁能解释这里有什么问题?

4

2 回答 2

13

你确定17号线附近没有更多的吗?当任务中有两个相同的键(或通常在字典中的任何位置)时会触发此警告。

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

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

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

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

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

于 2016-03-11T17:17:03.643 回答
1

由于在模块中使用了重复的选项,我遇到了这个警告。例如,我不小心在模块定义中使用了“主机”选项 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

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

于 2019-10-01T11:05:14.750 回答