Warning while constructing a mapping in Ansible
Solution 1
Are you sure there is not more around the line 17? This warning is triggered when there are two identical keys in a task (or in general anywhere in a dict).
The warning claims there are two file
keys, suggesting the task looks like this:
- name: Clean temp files
file: ...
file: ...
A common mistake is that people forget to start a new list item for the next task. The following would be valid, while the above is not:
- name: Clean temp files
file: ...
- file: ...
I noticed Ansible sometimes gets the lines or even files wrong in error messages. I have seen it complaining about tasks/main.yml
while the problem actually was in handlers/main.yml
. If no such task with duplicate file
keys can be found near that line, search the whole file or even other files for it. If there is nothing like this anywhere to be found, then it would appear you found a bug in Ansible. In that case you should repot it on github.
Solution 2
I faced this warning because of using duplicate options in a module. For example, accidentally I used "host" option 2 times in the module definition like below:
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
The warning has been disappeared by omitting one of the host options.
Cobra Kai Dojo
Updated on October 02, 2020Comments
-
Cobra Kai Dojo over 3 years
Whenever I run my playbook the following warning comes up:
[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.
The relevant part of my main.yml in the tasks folder is like this:
(line 17 is the task to clean the files which seems a bit off so I guess the problem is with the previous "script" line)
- name: Run script to format output script: foo.py {{ taskname }} /tmp/fcpout.log - name: Clean temp files file: path=/tmp/fcpout.log state=absent
And my vars file:
--- my_dict: {SLM: "114", Regular: "255", Production: "1"} taskid: "{{my_dict[taskname]}}"
To run my playbook I do:
ansible-playbook playbooks/foo.yml --extra-vars "server=bar taskname=SLM"
What I'm trying to do is to take the command line arguments, set the hosts: with the "server" parameter, get the taskname and from that find out to which id refers to. This id is used as the first input to my python script which runs remotely.
The playbook works fine, but I don't understand why I get a warning. Could anyone explain what is wrong here?
-
Cobra Kai Dojo about 8 yearsYou are correct. There was a second
file:
task. I am unfamiliar with the ansible wording, so I didn't get that with "found a duplicate dict key (file)" it was referring to the file module. With the word "key" I thought that it had to do with my dictionary... Thanks for the help. -
William Turrell about 7 yearsYou can get this if you have two "task:" keys too :) scenario: there's a single task in a playbook and you've duplicated it but also copied the task heading by mistake. Can backup what @udondan says about erroneous line numbers too - I've seen warnings several lines out.