canonical / cloud-init

Official upstream for the cloud-init: cloud instance initialization
https://cloud-init.io/
Other
2.89k stars 861 forks source link

cc_ansible: install_method: pip cannot find ansible-pull command path #5720

Open blackboxsw opened 1 week ago

blackboxsw commented 1 week ago

Bug report

cloud-config user-data like the following will fail to configure ansible and install extensions due to inability to find the pip installed utilities such as ansible-pull or ansible galaxy.

#cloud-config

#cloud-config
...
ansible:
  ansible_config: /etc/ansible/ansible.cfg
  install_method: pip
  package_name: ansible-core
  galaxy:
    actions:
     - ["ansible-galaxy", "collection", "install", "community.grafana"]
  pull:
    url: "http://0.0.0.0:8000/"
    playbook_name: ubuntu.yml
    full: true

Steps to reproduce the problem

This error is easily reproducible in LXC with the following integration test:

CLOUD_INIT_KEEP_INSTANCE=1 CLOUD_INIT_OS_IMAGE=focal CLOUD_INIT_PLATFORM=lxd_vm tox -e integration-tests -- tests/integration_tests/modules/test_ansible.py::test_ansible_pull_pip

Environment details

cloud-init logs

2024-09-15 05:41:56,999 - subp.py[DEBUG]: ['/usr/bin/python3', '-m', 'pip', 'list'] took 0.3s to run
2024-09-15 05:41:56,999 - subp.py[DEBUG]: Running command ['ansible-galaxy', 'collection', 'install', 'community.grafana'] with allowed return codes [0] (shell=False, capture=True)
2024-09-15 05:41:57,002 - handlers.py[DEBUG]: finish: modules-final/config-ansible: FAIL: running config-ansible with frequency once-per-instance
2024-09-15 05:41:57,002 - util.py[WARNING]: Running module ansible (<module 'cloudinit.config.cc_ansible' from '/usr/lib/python3/dist-packages/cloudinit/config/cc_ansible.py'>) failed
2024-09-15 05:41:57,002 - util.py[DEBUG]: Running module ansible (<module 'cloudinit.config.cc_ansible' from '/usr/lib/python3/dist-packages/cloudinit/config/cc_ansible.py'>) failed
Traceback (most recent call last):
  File "/usr/lib/python3/dist-packages/cloudinit/subp.py", line 260, in subp
    sp = subprocess.Popen(
  File "/usr/lib/python3.8/subprocess.py", line 858, in __init__
    self._execute_child(args, executable, preexec_fn, close_fds,
  File "/usr/lib/python3.8/subprocess.py", line 1704, in _execute_child
    raise child_exception_type(errno_num, err_msg, err_filename)
FileNotFoundError: [Errno 2] No such file or directory: b'ansible-galaxy'

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "/usr/lib/python3/dist-packages/cloudinit/config/modules.py", line 286, in _run_modules
    ran, _r = cc.run(
  File "/usr/lib/python3/dist-packages/cloudinit/cloud.py", line 60, in run
    return self._runners.run(name, functor, args, freq, clear_on_fail)
  File "/usr/lib/python3/dist-packages/cloudinit/helpers.py", line 156, in run
    results = functor(**args)
  File "/usr/lib/python3/dist-packages/cloudinit/config/cc_ansible.py", line 162, in handle
    ansible_galaxy(galaxy_cfg, ansible)
  File "/usr/lib/python3/dist-packages/cloudinit/config/cc_ansible.py", line 238, in ansible_galaxy
    ansible.do_as(command)
  File "/usr/lib/python3/dist-packages/cloudinit/config/cc_ansible.py", line 62, in do_as
    return self.subp(command, **kwargs)
  File "/usr/lib/python3/dist-packages/cloudinit/config/cc_ansible.py", line 66, in subp
    return subp.subp(command, update_env=self.env, **kwargs)
  File "/usr/lib/python3/dist-packages/cloudinit/subp.py", line 278, in subp
    raise ProcessExecutionError(
cloudinit.subp.ProcessExecutionError: Unexpected error while running command.
Command: ['ansible-galaxy', 'collection', 'install', 'community.grafana']
Exit code: -
Reason: [Errno 2] No such file or directory: b'ansible-galaxy'
Stdout: -
Stderr: -