ansible-runner icon indicating copy to clipboard operation
ansible-runner copied to clipboard

ansible_runner.interface.run not respecting the `limit` option

Open daltschu22 opened this issue 1 year ago • 4 comments

Hello!

I am attempting to deploy playbooks using ansible-runner.

I am passing these options into the interface.run() module. {'private_data_dir': '/tmp', 'playbook': '/opt/rde-ansible/site.yaml', 'inventory': '/opt/rde-ansible/inventories/sandbox/hosts', 'extravars': {}, 'verbosity': 4, 'limit': 'daltschuler-rde'}

Everything seems to execute fine, the output says its targeting the correct ip of the host im trying to configure, but then it starts configuring the underlying host that im running ansible-runner on. Not deploying to the remote host im specifying in my inventory.

Here is an example of the output:

task path: /opt/rde-ansible/site.yaml:2
<10.216.136.166> ESTABLISH LOCAL CONNECTION FOR USER: root
<10.216.136.166> EXEC /bin/sh -c 'echo ~root && sleep 0'
<10.216.136.166> EXEC /bin/sh -c '( umask 77 && mkdir -p "` echo /root/.ansible/tmp `"&& mkdir "` echo /root/.ansible/tmp/ansible-tmp-1697653060.1215596-43087-114775584520537 `" && echo ansible-tmp-1697653060.1215596-43087-114775584520537="` echo /root/.ansible/tmp/ansible-tmp-1697653060.1215596-43087-114775584520537 `" ) && sleep 0'
<daltschuler-rde> Attempting python interpreter discovery
<10.216.136.166> EXEC /bin/sh -c 'echo PLATFORM; uname; echo FOUND; command -v '"'"'python3.11'"'"'; command -v '"'"'python3.10'"'"'; command -v '"'"'python3.9'"'"'; command -v '"'"'python3.8'"'"'; command -v '"'"'python3.7'"'"'; command -v '"'"'python3.6'"'"'; command -v '"'"'python3.5'"'"'; command -v '"'"'/usr/bin/python3'"'"'; command -v '"'"'/usr/libexec/platform-python'"'"'; command -v '"'"'python2.7'"'"'; command -v '"'"'/usr/bin/python'"'"'; command -v '"'"'python'"'"'; echo ENDFOUND && sleep 0'
<10.216.136.166> EXEC /bin/sh -c '/bin/python3.11 && sleep 0'
Using module file /usr/local/lib/python3.11/site-packages/ansible/modules/setup.py
<10.216.136.166> PUT /root/.ansible/tmp/ansible-local-43083ort_twuq/tmpesbuxcek TO /root/.ansible/tmp/ansible-tmp-1697653060.1215596-43087-114775584520537/AnsiballZ_setup.py
<10.216.136.166> EXEC /bin/sh -c 'chmod u+x /root/.ansible/tmp/ansible-tmp-1697653060.1215596-43087-114775584520537/ /root/.ansible/tmp/ansible-tmp-1697653060.1215596-43087-114775584520537/AnsiballZ_setup.py && sleep 0'
<10.216.136.166> EXEC /bin/sh -c '/usr/libexec/platform-python /root/.ansible/tmp/ansible-tmp-1697653060.1215596-43087-114775584520537/AnsiballZ_setup.py && sleep 0'
<10.216.136.166> EXEC /bin/sh -c 'rm -f -r /root/.ansible/tmp/ansible-tmp-1697653060.1215596-43087-114775584520537/ > /dev/null 2>&1 && sleep 0'

That 10.216.136.166 is the correct ip for the remote host.

But then it starts modifying the hostname of my deployment server daltschuler_ansible_deploy, not the limited host daltschuler-rde.

changed: [daltschuler-rde] => {
    "ansible_facts": {
        "ansible_domain": "ec2.internal",
        "ansible_fqdn": "IP-X-X-X-X.ec2.internal",
        "ansible_hostname": "daltschuler-rde",
        "ansible_nodename": "daltschuler-rde"
    },
    "changed": true,
    "diff": {
        "after": "hostname = daltschuler-rde\n",
        "before": "hostname = daltschuler_ansible_deploy\n"
    },
    "invocation": {
        "module_args": {
            "name": "daltschuler-rde",
            "use": null
        }
    },
    "name": "daltschuler-rde"
}

All of these same options work just fine when im targeting the host using ansible-playbook like so: ansible-playbook -i inventories/sandbox/hosts site.yaml -l daltschuler-rde

Any help would be appreciated!

daltschu22 avatar Oct 18 '23 18:10 daltschu22

Based on that output, you have connection: local or ansible_connection: local configured somewhere. It's properly limiting to the correct host, but ansible has been told to use the local connection plugin, which will just run the tasks locally.

sivel avatar Oct 18 '23 19:10 sivel

Is it possible ansible-runner is not parsing the inventory correctly then?

Because my inventory does indeed have that setting, but not on the grouping of host that im selecting.

Example:

my-hosts:
  children:
    cloud:
      hosts:
        daltschuler-rde:
          ansible_host: X.X.X.X
          ansible_become: true
          ansible_become_user: root
ansible_deploy_server:
  vars:
    ansible_connection: local
    ansible_python_interpreter: /usr/bin/python3.11
  hosts:
    daltschuler_ansible_deploy: {}

Im omitting some of the hosts, but you can see the 2 sections are distinct. This works just fine with ansible-playbook, it doesnt pick up the var in the second section.

Also my playbook says to use the first section specifically:

- name: Run the common role across all hosts in the inventory
  hosts: my-hosts
  roles:
    - common

Or am I misunderstanding how the inventory file structure works?

Thanks for the swift reply!

daltschu22 avatar Oct 18 '23 20:10 daltschu22

It's really hard to say without an actual reproducer than we can run, or look at in it's completeness.

sivel avatar Oct 18 '23 20:10 sivel

Im reading through this section of the documentation: https://docs.ansible.com/ansible/latest/inventory_guide/intro_inventory.html#how-variables-are-merged

If i'm reading this correctly, is it saying that the variables from my group ansible_deploy_server will be merged into the my-hosts group?

Is it possible thats whats going on? Or is this only valid if both groups contain the same variable? The only location that ansible_connection: local is in the ansible_deploy_server grouping, and thats exactly what it looks like in my file. But if thats the case, i'm still confused why it would work fine when running ansible-deploy separately.

daltschu22 avatar Oct 18 '23 20:10 daltschu22