mirror of
https://github.com/ansible-collections/ansible.posix.git
synced 2026-05-13 04:52:07 +00:00
Compare commits
21 Commits
3be32a713b
...
1.6.2
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
31376a3ee6 | ||
|
|
9d59f62974 | ||
|
|
3fcaa30290 | ||
|
|
73f7519133 | ||
|
|
31559441dc | ||
|
|
6c3892c01b | ||
|
|
5717de0974 | ||
|
|
e270777b8d | ||
|
|
098b5bee70 | ||
|
|
3a085b0b10 | ||
|
|
cd43bd10bb | ||
|
|
9cf2d8cc48 | ||
|
|
2041e7f918 | ||
|
|
f4baa4c6d8 | ||
|
|
afa724ba8a | ||
|
|
0821768bcb | ||
|
|
5f3f8514eb | ||
|
|
5321a9ecb5 | ||
|
|
7194b6bb13 | ||
|
|
a85108e25e | ||
|
|
c353e43a90 |
@@ -57,6 +57,21 @@ stages:
|
|||||||
test: units
|
test: units
|
||||||
- name: Lint
|
- name: Lint
|
||||||
test: lint
|
test: lint
|
||||||
|
- stage: Sanity_2_18
|
||||||
|
displayName: Ansible 2.18 sanity
|
||||||
|
dependsOn: []
|
||||||
|
jobs:
|
||||||
|
- template: templates/matrix.yml
|
||||||
|
parameters:
|
||||||
|
nameFormat: "{0}"
|
||||||
|
testFormat: 2.18/{0}
|
||||||
|
targets:
|
||||||
|
- name: Sanity
|
||||||
|
test: sanity
|
||||||
|
- name: Units
|
||||||
|
test: units
|
||||||
|
- name: Lint
|
||||||
|
test: lint
|
||||||
- stage: Sanity_2_17
|
- stage: Sanity_2_17
|
||||||
displayName: Ansible 2.17 sanity
|
displayName: Ansible 2.17 sanity
|
||||||
dependsOn: []
|
dependsOn: []
|
||||||
@@ -113,6 +128,20 @@ stages:
|
|||||||
test: ubuntu2204
|
test: ubuntu2204
|
||||||
- name: Ubuntu 24.04
|
- name: Ubuntu 24.04
|
||||||
test: ubuntu2404
|
test: ubuntu2404
|
||||||
|
- stage: Docker_2_18
|
||||||
|
displayName: Docker devel
|
||||||
|
dependsOn: []
|
||||||
|
jobs:
|
||||||
|
- template: templates/matrix.yml
|
||||||
|
parameters:
|
||||||
|
testFormat: 2.18/linux/{0}/1
|
||||||
|
targets:
|
||||||
|
- name: Fedora 40
|
||||||
|
test: fedora40
|
||||||
|
- name: Ubuntu 22.04
|
||||||
|
test: ubuntu2204
|
||||||
|
- name: Ubuntu 24.04
|
||||||
|
test: ubuntu2404
|
||||||
- stage: Docker_2_17
|
- stage: Docker_2_17
|
||||||
displayName: Docker 2.17
|
displayName: Docker 2.17
|
||||||
dependsOn: []
|
dependsOn: []
|
||||||
@@ -176,6 +205,18 @@ stages:
|
|||||||
test: rhel/9.4
|
test: rhel/9.4
|
||||||
- name: FreeBSD 13.3
|
- name: FreeBSD 13.3
|
||||||
test: freebsd/13.3
|
test: freebsd/13.3
|
||||||
|
- stage: Remote_2_18
|
||||||
|
displayName: Remote devel
|
||||||
|
dependsOn: []
|
||||||
|
jobs:
|
||||||
|
- template: templates/matrix.yml
|
||||||
|
parameters:
|
||||||
|
testFormat: 2.18/{0}/1
|
||||||
|
targets:
|
||||||
|
- name: RHEL 9.4
|
||||||
|
test: rhel/9.4
|
||||||
|
- name: FreeBSD 13.3
|
||||||
|
test: freebsd/13.3
|
||||||
- stage: Remote_2_17
|
- stage: Remote_2_17
|
||||||
displayName: Remote 2.17
|
displayName: Remote 2.17
|
||||||
dependsOn: []
|
dependsOn: []
|
||||||
@@ -234,8 +275,11 @@ stages:
|
|||||||
- Sanity_2_17
|
- Sanity_2_17
|
||||||
- Remote_2_17
|
- Remote_2_17
|
||||||
- Docker_2_17
|
- Docker_2_17
|
||||||
|
- Sanity_2_18
|
||||||
|
- Remote_2_18
|
||||||
|
- Docker_2_18
|
||||||
- Sanity_devel
|
- Sanity_devel
|
||||||
- Remote_devel
|
# - Remote_devel # Wait for test environment release
|
||||||
- Docker_devel
|
# - Docker_devel # Wait for test environment release
|
||||||
jobs:
|
jobs:
|
||||||
- template: templates/coverage.yml
|
- template: templates/coverage.yml
|
||||||
|
|||||||
1
.github/BOTMETA.yml
vendored
1
.github/BOTMETA.yml
vendored
@@ -40,6 +40,7 @@ files:
|
|||||||
labels: debug
|
labels: debug
|
||||||
$plugins/patch.py:
|
$plugins/patch.py:
|
||||||
labels: patch
|
labels: patch
|
||||||
|
$plugins/skippy.py:
|
||||||
$plugins/synchronize.py:
|
$plugins/synchronize.py:
|
||||||
labels: synchronize
|
labels: synchronize
|
||||||
$plugins/timer.py:
|
$plugins/timer.py:
|
||||||
|
|||||||
@@ -4,6 +4,39 @@ ansible.posix Release Notes
|
|||||||
|
|
||||||
.. contents:: Topics
|
.. contents:: Topics
|
||||||
|
|
||||||
|
v1.6.2
|
||||||
|
======
|
||||||
|
|
||||||
|
Release Summary
|
||||||
|
---------------
|
||||||
|
|
||||||
|
This is the bugfix release of the stable version ``ansible.posix`` collection.
|
||||||
|
This changelog contains all changes to the modules and plugins
|
||||||
|
in this collection that have been added after the release of
|
||||||
|
``ansible.posix`` 1.6.1.
|
||||||
|
|
||||||
|
Bugfixes
|
||||||
|
--------
|
||||||
|
|
||||||
|
- backport - Drop ansible-core 2.14 and set 2.15 minimum version (https://github.com/ansible-collections/ansible.posix/issues/578).
|
||||||
|
|
||||||
|
v1.6.1
|
||||||
|
======
|
||||||
|
|
||||||
|
Release Summary
|
||||||
|
---------------
|
||||||
|
|
||||||
|
This is the bugfix release of the stable version ``ansible.posix`` collection.
|
||||||
|
This changelog contains all changes to the modules and plugins
|
||||||
|
in this collection that have been added after the release of
|
||||||
|
``ansible.posix`` 1.6.1.
|
||||||
|
|
||||||
|
Bugfixes
|
||||||
|
--------
|
||||||
|
|
||||||
|
- acl - Fixed to set ACLs on paths mounted with NFS version 4 correctly (https://github.com/ansible-collections/ansible.posix/issues/240).
|
||||||
|
- mount - Handle ``boot`` option on Linux, NetBSD and OpenBSD correctly (https://github.com/ansible-collections/ansible.posix/issues/364).
|
||||||
|
- skippy - Revert removal of skippy plugin. It will be removed in version 2.0.0 (https://github.com/ansible-collections/ansible.posix/issues/573).
|
||||||
|
|
||||||
v1.6.0
|
v1.6.0
|
||||||
======
|
======
|
||||||
|
|||||||
@@ -74,11 +74,14 @@ None
|
|||||||
|
|
||||||
<!-- List the versions of Ansible the collection has been tested with. Must match what is in galaxy.yml. -->
|
<!-- List the versions of Ansible the collection has been tested with. Must match what is in galaxy.yml. -->
|
||||||
|
|
||||||
- ansible-core 2.18 (devel)
|
- ansible-core 2.19 (devel)
|
||||||
|
- ansible-core 2.18 (stable) *
|
||||||
- ansible-core 2.17 (stable)
|
- ansible-core 2.17 (stable)
|
||||||
- ansible-core 2.16 (stable)
|
- ansible-core 2.16 (stable)
|
||||||
- ansible-core 2.15 (stable)
|
- ansible-core 2.15 (stable)
|
||||||
|
|
||||||
|
*Note: For ansible-core 2.18, CI only covers sanity tests and no integration tests will be run until the test environment is released.*
|
||||||
|
|
||||||
## Roadmap
|
## Roadmap
|
||||||
|
|
||||||
<!-- Optional. Include the roadmap for this collection, and the proposed release/versioning strategy so users can anticipate the upgrade/update cycle. -->
|
<!-- Optional. Include the roadmap for this collection, and the proposed release/versioning strategy so users can anticipate the upgrade/update cycle. -->
|
||||||
|
|||||||
@@ -405,3 +405,43 @@ releases:
|
|||||||
- dropping-ansible29.yml
|
- dropping-ansible29.yml
|
||||||
- test-reqs.yml
|
- test-reqs.yml
|
||||||
release_date: '2024-09-11'
|
release_date: '2024-09-11'
|
||||||
|
1.6.1:
|
||||||
|
changes:
|
||||||
|
bugfixes:
|
||||||
|
- acl - Fixed to set ACLs on paths mounted with NFS version 4 correctly (https://github.com/ansible-collections/ansible.posix/issues/240).
|
||||||
|
- mount - Handle ``boot`` option on Linux, NetBSD and OpenBSD correctly (https://github.com/ansible-collections/ansible.posix/issues/364).
|
||||||
|
- skippy - Revert removal of skippy plugin. It will be removed in version 2.0.0
|
||||||
|
(https://github.com/ansible-collections/ansible.posix/issues/573).
|
||||||
|
release_summary: 'This is the bugfix release of the stable version ``ansible.posix``
|
||||||
|
collection.
|
||||||
|
|
||||||
|
This changelog contains all changes to the modules and plugins
|
||||||
|
|
||||||
|
in this collection that have been added after the release of
|
||||||
|
|
||||||
|
``ansible.posix`` 1.6.1.'
|
||||||
|
fragments:
|
||||||
|
- 1.6.1.yml
|
||||||
|
- 365-boot-linux.yml
|
||||||
|
- 566_bump_version_161.yml
|
||||||
|
- 567_remove_version_added.yml
|
||||||
|
- 570_nfs4_acl.yml
|
||||||
|
- 571_ci_bump_core_version.yml
|
||||||
|
- 572_revert_removal_of_skippy.yml
|
||||||
|
release_date: '2024-10-11'
|
||||||
|
1.6.2:
|
||||||
|
changes:
|
||||||
|
bugfixes:
|
||||||
|
- backport - Drop ansible-core 2.14 and set 2.15 minimum version (https://github.com/ansible-collections/ansible.posix/issues/578).
|
||||||
|
release_summary: 'This is the bugfix release of the stable version ``ansible.posix``
|
||||||
|
collection.
|
||||||
|
|
||||||
|
This changelog contains all changes to the modules and plugins
|
||||||
|
|
||||||
|
in this collection that have been added after the release of
|
||||||
|
|
||||||
|
``ansible.posix`` 1.6.1.'
|
||||||
|
fragments:
|
||||||
|
- 1.6.2.yml
|
||||||
|
- 580_drop_ansible214.yml
|
||||||
|
release_date: '2024-10-22'
|
||||||
|
|||||||
@@ -1,2 +0,0 @@
|
|||||||
minor_changes:
|
|
||||||
- synchronize - add the ``quiet`` option to suppress non-error messages (https://github.com/ansible-collections/ansible.posix/issues/171).
|
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
---
|
|
||||||
trivial:
|
|
||||||
- Bump version to 1.6.1 for next release.
|
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
---
|
|
||||||
trivial:
|
|
||||||
- mount - remove wrong version_added section from ``opts_no_log``.
|
|
||||||
@@ -1,7 +1,7 @@
|
|||||||
---
|
---
|
||||||
namespace: ansible
|
namespace: ansible
|
||||||
name: posix
|
name: posix
|
||||||
version: 1.6.1
|
version: 1.6.2
|
||||||
readme: README.md
|
readme: README.md
|
||||||
authors:
|
authors:
|
||||||
- Ansible (github.com/ansible)
|
- Ansible (github.com/ansible)
|
||||||
|
|||||||
@@ -1,2 +1,8 @@
|
|||||||
---
|
---
|
||||||
requires_ansible: ">=2.15.0"
|
requires_ansible: ">=2.15.0"
|
||||||
|
plugin_routing:
|
||||||
|
callback:
|
||||||
|
skippy:
|
||||||
|
deprecation:
|
||||||
|
removal_date: "2024-12-05"
|
||||||
|
warning_text: See the plugin documentation for more details
|
||||||
|
|||||||
43
plugins/callback/skippy.py
Normal file
43
plugins/callback/skippy.py
Normal file
@@ -0,0 +1,43 @@
|
|||||||
|
# (c) 2012-2014, Michael DeHaan <michael.dehaan@gmail.com>
|
||||||
|
# (c) 2017 Ansible Project
|
||||||
|
# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)
|
||||||
|
|
||||||
|
# Make coding more python3-ish
|
||||||
|
from __future__ import (absolute_import, division, print_function)
|
||||||
|
__metaclass__ = type
|
||||||
|
|
||||||
|
DOCUMENTATION = '''
|
||||||
|
name: skippy
|
||||||
|
type: stdout
|
||||||
|
requirements:
|
||||||
|
- set as main display callback
|
||||||
|
short_description: Ansible screen output that ignores skipped status
|
||||||
|
deprecated:
|
||||||
|
why: The 'default' callback plugin now supports this functionality
|
||||||
|
removed_at_date: '2024-12-05'
|
||||||
|
alternative: "'default' callback plugin with 'display_skipped_hosts = no' option"
|
||||||
|
extends_documentation_fragment:
|
||||||
|
- default_callback
|
||||||
|
description:
|
||||||
|
- This callback does the same as the default except it does not output skipped host/task/item status
|
||||||
|
'''
|
||||||
|
|
||||||
|
from ansible.plugins.callback.default import CallbackModule as CallbackModule_default
|
||||||
|
|
||||||
|
|
||||||
|
class CallbackModule(CallbackModule_default):
|
||||||
|
|
||||||
|
'''
|
||||||
|
This is the default callback interface, which simply prints messages
|
||||||
|
to stdout when new callback events are received.
|
||||||
|
'''
|
||||||
|
|
||||||
|
CALLBACK_VERSION = 2.0
|
||||||
|
CALLBACK_TYPE = 'stdout'
|
||||||
|
CALLBACK_NAME = 'ansible.posix.skippy'
|
||||||
|
|
||||||
|
def v2_runner_on_skipped(self, result):
|
||||||
|
pass
|
||||||
|
|
||||||
|
def v2_runner_item_on_skipped(self, result):
|
||||||
|
pass
|
||||||
@@ -75,6 +75,10 @@ options:
|
|||||||
use_nfsv4_acls:
|
use_nfsv4_acls:
|
||||||
description:
|
description:
|
||||||
- Use NFSv4 ACLs instead of POSIX ACLs.
|
- Use NFSv4 ACLs instead of POSIX ACLs.
|
||||||
|
- This feature uses C(nfs4_setfacl) and C(nfs4_getfacl). The behavior depends on those implementation.
|
||||||
|
And currently it only supports C(A) in ACE, so C(D) must be replaced with the appropriate C(A).
|
||||||
|
- Permission is set as optimised ACLs by the system. You can check the actual ACLs that has been set using the return value.
|
||||||
|
- More info C(man nfs4_setfacl)
|
||||||
type: bool
|
type: bool
|
||||||
default: false
|
default: false
|
||||||
recalculate_mask:
|
recalculate_mask:
|
||||||
@@ -179,7 +183,7 @@ def split_entry(entry):
|
|||||||
def build_entry(etype, entity, permissions=None, use_nfsv4_acls=False):
|
def build_entry(etype, entity, permissions=None, use_nfsv4_acls=False):
|
||||||
'''Builds and returns an entry string. Does not include the permissions bit if they are not provided.'''
|
'''Builds and returns an entry string. Does not include the permissions bit if they are not provided.'''
|
||||||
if use_nfsv4_acls:
|
if use_nfsv4_acls:
|
||||||
return ':'.join([etype, entity, permissions, 'allow'])
|
return ':'.join(['A', 'g' if etype == 'group' else '', entity, permissions + 'tcy'])
|
||||||
|
|
||||||
if permissions:
|
if permissions:
|
||||||
return etype + ':' + entity + ':' + permissions
|
return etype + ':' + entity + ':' + permissions
|
||||||
@@ -187,22 +191,27 @@ def build_entry(etype, entity, permissions=None, use_nfsv4_acls=False):
|
|||||||
return etype + ':' + entity
|
return etype + ':' + entity
|
||||||
|
|
||||||
|
|
||||||
def build_command(module, mode, path, follow, default, recursive, recalculate_mask, entry=''):
|
def build_command(module, mode, path, follow, default, recursive, recalculate_mask, use_nfsv4_acls, entry=''):
|
||||||
'''Builds and returns a getfacl/setfacl command.'''
|
'''Builds and returns a getfacl/setfacl command.'''
|
||||||
if mode == 'set':
|
if mode == 'set':
|
||||||
cmd = [module.get_bin_path('setfacl', True)]
|
cmd = [module.get_bin_path('nfs4_setfacl' if use_nfsv4_acls else 'setfacl', True)]
|
||||||
cmd.extend(['-m', entry])
|
cmd.extend(['-a' if use_nfsv4_acls else '-m', entry])
|
||||||
elif mode == 'rm':
|
elif mode == 'rm':
|
||||||
cmd = [module.get_bin_path('setfacl', True)]
|
cmd = [module.get_bin_path('nfs4_setfacl' if use_nfsv4_acls else 'setfacl', True)]
|
||||||
cmd.extend(['-x', entry])
|
cmd.extend(['-x', entry])
|
||||||
else: # mode == 'get'
|
else: # mode == 'get'
|
||||||
cmd = [module.get_bin_path('getfacl', True)]
|
cmd = [module.get_bin_path('getfacl', True)]
|
||||||
# prevents absolute path warnings and removes headers
|
# prevents absolute path warnings and removes headers
|
||||||
if platform.system().lower() == 'linux':
|
if platform.system().lower() == 'linux':
|
||||||
|
if use_nfsv4_acls:
|
||||||
|
# use nfs4_getfacl instead of getfacl if use_nfsv4_acls is True
|
||||||
|
cmd = [module.get_bin_path('nfs4_getfacl', True)]
|
||||||
|
else:
|
||||||
|
cmd = [module.get_bin_path('getfacl', True)]
|
||||||
|
cmd.append('--absolute-names')
|
||||||
cmd.append('--omit-header')
|
cmd.append('--omit-header')
|
||||||
cmd.append('--absolute-names')
|
|
||||||
|
|
||||||
if recursive:
|
if recursive and not use_nfsv4_acls:
|
||||||
cmd.append('--recursive')
|
cmd.append('--recursive')
|
||||||
|
|
||||||
if recalculate_mask == 'mask' and mode in ['set', 'rm']:
|
if recalculate_mask == 'mask' and mode in ['set', 'rm']:
|
||||||
@@ -210,7 +219,7 @@ def build_command(module, mode, path, follow, default, recursive, recalculate_ma
|
|||||||
elif recalculate_mask == 'no_mask' and mode in ['set', 'rm']:
|
elif recalculate_mask == 'no_mask' and mode in ['set', 'rm']:
|
||||||
cmd.append('--no-mask')
|
cmd.append('--no-mask')
|
||||||
|
|
||||||
if not follow:
|
if not follow and not use_nfsv4_acls:
|
||||||
if platform.system().lower() == 'linux':
|
if platform.system().lower() == 'linux':
|
||||||
cmd.append('--physical')
|
cmd.append('--physical')
|
||||||
elif platform.system().lower() == 'freebsd':
|
elif platform.system().lower() == 'freebsd':
|
||||||
@@ -223,24 +232,34 @@ def build_command(module, mode, path, follow, default, recursive, recalculate_ma
|
|||||||
return cmd
|
return cmd
|
||||||
|
|
||||||
|
|
||||||
def acl_changed(module, cmd):
|
def acl_changed(module, cmd, entry, use_nfsv4_acls=False):
|
||||||
'''Returns true if the provided command affects the existing ACLs, false otherwise.'''
|
'''Returns true if the provided command affects the existing ACLs, false otherwise.'''
|
||||||
# FreeBSD do not have a --test flag, so by default, it is safer to always say "true"
|
# To check the ACL changes, use the output of setfacl or nfs4_setfacl with '--test'.
|
||||||
|
# FreeBSD do not have a --test flag, so by default, it is safer to always say "true".
|
||||||
if platform.system().lower() == 'freebsd':
|
if platform.system().lower() == 'freebsd':
|
||||||
return True
|
return True
|
||||||
|
|
||||||
cmd = cmd[:] # lists are mutables so cmd would be overwritten without this
|
cmd = cmd[:] # lists are mutables so cmd would be overwritten without this
|
||||||
cmd.insert(1, '--test')
|
cmd.insert(1, '--test')
|
||||||
lines = run_acl(module, cmd)
|
lines = run_acl(module, cmd)
|
||||||
|
counter = 0
|
||||||
for line in lines:
|
for line in lines:
|
||||||
if not line.endswith('*,*'):
|
if line.endswith('*,*') and not use_nfsv4_acls:
|
||||||
return True
|
return False
|
||||||
return False
|
# if use_nfsv4_acls and entry is listed
|
||||||
|
if use_nfsv4_acls and entry == line:
|
||||||
|
counter += 1
|
||||||
|
|
||||||
|
# The current 'nfs4_setfacl --test' lists a new entry,
|
||||||
|
# which will be added at the top of list, followed by the existing entries.
|
||||||
|
# So if the entry has already been registered, the entry should be find twice.
|
||||||
|
if counter == 2:
|
||||||
|
return False
|
||||||
|
return True
|
||||||
|
|
||||||
|
|
||||||
def run_acl(module, cmd, check_rc=True):
|
def run_acl(module, cmd, check_rc=True):
|
||||||
|
'''Runs the provided command and returns the output as a list of lines.'''
|
||||||
try:
|
try:
|
||||||
(rc, out, err) = module.run_command(cmd, check_rc=check_rc)
|
(rc, out, err) = module.run_command(cmd, check_rc=check_rc)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
@@ -313,7 +332,7 @@ def main():
|
|||||||
module.fail_json(msg="'recalculate_mask' MUST NOT be set to 'mask' or 'no_mask' when 'state=query'.")
|
module.fail_json(msg="'recalculate_mask' MUST NOT be set to 'mask' or 'no_mask' when 'state=query'.")
|
||||||
|
|
||||||
if not entry:
|
if not entry:
|
||||||
if state == 'absent' and permissions:
|
if state == 'absent' and permissions and not use_nfsv4_acls:
|
||||||
module.fail_json(msg="'permissions' MUST NOT be set when 'state=absent'.")
|
module.fail_json(msg="'permissions' MUST NOT be set when 'state=absent'.")
|
||||||
|
|
||||||
if state == 'absent' and not entity:
|
if state == 'absent' and not entity:
|
||||||
@@ -350,21 +369,24 @@ def main():
|
|||||||
entry = build_entry(etype, entity, permissions, use_nfsv4_acls)
|
entry = build_entry(etype, entity, permissions, use_nfsv4_acls)
|
||||||
command = build_command(
|
command = build_command(
|
||||||
module, 'set', path, follow,
|
module, 'set', path, follow,
|
||||||
default, recursive, recalculate_mask, entry
|
default, recursive, recalculate_mask, use_nfsv4_acls, entry
|
||||||
)
|
)
|
||||||
changed = acl_changed(module, command)
|
changed = acl_changed(module, command, entry, use_nfsv4_acls)
|
||||||
|
|
||||||
if changed and not module.check_mode:
|
if changed and not module.check_mode:
|
||||||
run_acl(module, command)
|
run_acl(module, command)
|
||||||
msg = "%s is present" % entry
|
msg = "%s is present" % entry
|
||||||
|
|
||||||
elif state == 'absent':
|
elif state == 'absent':
|
||||||
entry = build_entry(etype, entity, use_nfsv4_acls)
|
if use_nfsv4_acls:
|
||||||
|
entry = build_entry(etype, entity, permissions, use_nfsv4_acls)
|
||||||
|
else:
|
||||||
|
entry = build_entry(etype, entity, use_nfsv4_acls)
|
||||||
command = build_command(
|
command = build_command(
|
||||||
module, 'rm', path, follow,
|
module, 'rm', path, follow,
|
||||||
default, recursive, recalculate_mask, entry
|
default, recursive, recalculate_mask, use_nfsv4_acls, entry
|
||||||
)
|
)
|
||||||
changed = acl_changed(module, command)
|
changed = acl_changed(module, command, entry, use_nfsv4_acls)
|
||||||
|
|
||||||
if changed and not module.check_mode:
|
if changed and not module.check_mode:
|
||||||
run_acl(module, command, False)
|
run_acl(module, command, False)
|
||||||
@@ -375,7 +397,10 @@ def main():
|
|||||||
|
|
||||||
acl = run_acl(
|
acl = run_acl(
|
||||||
module,
|
module,
|
||||||
build_command(module, 'get', path, follow, default, recursive, recalculate_mask)
|
build_command(
|
||||||
|
module, 'get', path, follow, default, recursive,
|
||||||
|
recalculate_mask, use_nfsv4_acls
|
||||||
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
module.exit_json(changed=changed, msg=msg, acl=acl)
|
module.exit_json(changed=changed, msg=msg, acl=acl)
|
||||||
|
|||||||
@@ -850,11 +850,8 @@ def main():
|
|||||||
args['warnings'].append("Ignore the 'boot' due to 'opts' contains 'noauto'.")
|
args['warnings'].append("Ignore the 'boot' due to 'opts' contains 'noauto'.")
|
||||||
elif not module.params['boot']:
|
elif not module.params['boot']:
|
||||||
args['boot'] = 'no'
|
args['boot'] = 'no'
|
||||||
if 'defaults' in opts:
|
opts.append('noauto')
|
||||||
args['warnings'].append("Ignore the 'boot' due to 'opts' contains 'defaults'.")
|
args['opts'] = ','.join(opts)
|
||||||
else:
|
|
||||||
opts.append('noauto')
|
|
||||||
args['opts'] = ','.join(opts)
|
|
||||||
|
|
||||||
# If fstab file does not exist, we first need to create it. This mainly
|
# If fstab file does not exist, we first need to create it. This mainly
|
||||||
# happens when fstab option is passed to the module.
|
# happens when fstab option is passed to the module.
|
||||||
|
|||||||
@@ -8,6 +8,7 @@
|
|||||||
from __future__ import absolute_import, division, print_function
|
from __future__ import absolute_import, division, print_function
|
||||||
__metaclass__ = type
|
__metaclass__ = type
|
||||||
|
|
||||||
|
|
||||||
DOCUMENTATION = r'''
|
DOCUMENTATION = r'''
|
||||||
---
|
---
|
||||||
module: synchronize
|
module: synchronize
|
||||||
@@ -203,12 +204,6 @@ options:
|
|||||||
description: Internal use only. See O(use_ssh_args) for ssh arg settings.
|
description: Internal use only. See O(use_ssh_args) for ssh arg settings.
|
||||||
type: str
|
type: str
|
||||||
required: false
|
required: false
|
||||||
quiet:
|
|
||||||
description:
|
|
||||||
- This option specifies quiet option which on true suppresses the output.
|
|
||||||
type: bool
|
|
||||||
default: false
|
|
||||||
version_added: 1.6.0
|
|
||||||
|
|
||||||
notes:
|
notes:
|
||||||
- C(rsync) must be installed on both the local and remote host.
|
- C(rsync) must be installed on both the local and remote host.
|
||||||
@@ -366,12 +361,6 @@ EXAMPLES = r'''
|
|||||||
src: /tmp/localpath/
|
src: /tmp/localpath/
|
||||||
dest: /tmp/remotepath
|
dest: /tmp/remotepath
|
||||||
rsync_path: /usr/gnu/bin/rsync
|
rsync_path: /usr/gnu/bin/rsync
|
||||||
|
|
||||||
- name: Synchronization with quiet option enabled
|
|
||||||
ansible.posix.synchronize:
|
|
||||||
src: some/relative/path
|
|
||||||
dest: /some/absolute/path
|
|
||||||
quiet: true
|
|
||||||
'''
|
'''
|
||||||
|
|
||||||
|
|
||||||
@@ -449,7 +438,6 @@ def main():
|
|||||||
delay_updates=dict(type='bool', default=True),
|
delay_updates=dict(type='bool', default=True),
|
||||||
mode=dict(type='str', default='push', choices=['pull', 'push']),
|
mode=dict(type='str', default='push', choices=['pull', 'push']),
|
||||||
link_dest=dict(type='list', elements='path'),
|
link_dest=dict(type='list', elements='path'),
|
||||||
quiet=dict(type='bool', default=False)
|
|
||||||
),
|
),
|
||||||
supports_check_mode=True,
|
supports_check_mode=True,
|
||||||
)
|
)
|
||||||
@@ -490,7 +478,6 @@ def main():
|
|||||||
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']
|
||||||
quiet = module.params['quiet']
|
|
||||||
|
|
||||||
if '/' not in rsync:
|
if '/' not in rsync:
|
||||||
rsync = module.get_bin_path(rsync, required=True)
|
rsync = module.get_bin_path(rsync, required=True)
|
||||||
@@ -615,9 +602,6 @@ def main():
|
|||||||
|
|
||||||
cmd.append(shlex_quote(source))
|
cmd.append(shlex_quote(source))
|
||||||
cmd.append(shlex_quote(dest))
|
cmd.append(shlex_quote(dest))
|
||||||
if quiet:
|
|
||||||
cmd.append('--quiet')
|
|
||||||
|
|
||||||
cmdstr = ' '.join(cmd)
|
cmdstr = ' '.join(cmd)
|
||||||
|
|
||||||
# If we are using password authentication, write the password into the pipe
|
# If we are using password authentication, write the password into the pipe
|
||||||
@@ -650,17 +634,14 @@ def main():
|
|||||||
out_lines = out_clean.split('\n')
|
out_lines = out_clean.split('\n')
|
||||||
while '' in out_lines:
|
while '' in out_lines:
|
||||||
out_lines.remove('')
|
out_lines.remove('')
|
||||||
|
|
||||||
result = dict(changed=changed, rc=rc, cmd=cmdstr, stdout_lines=out_lines, msg=out_clean)
|
|
||||||
|
|
||||||
if quiet:
|
|
||||||
changes = out.count(changed_marker) if changed else 0
|
|
||||||
result['msg'] = "%s files/directories have been synchronized" % changes
|
|
||||||
|
|
||||||
if module._diff:
|
if module._diff:
|
||||||
result['diff'] = {'prepared': out_clean}
|
diff = {'prepared': out_clean}
|
||||||
|
return module.exit_json(changed=changed, msg=out_clean,
|
||||||
|
rc=rc, cmd=cmdstr, stdout_lines=out_lines,
|
||||||
|
diff=diff)
|
||||||
|
|
||||||
return module.exit_json(**result)
|
return module.exit_json(changed=changed, msg=out_clean,
|
||||||
|
rc=rc, cmd=cmdstr, stdout_lines=out_lines)
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
|
|||||||
@@ -1,2 +0,0 @@
|
|||||||
[testgroup]
|
|
||||||
testhost ansible_connection="local" ansible_pipelining="yes" ansible_python_interpreter="/Users/mandkulk/venv3.9/bin/python"
|
|
||||||
@@ -472,6 +472,25 @@
|
|||||||
path: /tmp/myfs
|
path: /tmp/myfs
|
||||||
state: absent
|
state: absent
|
||||||
|
|
||||||
|
- name: Mount the FS with noauto option and defaults
|
||||||
|
ansible.posix.mount:
|
||||||
|
path: /tmp/myfs
|
||||||
|
src: /tmp/myfs.img
|
||||||
|
fstype: ext3
|
||||||
|
state: mounted
|
||||||
|
boot: false
|
||||||
|
register: mount_info
|
||||||
|
|
||||||
|
- name: Assert the mount without noauto was successful
|
||||||
|
ansible.builtin.assert:
|
||||||
|
that:
|
||||||
|
- "'noauto' in mount_info['opts'].split(',')"
|
||||||
|
|
||||||
|
- name: Unmount FS
|
||||||
|
ansible.posix.mount:
|
||||||
|
path: /tmp/myfs
|
||||||
|
state: absent
|
||||||
|
|
||||||
- name: Remove the test FS
|
- name: Remove the test FS
|
||||||
ansible.builtin.file:
|
ansible.builtin.file:
|
||||||
path: '{{ item }}'
|
path: '{{ item }}'
|
||||||
|
|||||||
@@ -128,8 +128,8 @@
|
|||||||
ansible.builtin.assert:
|
ansible.builtin.assert:
|
||||||
that:
|
that:
|
||||||
- selinux_config_original | length == selinux_config_after | length
|
- selinux_config_original | length == selinux_config_after | length
|
||||||
- selinux_config_after[selinux_config_after.index('SELINUX=disabled')] is search("^SELINUX=\w+$")
|
- (selinux_config_after | select("search", "^SELINUX=disabled\s*$") | list | length) > 0
|
||||||
- selinux_config_after[selinux_config_after.index('SELINUXTYPE=targeted')] is search("^SELINUXTYPE=\w+$")
|
- (selinux_config_after | select("search", "^SELINUXTYPE=targeted\s*$") | list | length) > 0
|
||||||
|
|
||||||
- name: TEST 1 | Disable SELinux again, with kernel arguments update
|
- name: TEST 1 | Disable SELinux again, with kernel arguments update
|
||||||
ansible.posix.selinux:
|
ansible.posix.selinux:
|
||||||
|
|||||||
@@ -339,37 +339,6 @@
|
|||||||
- stat_result_b.stat.exists == True
|
- stat_result_b.stat.exists == True
|
||||||
- stat_result_b.stat.checksum == '2aae6c35c94fcfb415dbe95f408b9ce91ee846ed'
|
- stat_result_b.stat.checksum == '2aae6c35c94fcfb415dbe95f408b9ce91ee846ed'
|
||||||
|
|
||||||
- name: Synchronize files with quiet option
|
|
||||||
ansible.posix.synchronize:
|
|
||||||
src: '{{ output_dir }}/foo.txt'
|
|
||||||
dest: '{{ output_dir }}/foo.result'
|
|
||||||
quiet: true
|
|
||||||
register: sync_result
|
|
||||||
|
|
||||||
- name: Assertion for synchronize with quiet option
|
|
||||||
ansible.builtin.assert:
|
|
||||||
that:
|
|
||||||
- '''files/directories have been synchronized'' in sync_result.msg'
|
|
||||||
|
|
||||||
- name: Cleanup
|
|
||||||
ansible.builtin.file:
|
|
||||||
state: absent
|
|
||||||
path: '{{ output_dir }}/{{ item }}'
|
|
||||||
loop:
|
|
||||||
- foo.result
|
|
||||||
- bar.result
|
|
||||||
|
|
||||||
- name: Synchronize files without quiet option
|
|
||||||
ansible.posix.synchronize:
|
|
||||||
src: '{{ output_dir }}/foo.txt'
|
|
||||||
dest: '{{ output_dir }}/foo.result'
|
|
||||||
register: sync_result
|
|
||||||
|
|
||||||
- name: Assertion for synchronize without quiet option
|
|
||||||
ansible.builtin.assert:
|
|
||||||
that:
|
|
||||||
- '''files/directories have been synchronized'' not in sync_result.msg'
|
|
||||||
|
|
||||||
- name: Cleanup
|
- name: Cleanup
|
||||||
ansible.builtin.file:
|
ansible.builtin.file:
|
||||||
state: absent
|
state: absent
|
||||||
|
|||||||
1
tests/sanity/ignore-2.19.txt
Normal file
1
tests/sanity/ignore-2.19.txt
Normal file
@@ -0,0 +1 @@
|
|||||||
|
tests/utils/shippable/timing.py shebang
|
||||||
Reference in New Issue
Block a user