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 host
@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)..
#!/usr/bin/env ruby
# this file must be executable (chmod +x) in order for ansible to use it
require 'json'
module LT
module Ansible
def self.staging_inventory
{
local: {
hosts:["127.0.0.1"],
vars: {
ansible_connection: "local"
}
},
common: {
hosts: [],
children: ["web", "db"],
vars: {
ansible_connection: "ssh",
}
},
web: {
hosts: [],
children: ["web_staging"]
},
db: {
hosts: [],
children: ["db_staging"]
},
web_staging: {
hosts: ["webdb01-ci"],
vars: {
# server specific vars here
}
},
db_staging: {
hosts: ["webdb01-ci"]
}
}
end
end
end
# ansible will pass "--list" to this file when run from command line
# testing for --list should let us require this file in code libraries as well
if ARGV.find_index("--list") then
puts LT::Ansible::staging_inventory.to_json
end