Ashar
Ashar

Reputation: 3065

Issue adding duplicate name with different ansible_user to add_host dynamic inventory

Here is my playbook that builds a dynamic inventory using add_host:

---

- name: "Play 1"
  hosts: localhost
  gather_facts: no
  tasks:
   - name: "Search database"
     command: >       mysql --user=root --password=p@ssword deployment
       --host=localhost  -Ns -e "SELECT dest_ip,username FROM deploy_dets"
     register: command_result

   - name: Add hosts
     add_host:
       name: "{{ item.split('\t')[0] }}"
       ansible_user:  "{{ item.split('\t')[1] }}"
       groups: dest_nodes
     with_items: "{{ command_result.stdout_lines }}"


- hosts: dest_nodes
  gather_facts: false
  tasks:
    - debug:
        msg: Run the shell script with the arguments `{{ ansible_user }}` here"

The Output is good and as expected when the 'name:' attribute of add_host are of different values IPs viz '10.9.0.100' & '10.8.2.144'

$ ansible-playbook duplicate_hosts.yml


PLAY [Play 1] ***********************************************************************************************************************************************

TASK [Search database] **************************************************************************************************************************************
changed: [localhost]

TASK [Add hosts] ********************************************************************************************************************************************
changed: [localhost] => (item=10.9.0.100    user1)
changed: [localhost] => (item=10.8.2.144    user2)

PLAY [dest_nodes] *******************************************************************************************************************************************

TASK [debug] ************************************************************************************************************************************************
ok: [10.9.0.100] => {
    "msg": "Run the shell script with the arguments `user1` here\""
}
ok: [10.8.2.144] => {
    "msg": "Run the shell script with the arguments `user2` here\""
}

PLAY RECAP **************************************************************************************************************************************************
10.8.2.144                 : ok=1    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
10.9.0.100                : ok=1    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
localhost                  : ok=2    changed=2    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

The problem is when the 'name:' attribute for add_host gets duplicate entry say 10.8.2.144 despite having unique 'ansible_user' value the play ignores the first name, ansible_user entry and runs only once with the latest final entry.

$ ansible-playbook duplicate_hosts.yml

PLAY [Play 1] ***********************************************************************************************************************************************

TASK [Search database] **************************************************************************************************************************************
changed: [localhost]

TASK [Add hosts] ********************************************************************************************************************************************
changed: [localhost] => (item=10.8.2.144     user1)
changed: [localhost] => (item=10.8.2.144     user2)

PLAY [dest_nodes] *******************************************************************************************************************************************

TASK [debug] ************************************************************************************************************************************************
ok: [10.8.2.144] => {
    "msg": "Run the shell script with the arguments `user2` here\""
}

PLAY RECAP **************************************************************************************************************************************************
10.8.2.144                 : ok=1    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
localhost                  : ok=2    changed=2    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

Interestingly the debug shows two entries for add_host name: 10.8.2.144 with the different ansible_users i.e 'user1' and 'user2' but when we run the group it runs just the single and latest name entry and seen in the output above.

I'm on the latest version of ansible.

Can you please provide some solution where i can run the play for every unique 'ansible_user' on the same host ?

In summary: I wish to run multiple tasks on the same host first with 'user1' and then with 'user2'

Upvotes: 0

Views: 810

Answers (1)

Smily
Smily

Reputation: 2578

You can add a alias as inventory hostname. Here I have given the username as hostname(alias). Please try this, I have not tested it.

- name: Add hosts 
  add_host:
    hostname: "{{ item.split('\t')[1] }}"
    ansible_host: "{{ item.split('\t')[0] }}"
    ansible_user:  "{{ item.split('\t')[1] }}"
    groups: dest_nodes
  with_items: "{{ command_result.stdout_lines }}"

Upvotes: 1

Related Questions