Need to avoid using a hosts or inventory file using Ansible

Hello,

The way I am implementing Ansible will mean that I will not know the IP of the server I am configuring until I am launching the Playbook. I have tried passing in a variable for the IP for Ansible complains with:

ERROR: provided hosts list is empty

Here is a look at my .yml and command line:

I would recommend using a dynamic inventory script that would provide the information, assuming it can be found via some local command or API?

you always need inventory, but you can do it int he command line:

-i '192.168.1.24,'​

the comma is required as it signifies its a list vs a directory/file

And we should never teach people that trick, because it’s quite useful to have inventory.

It’s kept around for historical reasons but may not be there indefinitely.

I actually tried this using command line and it never worked for me. Are there any dependencies for this to work? Such as an empty hosts or inventory file?

“I actually tried this using command line and it never worked for me”

What does “never worked for me” mean?

“never worked for me” means that I tried using the command several times using variations in syntax and it was not successful.

what variations? what errors would you get? more information would be
useful for debugging.

root@MidLinux:/var# ansible-playbook -i ‘192.168.1.24,’ SNMP.yml

PLAY [SNMP] *******************************************************************
skipping: no hosts matched

In the yml file, I specify SNMP for group. If I leave this blank, I get:

ERROR: hosts declaration is required

SNMP is a real group in the hosts file. A hosts file is not practical for me since I have so many servers. Additionally, I would need a way to pass in SSH UN and PW since those parameters are also kept in the hosts file. Any help would be appreciated.

I am somewhat confused. You can’t use an inventory file because you have too many hosts, but need to use one because you have too many usernames and passwords?

When you use: -i 192.168.1.24,

Ansible explicitly only knows of a single host called 192.168.1.24. It has no concepts of groups or other hosts if you don’t give it an inventory file.

Your hosts declaration would either need to be “all” or “192.168.1.24” otherwise it will never match its knowledge of your inventory.

Maybe you should looks into creating a dynamic inventory script to pull from an API or CMDB containing info about your hosts.

The way we are trying to use Ansible is to dynamically configure a server during instantiation of a VM. We won’t know the IP or hostname of the VM until it is created and once the IP is known, then we want to tell Ansible what to do with it. A hosts/inventory can’t be populated when we don’t yet know what the IP will be. The current workaround is to launch the VM, grab the IP, modify the hosts file using sed, and then running the playbook to fully configure the server and then resetting the hosts file for next use. I feel like the hosts file dependency is really limiting how we want to use Ansible.

We will always configure one server at a time, but in this same fashion and there could be many in a day.

I just tried this command and it worked this time, however, since we prefer to use UN and PW for SSH instead of keys (same reason as above, and we don’t want to have to establish SSH connection and accept key each time we run Ansible on a new host) we need a method of specifying SSH credentials to the command line using this fake inventory method: ansible-playbook SNMP.yml -i 192.168.1.24,

just change the play to hosts: all, since you are always going to execute
it with -i 'ip,' it should not be an issue.

I am able to target the host, however, I am not able to authenticate with the host. I get:

GATHERING FACTS ***************************************************************
fatal: [IP] => SSH encountered an unknown error during the connection. We recommend you re-run the command using -vvvv, which will enable SSH debugging output to help diagnose the issue

I need to be able to pass in: ansible_ssh_user=root ansible_ssh_pass=password since these are stored in the host file, which is being overridden. I am able to pass -k which asks for a password, but I will sending this command from another machine and will not be able to monitor the terminal to enter the password. Please assist. Once this is working, I will be all set!

Can you create the VM within the Ansible script, add the new IP to a host group, and go from there? I do this all the time in my Ansible scripts.

An additional suggestion: start using SSH keys instead of username/password and you might find that security management is significantly easier. I don’t know what your use case involves, however, so this might not work for you.

Example host group script:

We are using Ansible in a way which requires UN/Pass vs. keys for us. Is there a way we can send that into the command line as a “fake inventory file” as well?

I’m not sure I can envision how a particular use of Ansible would require user/pass instead of keys, but ok. :slight_smile:

You can pass any information to Ansible on the command line by either using —extra-vars or accessing environment variables within the script.

Regards,
-scott

Use a dynamic inventory script if you don't know the IP. That is what
it is designed for. If you want to pass ssh usernames and passwords
(extremely extremely insecure, please use SSH Keys), you can do that
with ansible_ssh_user and ansible_ssh_pass inventory variables. You
will need to have sshpass installed for this to work.

- James

Dynamic inventory scripts are not appropriate if the IP does not exist yet, as in the case of creating a new VM.

Regards,
-scott

Launch your playbooks in two stages -- one for provisioning the VM,
and one for configuring the VM. Once the VM is provisioned, an IP
will be allocated and a dynamic inventory script would work.

You might also want to look at the add_host module:

http://docs.ansible.com/add_host_module.html

add_host is what I use for this purpose.

Regards,
-scott