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:
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?
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,
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.
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?
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.
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: