Skip to content

Commit 04f7b7a

Browse files
authored
Merge pull request #1172 from moreati/issue1083-become_exe
ansible_mitogen: Support templated become_exe option
2 parents 06a82d3 + ec9b3e5 commit 04f7b7a

File tree

8 files changed

+36
-10
lines changed

8 files changed

+36
-10
lines changed

ansible_mitogen/transport_config.py

Lines changed: 23 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -419,7 +419,28 @@ def __init__(self, connection, play_context, transport, inventory_name):
419419

420420
def _become_option(self, name):
421421
plugin = self._connection.become
422-
return plugin.get_option(name, self._task_vars, self._play_context)
422+
try:
423+
return plugin.get_option(name, self._task_vars, self._play_context)
424+
except AttributeError:
425+
# A few ansible_mitogen connection plugins look more like become
426+
# plugins. They don't quite fit Ansible's plugin.get_option() API.
427+
# https://github.com/mitogen-hq/mitogen/issues/1173
428+
fallback_plugins = {'mitogen_doas', 'mitogen_sudo', 'mitogen_su'}
429+
if self._connection.transport not in fallback_plugins:
430+
raise
431+
432+
fallback_options = {
433+
'become_exe',
434+
}
435+
if name not in fallback_options:
436+
raise
437+
438+
LOG.info(
439+
'Used PlayContext fallback for plugin=%r, option=%r',
440+
self._connection, name,
441+
)
442+
return getattr(self._play_context, name)
443+
423444

424445
def _connection_option(self, name):
425446
try:
@@ -505,15 +526,7 @@ def ssh_args(self):
505526
]
506527

507528
def become_exe(self):
508-
# In Ansible 2.8, PlayContext.become_exe always has a default value due
509-
# to the new options mechanism. Previously it was only set if a value
510-
# ("somewhere") had been specified for the task.
511-
# For consistency in the tests, here we make older Ansibles behave like
512-
# newer Ansibles.
513-
exe = self._play_context.become_exe
514-
if exe is None and self._play_context.become_method == 'sudo':
515-
exe = 'sudo'
516-
return exe
529+
return self._become_option('become_exe')
517530

518531
def sudo_args(self):
519532
return [

docs/changelog.rst

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@ To avail of fixes in an unreleased version, please download a ZIP file
2121
In progress (unreleased)
2222
------------------------
2323

24+
* :gh:issue:`1083` :mod:`ansible_mitogen`: Templated become executable
25+
(e.g. ``become_exe``).
2426

2527

2628
v0.3.15 (2024-10-28)

tests/ansible/hosts/default.hosts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ ansible_host=localhost
3333
ansible_user="{{ lookup('pipe', 'whoami') }}"
3434

3535
[tt_become_by_inv]
36+
tt-become-exe ansible_become=true ansible_become_exe="{{ 'sudo' | trim }}" ansible_become_user=root
3637
tt-become-pass ansible_become=true ansible_become_pass="{{ 'pw_required_password' | trim }}" ansible_become_user=mitogen__pw_required
3738
tt-become-user ansible_become=true ansible_become_user="{{ 'root' | trim }}"
3839

tests/ansible/integration/become/templated_by_inv.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
- name: Templated become in inventory
1313
vars:
1414
expected_become_users:
15+
tt-become-exe: root
1516
tt-become-pass: mitogen__pw_required
1617
tt-become-user: root
1718
command:

tests/ansible/integration/become/templated_by_play_keywords.yml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
hosts: tt_become_bare
33
gather_facts: false
44
become: true
5+
become_exe: "{{ 'sudo' | trim }}"
56
become_user: "{{ 'root' | trim }}"
67
tasks:
78
- meta: reset_connection
@@ -20,6 +21,7 @@
2021
hosts: tt_become_bare
2122
gather_facts: false
2223
become: true
24+
become_exe: "{{ 'sudo' | trim }}"
2325
become_user: "{{ 'mitogen__pw_required' | trim }}"
2426
vars:
2527
ansible_become_pass: "{{ 'pw_required_password' | trim }}"

tests/ansible/integration/become/templated_by_play_vars.yml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
gather_facts: false
44
vars:
55
ansible_become: true
6+
ansible_become_exe: "{{ 'sudo' | trim }}"
67
ansible_become_user: "{{ 'root' | trim }}"
78
tasks:
89
- name: Templated become by play vars, no password
@@ -20,6 +21,7 @@
2021
gather_facts: false
2122
vars:
2223
ansible_become: true
24+
ansible_become_exe: "{{ 'sudo' | trim }}"
2325
ansible_become_pass: "{{ 'pw_required_password' | trim }}"
2426
ansible_become_user: "{{ 'mitogen__pw_required' | trim }}"
2527
tasks:

tests/ansible/integration/become/templated_by_task_keywords.yml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
# FIXME Resetting the connection shouldn't require credentials
55
# https://github.com/mitogen-hq/mitogen/issues/1132
66
become: true
7+
become_exe: "{{ 'sudo' | trim }}"
78
become_user: "{{ 'root' | trim }}"
89
tasks:
910
- name: Reset connection to target that will be delegate_to
@@ -15,6 +16,7 @@
1516
tasks:
1617
- name: Templated become by task keywords, with delegate_to
1718
become: true
19+
become_exe: "{{ 'sudo' | trim }}"
1820
become_user: "{{ 'root' | trim }}"
1921
delegate_to: "{{ groups.tt_become_bare[0] }}"
2022
command:
@@ -33,6 +35,7 @@
3335
# FIXME Resetting the connection shouldn't require credentials
3436
# https://github.com/mitogen-hq/mitogen/issues/1132
3537
become: true
38+
become_exe: "{{ 'sudo' | trim }}"
3639
become_user: "{{ 'mitogen__pw_required' | trim }}"
3740
vars:
3841
ansible_become_pass: "{{ 'pw_required_password' | trim }}"
@@ -52,6 +55,7 @@
5255

5356
- name: Templated become by task keywords, with delegate_to
5457
become: true
58+
become_exe: "{{ 'sudo' | trim }}"
5559
become_user: "{{ 'mitogen__pw_required' | trim }}"
5660
delegate_to: "{{ groups.tt_become_bare[0] }}"
5761
vars:

tests/ansible/templates/test-targets.j2

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@ ansible_python_interpreter={{ tt.python_path }}
5858
ansible_user=mitogen__has_sudo_nopw
5959

6060
[tt_become_by_inv]
61+
tt-become-exe ansible_become=true ansible_become_exe="{{ '{{' }} 'sudo' | trim {{ '}}' }}" ansible_become_user=root
6162
tt-become-pass ansible_become=true ansible_become_pass="{{ '{{' }} 'pw_required_password' | trim {{ '}}' }}" ansible_become_user=mitogen__pw_required
6263
tt-become-user ansible_become=true ansible_become_user="{{ '{{' }} 'root' | trim {{ '}}' }}"
6364

0 commit comments

Comments
 (0)