每当我运行我的剧本时,都会出现以下警告:
[警告]:从/etc/ansible/roles/foo/tasks/main.yml,第17行,第3列构建映射时,发现 重复的dict键(文件)。仅使用最后定义的值。
我的main.yml在tasks文件夹中的相关部分是这样的:
(第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脚本的第一个输入。
该剧本工作正常,但我不明白为什么会收到警告。任何人都可以解释这里有什么问题吗?
答案 0 :(得分:10)
你确定17号线附近没有更多吗?当任务中有两个相同的键(或通常在dict中的任何位置)时,会触发此警告。
警告声称有两个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。
答案 1 :(得分:0)
由于在模块中使用重复的选项,我遇到了此警告。例如,不小心在模块定义中两次使用了“ host”选项,如下所示:
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
通过省略主机选项之一,警告已消失。