Compare commits

...

4 commits

Author SHA1 Message Date
Mark Asbach
f120760e08
Merge 230e5f2a98 into 542643e786 2023-08-04 23:22:48 +01:00
softwarefactory-project-zuul[bot]
542643e786
Merge pull request #487 from saito-hideki/pr/ci_remove_freebsd12
Drop OSX10.11 and FreeBSD12.4 from CI

SUMMARY
Drop OSX-10.11 and FreeBSD12.4 from CI

Fixes #476
Fixes #486
Drop OSX10.11 from ansible:2.9 and ansible-core:2.10
Drop FreeBSD12.4 from ansible-core:devel

ISSUE TYPE

CI Tests Pull Request

COMPONENT NAME

ansible.posix

ADDITIONAL INFORMATION
None
2023-08-02 08:29:22 +00:00
Hideki Saito
2cde4cdb26 Drop OSX10.11 and FreeBSD12.4 from CI
- Fixes #476
- Fixes #486
- Drop OSX10.11 from ansible:2.9 and ansible-core:2.10
- Drop FreeBSD12.4 from ansible-core:devel

Signed-off-by: Hideki Saito <saito@fgrep.org>

test
2023-08-02 16:03:19 +09:00
Mark Asbach
230e5f2a98 allowing synchronize to elevate permissions when sudo requires password entry - implements #334 2022-03-13 00:29:22 +01:00
6 changed files with 35 additions and 12 deletions

View file

@ -36,7 +36,7 @@ variables:
resources: resources:
containers: containers:
- container: default - container: default
image: quay.io/ansible/azure-pipelines-test-container:3.0.0 image: quay.io/ansible/azure-pipelines-test-container:4.0.1
pool: Standard pool: Standard
@ -217,8 +217,6 @@ stages:
test: rhel/8.8 test: rhel/8.8
- name: RHEL 9.2 - name: RHEL 9.2
test: rhel/9.2 test: rhel/9.2
- name: FreeBSD 12.4
test: freebsd/12.4
- name: FreeBSD 13.2 - name: FreeBSD 13.2
test: freebsd/13.2 test: freebsd/13.2
- stage: Remote_2_15 - stage: Remote_2_15
@ -317,8 +315,6 @@ stages:
parameters: parameters:
testFormat: 2.10/{0}/1 testFormat: 2.10/{0}/1
targets: targets:
- name: OS X 10.11
test: osx/10.11
- name: RHEL 7.9 - name: RHEL 7.9
test: rhel/7.9 test: rhel/7.9
- name: RHEL 8.2 - name: RHEL 8.2
@ -331,8 +327,6 @@ stages:
parameters: parameters:
testFormat: 2.9/{0}/1 testFormat: 2.9/{0}/1
targets: targets:
- name: OS X 10.11
test: osx/10.11
- name: RHEL 7.9 - name: RHEL 7.9
test: rhel/7.9 test: rhel/7.9
- name: RHEL 8.1 - name: RHEL 8.1

View file

@ -0,0 +1,3 @@
---
minor_changes:
- synchronize - elevating privileges now works even when `sudo` requires entering the `become_pass`

View file

@ -0,0 +1,3 @@
---
trivial:
- "Drop FreeBSD12.4 from CI for ansible-core:devel(https://github.com/ansible-collections/ansible.posix/issues/486)."

View file

@ -580,7 +580,7 @@ Notes
- The user and permissions for the synchronize `dest` are those of the `remote_user` on the destination host or the `become_user` if `become=yes` is active. - The user and permissions for the synchronize `dest` are those of the `remote_user` on the destination host or the `become_user` if `become=yes` is active.
- In Ansible 2.0 a bug in the synchronize module made become occur on the "local host". This was fixed in Ansible 2.0.1. - In Ansible 2.0 a bug in the synchronize module made become occur on the "local host". This was fixed in Ansible 2.0.1.
- Currently, synchronize is limited to elevating permissions via passwordless sudo. This is because rsync itself is connecting to the remote machine and rsync doesn't give us a way to pass sudo credentials in. - Currently, synchronize is limited to elevating permissions via sudo. This now even works when password entry is required.
- Currently there are only a few connection types which support synchronize (ssh, paramiko, local, and docker) because a sync strategy has been determined for those connection types. Note that the connection for these must not need a password as rsync itself is making the connection and rsync does not provide us a way to pass a password to the connection. - Currently there are only a few connection types which support synchronize (ssh, paramiko, local, and docker) because a sync strategy has been determined for those connection types. Note that the connection for these must not need a password as rsync itself is making the connection and rsync does not provide us a way to pass a password to the connection.
- Expect that dest=~/x will be ~<remote_user>/x even if using sudo. - Expect that dest=~/x will be ~<remote_user>/x even if using sudo.
- Inspect the verbose output to validate the destination user/host/path are what was expected. - Inspect the verbose output to validate the destination user/host/path are what was expected.

View file

@ -390,10 +390,24 @@ class ActionModule(ActionBase):
# If no rsync_path is set, become was originally set, and dest is # If no rsync_path is set, become was originally set, and dest is
# remote then add privilege escalation here. # remote then add privilege escalation here.
if self._play_context.become_method == 'sudo': if self._play_context.become_method == 'sudo':
if self._play_context.become_user:
rsync_path = 'sudo -u %s rsync' % self._play_context.become_user # if become is set, we can either rely on passwordless sudo or pass the password
if self._play_context.become_pass is None:
rsync_path = 'sudo '
else: else:
rsync_path = 'sudo rsync' # pass the become password using the environment so that the synchronize module
# can wrap ssh on the host with a shell script that injects the password into
# stdin, allowing for `sudo -S` on the target machine to retrieve the password
if hasattr(self._task, 'environment'):
self._task.environment = []
self._task.environment.append({'BECOME_PASS': self._play_context.become_pass})
_tmp_args['_ssh_wrapper'] = True
rsync_path = 'sudo -S '
if self._play_context.become_user:
rsync_path += '-u %s rsync' % self._play_context.become_user
else:
rsync_path += 'rsync'
# TODO: have to add in the rest of the become methods here # TODO: have to add in the rest of the become methods here
# We cannot use privilege escalation on the machine running the # We cannot use privilege escalation on the machine running the

View file

@ -198,7 +198,7 @@ notes:
delegate_to host when delegate_to is used). delegate_to host when delegate_to is used).
- The user and permissions for the synchronize `dest` are those of the `remote_user` on the destination host or the `become_user` if `become=yes` is active. - The user and permissions for the synchronize `dest` are those of the `remote_user` on the destination host or the `become_user` if `become=yes` is active.
- In Ansible 2.0 a bug in the synchronize module made become occur on the "local host". This was fixed in Ansible 2.0.1. - In Ansible 2.0 a bug in the synchronize module made become occur on the "local host". This was fixed in Ansible 2.0.1.
- Currently, synchronize is limited to elevating permissions via passwordless sudo. This is because rsync itself is connecting to the remote machine - Currently, synchronize is limited to elevating permissions via sudo. This now even works when password entry is required.
and rsync doesn't give us a way to pass sudo credentials in. and rsync doesn't give us a way to pass sudo credentials in.
- Currently there are only a few connection types which support synchronize (ssh, paramiko, local, and docker) because a sync strategy has been - Currently there are only a few connection types which support synchronize (ssh, paramiko, local, and docker) because a sync strategy has been
determined for those connection types. Note that the connection for these must not need a password as rsync itself is making the connection and determined for those connection types. Note that the connection for these must not need a password as rsync itself is making the connection and
@ -414,6 +414,7 @@ def main():
rsync_opts=dict(type='list', default=[], elements='str'), rsync_opts=dict(type='list', default=[], elements='str'),
ssh_args=dict(type='str'), ssh_args=dict(type='str'),
ssh_connection_multiplexing=dict(type='bool', default=False), ssh_connection_multiplexing=dict(type='bool', default=False),
_ssh_wrapper=dict(type='bool', default=False),
partial=dict(type='bool', default=False), partial=dict(type='bool', default=False),
verify_host=dict(type='bool', default=False), verify_host=dict(type='bool', default=False),
delay_updates=dict(type='bool', default=True), delay_updates=dict(type='bool', default=True),
@ -456,6 +457,7 @@ def main():
rsync_opts = module.params['rsync_opts'] rsync_opts = module.params['rsync_opts']
ssh_args = module.params['ssh_args'] ssh_args = module.params['ssh_args']
ssh_connection_multiplexing = module.params['ssh_connection_multiplexing'] ssh_connection_multiplexing = module.params['ssh_connection_multiplexing']
ssh_wrapper = module.params['_ssh_wrapper']
verify_host = module.params['verify_host'] verify_host = module.params['verify_host']
link_dest = module.params['link_dest'] link_dest = module.params['link_dest']
delay_updates = module.params['delay_updates'] delay_updates = module.params['delay_updates']
@ -550,6 +552,13 @@ def main():
ssh_cmd_str = ' '.join(shlex_quote(arg) for arg in ssh_cmd) ssh_cmd_str = ' '.join(shlex_quote(arg) for arg in ssh_cmd)
if ssh_args: if ssh_args:
ssh_cmd_str += ' %s' % ssh_args ssh_cmd_str += ' %s' % ssh_args
# When `become: yes` is set but the account on the target requires a password for sudo, we have to supply
# it from the host side by wrapping the remote shell and inserting the password into stdin.
# In the ActionPlugin, the password is assigned to the BECOME_PASS environment variable, so we will not have
# to make it visible if anyone logs the command issued by ansible.
# Adapted from https://askubuntu.com/a/1263657
if ssh_wrapper:
ssh_cmd_str = '/bin/sh -c "{ echo $BECOME_PASS; cat - ; } | ' + ssh_cmd_str + ' $0 $* &"'
cmd.append('--rsh=%s' % shlex_quote(ssh_cmd_str)) cmd.append('--rsh=%s' % shlex_quote(ssh_cmd_str))
if rsync_path: if rsync_path: