Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Save playbook information to hosts file

Tags:

ansible

I have a playbook that spins up a new droplet on DigitalOcean using the core module built into Ansible:

- name: Provision droplet on DigitalOcean
  local_action: digital_ocean
    state=present
    ssh_key_ids=1234
    name=mydroplet
    client_id=ABC
    api_key=ABC
    size_id=1
    region_id=2
    image_id=3
    wait_timeout=500
  register: my_droplet
- debug: msg="ID is {{ my_droplet.droplet.id }}"
- debug: msg="Your droplet has the IP address of {{ my_droplet.droplet.ip_address }}"

I run this using (note the local argument):

ansible-playbook playbooks/create_droplet.yml -c local -i playbooks/hosts

My hosts file initially looks like this:

[production]
TBA

[localhost]
localhost

When the above playbook finishes I can see the debug information in STDOUT:

ok: [localhost] => {
    "msg": "Your droplet has the IP address of 255.255.255.255"
}

Is there any way for this playbook to retain the my_droplet.ip_address variable and save the TBA in the hosts file instead of having to manually copy-pasta it there? I ask because I want to add this provisioning playbook to a ruby script that subsequently bootstraps the VPS with another playbook.

like image 330
Simpleton Avatar asked Dec 05 '22 23:12

Simpleton


2 Answers

I am doing the same, having written a play that creates servers from a dict (approximately 53 servers at a go, dynamically creating a full test environment). To use a static hosts file, I add the following:

- name: Create in-memory inventory
  add_host:
    name: "{{ item.value.ServerName }}"
    groups: "{{ item.value.RoleTag }},tag_Environment_{{ env_name }}"
  when: item.value.template is defined 
  with_dict: server_details  

- name: create file
  become: yes
  template:
    src: ansible-hosts.j2
    dest: "{{ wm_inventory_file }}"

The ansible-hosts.j2 template is simply:

{% for item in groups %}

[{{item}}]
{%   for entry in groups[item] %}
{{ entry }}
{%   endfor %}
{% endfor %}
like image 105
Johan Kritzinger Avatar answered Jan 03 '23 01:01

Johan Kritzinger


I'm launching instances with ec2, and I originally wanted to do the same thing. I found some examples of using lineinfile and massaging it to the do the same thing as so:

  - name: Launching new instances for {{ application }} 
    local_action: ec2 group={{ security_group }} instance_type={{ instance_type}} image={{ image }} wait=true region={{ region }} keypair={{ keypair }} vpc_subnet_id={{ subnet }} count={{ instance_count }}
    register: ec2

  - name: Add instance to local host group
    local_action: lineinfile dest=ansible_hosts regexp="{{ item.public_ip }}" insertafter="\[{{ application }}\]" line="{{ item.public_ip }} ansible_ssh_private_key_file=~/ec2-keys/{{ keypair }}.pem" state=present
    with_items: ec2.instances

But, I have to agree that it's generally not something you want to do. I found it to be quite a pain. I've since switched to using add_host and life is much better. BTW, application would be the value I used for the group name...

like image 44
Xanxir Avatar answered Jan 03 '23 01:01

Xanxir