diff --git a/changelogs/fragments/85556-fix-pip-changed.yml b/changelogs/fragments/85556-fix-pip-changed.yml new file mode 100644 index 00000000000..8d09a0db0b5 --- /dev/null +++ b/changelogs/fragments/85556-fix-pip-changed.yml @@ -0,0 +1,2 @@ +bugfixes: + - pip - Fix pip module output so that it returns changed when the only operation is initializing a venv. \ No newline at end of file diff --git a/lib/ansible/modules/pip.py b/lib/ansible/modules/pip.py index 20e6249b759..6af7e7afdeb 100644 --- a/lib/ansible/modules/pip.py +++ b/lib/ansible/modules/pip.py @@ -608,7 +608,7 @@ def setup_virtualenv(module, env, chdir, out, err): err += err_venv if rc != 0: _fail(module, cmd, out, err) - return out, err + return out, err, cmd class Package: @@ -741,11 +741,12 @@ def main(): err = '' out = '' + venv_cmd = '' if env: if not os.path.exists(os.path.join(env, 'bin', 'activate')): venv_created = True - out, err = setup_virtualenv(module, env, chdir, out, err) + out, err, venv_cmd = setup_virtualenv(module, env, chdir, out, err) py_bin = os.path.join(env, 'bin', 'python') else: py_bin = module.params['executable'] or sys.executable @@ -811,6 +812,11 @@ def main(): cmd.extend(to_native(p) for p in packages) elif requirements: cmd.extend(['-r', requirements]) + elif venv_created and not name and not requirements: + # ONLY creating an empty venv + module.exit_json(changed=venv_created, cmd=venv_cmd, name=name, version=version, + state=state, requirements=requirements, virtualenv=env, + stdout=out, stderr=err) else: module.warn("No valid name or requirements file found.") module.exit_json(changed=False) diff --git a/test/integration/targets/pip/tasks/pip.yml b/test/integration/targets/pip/tasks/pip.yml index 9bdb2f79485..a4c9b8d4f40 100644 --- a/test/integration/targets/pip/tasks/pip.yml +++ b/test/integration/targets/pip/tasks/pip.yml @@ -213,6 +213,35 @@ that: - "diff_case_check_mode is not changed" +- name: ensure is a fresh venv + file: + state: absent + name: "{{ remote_tmp_dir }}/emptyvenv" + +- name: create an empty venv + pip: + name: [] + virtualenv: "{{ remote_tmp_dir }}/emptyvenv" + register: empty_venv + +- name: check venv was created + file: + name: "{{ remote_tmp_dir }}/emptyvenv" + register: check_empty_venv_exists + +- name: try creating an empty venv so it isn't changed + pip: + name: [] + virtualenv: "{{ remote_tmp_dir }}/emptyvenv" + register: second_empty_venv + +- name: assert that the venv was created and has no packages + assert: + that: + - empty_venv.changed + - not check_empty_venv_exists.changed + - not second_empty_venv.changed + # ansible#23204 - name: ensure is a fresh virtualenv file: