I am trying to run an Ansible inventory file ansible -i hosts-prod all -u root -m ping
and it is failing with this message:
ERROR: The file hosts-prod is marked as executable,
but failed to execute correctly. If this is not supposed
to be an executable script, correct this with
`chmod -x hosts-prod`.
I believe this is because I am using Virtual Box and shared folders which is forcing all my files to ug+rwx. And vbox does not permit changing permissions on shared folders (at least shared folders coming from Windows which is my situation)
Is there a way to allow Ansible to run this file? I can see several options:
- Edit
hosts-prod
to become an executable file. I don't know what's involved in this (being new to Ansible, obviously). - Set a configuration option in Ansible to tell it not to run this file as executable - just treat it as the static configuration file it is. I can't find an option to do this, so I suspect it's not possible.
- Move the file outside of shared-folders: not an option in my case.
- Your better idea..
All assistance/ideas appreciated!
The actual hosts-prod
config file looks as follows, so any tips on making it internally executable would be welcome:
web01 ansible_ssh_host=web01.example.com
db01 ansible_ssh_host=db01.example.com
[webservers]
web01
[dbservers]
db01
[all:vars]
ansible_ssh_user=root
Executable inventories are parsed as JSON instead of ini files, so you can convert it to a script that outputs JSON. On top of that, Ansible passes some arguments to them to a simple 'cat' isn't enough:
Not as elegant as a simple 'cat', but should work.
@hkariti's answer is first and closest to the original question. I ended up re-writing the config file entirely into a Ruby script and that is working fine. I thought I'd share that code here since finding complete examples for Ansible dynamic inventory files wasn't super easy for me. The file is different from a static file in how you associate variables with machine listings in the inventory (using the _meta tag)..