diff options
| author | Matt Clay <matt@mystile.com> | 2019-02-15 17:52:35 -0800 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2019-02-15 17:52:35 -0800 |
| commit | f5c92f6bc1659d1e95657c1b8872a56a13d6ecff (patch) | |
| tree | 39aabfa15ff149e86f4efcb0c703e37004059eff /lib/ansible/executor/module_common.py | |
| parent | 1db6d5598abb465738a7176d8b7c64a7143c6628 (diff) | |
| download | ansible-f5c92f6bc1659d1e95657c1b8872a56a13d6ecff.tar.gz | |
Allow setting resource.RLIMIT_NOFILE in modules (#51989)
Diffstat (limited to 'lib/ansible/executor/module_common.py')
| -rw-r--r-- | lib/ansible/executor/module_common.py | 31 |
1 files changed, 31 insertions, 0 deletions
diff --git a/lib/ansible/executor/module_common.py b/lib/ansible/executor/module_common.py index 8402f21217..d3a9c9fee8 100644 --- a/lib/ansible/executor/module_common.py +++ b/lib/ansible/executor/module_common.py @@ -94,6 +94,7 @@ _ANSIBALLZ_WRAPPER = True # For test-module script to tell this is a ANSIBALLZ_W # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE # USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. def _ansiballz_main(): +%(rlimit)s import os import os.path import sys @@ -350,6 +351,22 @@ ANSIBALLZ_COVERAGE_TEMPLATE = ''' cov.start() ''' +ANSIBALLZ_RLIMIT_TEMPLATE = ''' + import resource + + existing_soft, existing_hard = resource.getrlimit(resource.RLIMIT_NOFILE) + + # adjust soft limit subject to existing hard limit + requested_soft = min(existing_hard, %(rlimit_nofile)d) + + if requested_soft != existing_soft: + try: + resource.setrlimit(resource.RLIMIT_NOFILE, (requested_soft, existing_hard)) + except ValueError: + # some platforms (eg macOS) lie about their hard limit + pass +''' + def _strip_comments(source): # Strip comments and blank lines from the wrapper @@ -764,6 +781,19 @@ def _find_module_utils(module_name, b_module_data, module_path, module_args, tas interpreter_parts = interpreter.split(u' ') interpreter = u"'{0}'".format(u"', '".join(interpreter_parts)) + # FUTURE: the module cache entry should be invalidated if we got this value from a host-dependent source + rlimit_nofile = C.config.get_config_value('PYTHON_MODULE_RLIMIT_NOFILE', variables=task_vars) + + if not isinstance(rlimit_nofile, int): + rlimit_nofile = int(templar.template(rlimit_nofile)) + + if rlimit_nofile: + rlimit = ANSIBALLZ_RLIMIT_TEMPLATE % dict( + rlimit_nofile=rlimit_nofile, + ) + else: + rlimit = '' + coverage_config = os.environ.get('_ANSIBLE_COVERAGE_CONFIG') if coverage_config: @@ -791,6 +821,7 @@ def _find_module_utils(module_name, b_module_data, module_path, module_args, tas minute=now.minute, second=now.second, coverage=coverage, + rlimit=rlimit, ))) b_module_data = output.getvalue() |
