Search code examples
virtualboxchmodansibleshared-directory

Can't use ansible inventory file because it is executable


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:

  1. Edit hosts-prod to become an executable file. I don't know what's involved in this (being new to Ansible, obviously).
  2. 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.
  3. Move the file outside of shared-folders: not an option in my case.
  4. 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

Solution

  • 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:

    #!/bin/bash
    cat <<EOF
    {
     "_meta": {
       "hostvars": {
         "host1": { "some_var": "value" }
       }
     },
     "hostgroup1": [
       "host1",
       "host2"
     ]
     ...
    }
    EOF
    

    Not as elegant as a simple 'cat', but should work.