|
|
|
# Copyright 2017, David Wilson
|
|
|
|
#
|
|
|
|
# Redistribution and use in source and binary forms, with or without
|
|
|
|
# modification, are permitted provided that the following conditions are met:
|
|
|
|
#
|
|
|
|
# 1. Redistributions of source code must retain the above copyright notice,
|
|
|
|
# this list of conditions and the following disclaimer.
|
|
|
|
#
|
|
|
|
# 2. Redistributions in binary form must reproduce the above copyright notice,
|
|
|
|
# this list of conditions and the following disclaimer in the documentation
|
|
|
|
# and/or other materials provided with the distribution.
|
|
|
|
#
|
|
|
|
# 3. Neither the name of the copyright holder nor the names of its contributors
|
|
|
|
# may be used to endorse or promote products derived from this software without
|
|
|
|
# specific prior written permission.
|
|
|
|
#
|
|
|
|
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
|
|
|
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
|
|
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
|
|
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
|
|
|
|
# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
|
|
|
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
|
|
|
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
|
|
|
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
|
|
|
# CONTRACT, STRICT 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.
|
|
|
|
|
|
|
|
from __future__ import absolute_import
|
|
|
|
from __future__ import unicode_literals
|
|
|
|
|
|
|
|
import errno
|
|
|
|
import logging
|
|
|
|
import os
|
|
|
|
import pprint
|
|
|
|
import random
|
|
|
|
import stat
|
|
|
|
import sys
|
|
|
|
import time
|
|
|
|
|
ansible: connection delegation v1
This implements the first edition of Connection Delegation, where
delegating connection establishment is initially single-threaded.
ansible_mitogen/strategy.py:
ansible_mitogen/plugins/connection/*:
Begin splitting connection.Connection into subclasses, exposing them
directly as "mitogen_ssh", "mitogen_local", etc. connection types.
This is far from removing strategy.py, but it's a tiny start.
ansible_mitogen/connection.py:
* config_from_play_context() and config_from_host_vars() build up a
huge dictionary containing either more or less PlayContext contents,
or our best attempt at reconstructing a host's connection config
from its hostvars, where that config is not the current
WorkerProcess target.
They both produce the same format with the same keys, allowing
remaining code to have a single input format.
These dicts contain fields named after how Ansible refers to them,
e.g. "sudo_exe".
* _config_from_via() parses a basic connection specification like
"username@inventory_name" into one of the aforementioned dicts.
* _stack_from_config() produces a list of dicts describing the order
in which (Mitogen) connections should be established, such that each
element is proxied via= the previous element. The dicts produced by
this function use Mitogen keyword arguments, the former di.
These dicts contain fields named after how Mitogen refers to them,
e.g. "sudo_path".
* Pass the stack to ContextService, which is responsible for actual
setup of the full chain.
ansible_mitogen/services.py:
Teach get() to walk the supplied stack, establishing each connection
in turn, creating refounts for it before continuing.
TODO: refcounting is broken in a variety of cases.
7 years ago
|
|
|
import jinja2.runtime
|
|
|
|
import ansible.constants as C
|
|
|
|
import ansible.errors
|
|
|
|
import ansible.plugins.connection
|
|
|
|
import ansible.utils.shlex
|
|
|
|
|
|
|
|
import mitogen.core
|
|
|
|
import mitogen.fork
|
|
|
|
import mitogen.unix
|
|
|
|
import mitogen.utils
|
|
|
|
|
|
|
|
import ansible_mitogen.parsing
|
|
|
|
import ansible_mitogen.process
|
|
|
|
import ansible_mitogen.services
|
|
|
|
import ansible_mitogen.target
|
issue #251, #412, #434: fix connection configuration brainwrong
This refactors connection.py to pull the two huge dict-building
functions out into new transport_transport_config.PlayContextSpec and
MitogenViaSpec classes, leaving a lot more room to breath in both files
to figure out exactly how connection configuration should work.
The changes made in 1f21a30 / 3d58832 are updated or completely removed,
the original change was misguided, in a bid to fix connection delegation
taking variables from the wrong place when delegate_to was active.
The Python path no longer defaults to '/usr/bin/python', this does not
appear to be Ansible's normal behaviour. This has changed several times,
so it may have to change again, and it may cause breakage after release.
Connection delegation respects the c.DEFAULT_REMOTE_USER whereas the
previous version simply tried to fetch whatever was in the
'ansible_user' hostvar. Many more connection delegation variables closer
match vanilla's handling, but this still requires more work. Some of the
variables need access to the command line, and upstream are in the
process of changing all that stuff around.
6 years ago
|
|
|
import ansible_mitogen.transport_config
|
|
|
|
|
|
|
|
|
|
|
|
LOG = logging.getLogger(__name__)
|
|
|
|
|
|
|
|
|
|
|
|
def optional_int(value):
|
|
|
|
"""
|
|
|
|
Convert `value` to an integer if it is not :data:`None`, otherwise return
|
|
|
|
:data:`None`.
|
|
|
|
"""
|
|
|
|
try:
|
|
|
|
return int(value)
|
|
|
|
except (TypeError, ValueError):
|
|
|
|
return None
|
|
|
|
|
|
|
|
|
|
|
|
def convert_bool(obj):
|
|
|
|
if isinstance(obj, bool):
|
|
|
|
return obj
|
|
|
|
if str(obj).lower() in ('no', 'false', '0'):
|
|
|
|
return False
|
|
|
|
if str(obj).lower() not in ('yes', 'true', '1'):
|
|
|
|
raise ansible.errors.AnsibleConnectionFailure(
|
|
|
|
'expected yes/no/true/false/0/1, got %r' % (obj,)
|
|
|
|
)
|
|
|
|
return True
|
|
|
|
|
|
|
|
|
|
|
|
def default(value, default):
|
|
|
|
"""
|
|
|
|
Return `default` is `value` is :data:`None`, otherwise return `value`.
|
|
|
|
"""
|
|
|
|
if value is None:
|
|
|
|
return default
|
|
|
|
return value
|
|
|
|
|
|
|
|
|
ansible: connection delegation v1
This implements the first edition of Connection Delegation, where
delegating connection establishment is initially single-threaded.
ansible_mitogen/strategy.py:
ansible_mitogen/plugins/connection/*:
Begin splitting connection.Connection into subclasses, exposing them
directly as "mitogen_ssh", "mitogen_local", etc. connection types.
This is far from removing strategy.py, but it's a tiny start.
ansible_mitogen/connection.py:
* config_from_play_context() and config_from_host_vars() build up a
huge dictionary containing either more or less PlayContext contents,
or our best attempt at reconstructing a host's connection config
from its hostvars, where that config is not the current
WorkerProcess target.
They both produce the same format with the same keys, allowing
remaining code to have a single input format.
These dicts contain fields named after how Ansible refers to them,
e.g. "sudo_exe".
* _config_from_via() parses a basic connection specification like
"username@inventory_name" into one of the aforementioned dicts.
* _stack_from_config() produces a list of dicts describing the order
in which (Mitogen) connections should be established, such that each
element is proxied via= the previous element. The dicts produced by
this function use Mitogen keyword arguments, the former di.
These dicts contain fields named after how Mitogen refers to them,
e.g. "sudo_path".
* Pass the stack to ContextService, which is responsible for actual
setup of the full chain.
ansible_mitogen/services.py:
Teach get() to walk the supplied stack, establishing each connection
in turn, creating refounts for it before continuing.
TODO: refcounting is broken in a variety of cases.
7 years ago
|
|
|
def _connect_local(spec):
|
|
|
|
"""
|
|
|
|
Return ContextService arguments for a local connection.
|
|
|
|
"""
|
ansible: connection delegation v1
This implements the first edition of Connection Delegation, where
delegating connection establishment is initially single-threaded.
ansible_mitogen/strategy.py:
ansible_mitogen/plugins/connection/*:
Begin splitting connection.Connection into subclasses, exposing them
directly as "mitogen_ssh", "mitogen_local", etc. connection types.
This is far from removing strategy.py, but it's a tiny start.
ansible_mitogen/connection.py:
* config_from_play_context() and config_from_host_vars() build up a
huge dictionary containing either more or less PlayContext contents,
or our best attempt at reconstructing a host's connection config
from its hostvars, where that config is not the current
WorkerProcess target.
They both produce the same format with the same keys, allowing
remaining code to have a single input format.
These dicts contain fields named after how Ansible refers to them,
e.g. "sudo_exe".
* _config_from_via() parses a basic connection specification like
"username@inventory_name" into one of the aforementioned dicts.
* _stack_from_config() produces a list of dicts describing the order
in which (Mitogen) connections should be established, such that each
element is proxied via= the previous element. The dicts produced by
this function use Mitogen keyword arguments, the former di.
These dicts contain fields named after how Mitogen refers to them,
e.g. "sudo_path".
* Pass the stack to ContextService, which is responsible for actual
setup of the full chain.
ansible_mitogen/services.py:
Teach get() to walk the supplied stack, establishing each connection
in turn, creating refounts for it before continuing.
TODO: refcounting is broken in a variety of cases.
7 years ago
|
|
|
return {
|
|
|
|
'method': 'local',
|
|
|
|
'kwargs': {
|
issue #251, #412, #434: fix connection configuration brainwrong
This refactors connection.py to pull the two huge dict-building
functions out into new transport_transport_config.PlayContextSpec and
MitogenViaSpec classes, leaving a lot more room to breath in both files
to figure out exactly how connection configuration should work.
The changes made in 1f21a30 / 3d58832 are updated or completely removed,
the original change was misguided, in a bid to fix connection delegation
taking variables from the wrong place when delegate_to was active.
The Python path no longer defaults to '/usr/bin/python', this does not
appear to be Ansible's normal behaviour. This has changed several times,
so it may have to change again, and it may cause breakage after release.
Connection delegation respects the c.DEFAULT_REMOTE_USER whereas the
previous version simply tried to fetch whatever was in the
'ansible_user' hostvar. Many more connection delegation variables closer
match vanilla's handling, but this still requires more work. Some of the
variables need access to the command line, and upstream are in the
process of changing all that stuff around.
6 years ago
|
|
|
'python_path': spec.python_path(),
|
ansible: connection delegation v1
This implements the first edition of Connection Delegation, where
delegating connection establishment is initially single-threaded.
ansible_mitogen/strategy.py:
ansible_mitogen/plugins/connection/*:
Begin splitting connection.Connection into subclasses, exposing them
directly as "mitogen_ssh", "mitogen_local", etc. connection types.
This is far from removing strategy.py, but it's a tiny start.
ansible_mitogen/connection.py:
* config_from_play_context() and config_from_host_vars() build up a
huge dictionary containing either more or less PlayContext contents,
or our best attempt at reconstructing a host's connection config
from its hostvars, where that config is not the current
WorkerProcess target.
They both produce the same format with the same keys, allowing
remaining code to have a single input format.
These dicts contain fields named after how Ansible refers to them,
e.g. "sudo_exe".
* _config_from_via() parses a basic connection specification like
"username@inventory_name" into one of the aforementioned dicts.
* _stack_from_config() produces a list of dicts describing the order
in which (Mitogen) connections should be established, such that each
element is proxied via= the previous element. The dicts produced by
this function use Mitogen keyword arguments, the former di.
These dicts contain fields named after how Mitogen refers to them,
e.g. "sudo_path".
* Pass the stack to ContextService, which is responsible for actual
setup of the full chain.
ansible_mitogen/services.py:
Teach get() to walk the supplied stack, establishing each connection
in turn, creating refounts for it before continuing.
TODO: refcounting is broken in a variety of cases.
7 years ago
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
ansible: connection delegation v1
This implements the first edition of Connection Delegation, where
delegating connection establishment is initially single-threaded.
ansible_mitogen/strategy.py:
ansible_mitogen/plugins/connection/*:
Begin splitting connection.Connection into subclasses, exposing them
directly as "mitogen_ssh", "mitogen_local", etc. connection types.
This is far from removing strategy.py, but it's a tiny start.
ansible_mitogen/connection.py:
* config_from_play_context() and config_from_host_vars() build up a
huge dictionary containing either more or less PlayContext contents,
or our best attempt at reconstructing a host's connection config
from its hostvars, where that config is not the current
WorkerProcess target.
They both produce the same format with the same keys, allowing
remaining code to have a single input format.
These dicts contain fields named after how Ansible refers to them,
e.g. "sudo_exe".
* _config_from_via() parses a basic connection specification like
"username@inventory_name" into one of the aforementioned dicts.
* _stack_from_config() produces a list of dicts describing the order
in which (Mitogen) connections should be established, such that each
element is proxied via= the previous element. The dicts produced by
this function use Mitogen keyword arguments, the former di.
These dicts contain fields named after how Mitogen refers to them,
e.g. "sudo_path".
* Pass the stack to ContextService, which is responsible for actual
setup of the full chain.
ansible_mitogen/services.py:
Teach get() to walk the supplied stack, establishing each connection
in turn, creating refounts for it before continuing.
TODO: refcounting is broken in a variety of cases.
7 years ago
|
|
|
def _connect_ssh(spec):
|
|
|
|
"""
|
|
|
|
Return ContextService arguments for an SSH connection.
|
|
|
|
"""
|
|
|
|
if C.HOST_KEY_CHECKING:
|
|
|
|
check_host_keys = 'enforce'
|
|
|
|
else:
|
|
|
|
check_host_keys = 'ignore'
|
|
|
|
|
|
|
|
# #334: tilde-expand private_key_file to avoid implementation difference
|
|
|
|
# between Python and OpenSSH.
|
issue #251, #412, #434: fix connection configuration brainwrong
This refactors connection.py to pull the two huge dict-building
functions out into new transport_transport_config.PlayContextSpec and
MitogenViaSpec classes, leaving a lot more room to breath in both files
to figure out exactly how connection configuration should work.
The changes made in 1f21a30 / 3d58832 are updated or completely removed,
the original change was misguided, in a bid to fix connection delegation
taking variables from the wrong place when delegate_to was active.
The Python path no longer defaults to '/usr/bin/python', this does not
appear to be Ansible's normal behaviour. This has changed several times,
so it may have to change again, and it may cause breakage after release.
Connection delegation respects the c.DEFAULT_REMOTE_USER whereas the
previous version simply tried to fetch whatever was in the
'ansible_user' hostvar. Many more connection delegation variables closer
match vanilla's handling, but this still requires more work. Some of the
variables need access to the command line, and upstream are in the
process of changing all that stuff around.
6 years ago
|
|
|
private_key_file = spec.private_key_file()
|
|
|
|
if private_key_file is not None:
|
|
|
|
private_key_file = os.path.expanduser(private_key_file)
|
|
|
|
|
ansible: connection delegation v1
This implements the first edition of Connection Delegation, where
delegating connection establishment is initially single-threaded.
ansible_mitogen/strategy.py:
ansible_mitogen/plugins/connection/*:
Begin splitting connection.Connection into subclasses, exposing them
directly as "mitogen_ssh", "mitogen_local", etc. connection types.
This is far from removing strategy.py, but it's a tiny start.
ansible_mitogen/connection.py:
* config_from_play_context() and config_from_host_vars() build up a
huge dictionary containing either more or less PlayContext contents,
or our best attempt at reconstructing a host's connection config
from its hostvars, where that config is not the current
WorkerProcess target.
They both produce the same format with the same keys, allowing
remaining code to have a single input format.
These dicts contain fields named after how Ansible refers to them,
e.g. "sudo_exe".
* _config_from_via() parses a basic connection specification like
"username@inventory_name" into one of the aforementioned dicts.
* _stack_from_config() produces a list of dicts describing the order
in which (Mitogen) connections should be established, such that each
element is proxied via= the previous element. The dicts produced by
this function use Mitogen keyword arguments, the former di.
These dicts contain fields named after how Mitogen refers to them,
e.g. "sudo_path".
* Pass the stack to ContextService, which is responsible for actual
setup of the full chain.
ansible_mitogen/services.py:
Teach get() to walk the supplied stack, establishing each connection
in turn, creating refounts for it before continuing.
TODO: refcounting is broken in a variety of cases.
7 years ago
|
|
|
return {
|
|
|
|
'method': 'ssh',
|
|
|
|
'kwargs': {
|
|
|
|
'check_host_keys': check_host_keys,
|
issue #251, #412, #434: fix connection configuration brainwrong
This refactors connection.py to pull the two huge dict-building
functions out into new transport_transport_config.PlayContextSpec and
MitogenViaSpec classes, leaving a lot more room to breath in both files
to figure out exactly how connection configuration should work.
The changes made in 1f21a30 / 3d58832 are updated or completely removed,
the original change was misguided, in a bid to fix connection delegation
taking variables from the wrong place when delegate_to was active.
The Python path no longer defaults to '/usr/bin/python', this does not
appear to be Ansible's normal behaviour. This has changed several times,
so it may have to change again, and it may cause breakage after release.
Connection delegation respects the c.DEFAULT_REMOTE_USER whereas the
previous version simply tried to fetch whatever was in the
'ansible_user' hostvar. Many more connection delegation variables closer
match vanilla's handling, but this still requires more work. Some of the
variables need access to the command line, and upstream are in the
process of changing all that stuff around.
6 years ago
|
|
|
'hostname': spec.remote_addr(),
|
|
|
|
'username': spec.remote_user(),
|
|
|
|
'compression': convert_bool(
|
|
|
|
default(spec.mitogen_ssh_compression(), True)
|
|
|
|
),
|
|
|
|
'password': spec.password(),
|
issue #251, #412, #434: fix connection configuration brainwrong
This refactors connection.py to pull the two huge dict-building
functions out into new transport_transport_config.PlayContextSpec and
MitogenViaSpec classes, leaving a lot more room to breath in both files
to figure out exactly how connection configuration should work.
The changes made in 1f21a30 / 3d58832 are updated or completely removed,
the original change was misguided, in a bid to fix connection delegation
taking variables from the wrong place when delegate_to was active.
The Python path no longer defaults to '/usr/bin/python', this does not
appear to be Ansible's normal behaviour. This has changed several times,
so it may have to change again, and it may cause breakage after release.
Connection delegation respects the c.DEFAULT_REMOTE_USER whereas the
previous version simply tried to fetch whatever was in the
'ansible_user' hostvar. Many more connection delegation variables closer
match vanilla's handling, but this still requires more work. Some of the
variables need access to the command line, and upstream are in the
process of changing all that stuff around.
6 years ago
|
|
|
'port': spec.port(),
|
|
|
|
'python_path': spec.python_path(),
|
|
|
|
'identity_file': private_key_file,
|
|
|
|
'identities_only': False,
|
issue #251, #412, #434: fix connection configuration brainwrong
This refactors connection.py to pull the two huge dict-building
functions out into new transport_transport_config.PlayContextSpec and
MitogenViaSpec classes, leaving a lot more room to breath in both files
to figure out exactly how connection configuration should work.
The changes made in 1f21a30 / 3d58832 are updated or completely removed,
the original change was misguided, in a bid to fix connection delegation
taking variables from the wrong place when delegate_to was active.
The Python path no longer defaults to '/usr/bin/python', this does not
appear to be Ansible's normal behaviour. This has changed several times,
so it may have to change again, and it may cause breakage after release.
Connection delegation respects the c.DEFAULT_REMOTE_USER whereas the
previous version simply tried to fetch whatever was in the
'ansible_user' hostvar. Many more connection delegation variables closer
match vanilla's handling, but this still requires more work. Some of the
variables need access to the command line, and upstream are in the
process of changing all that stuff around.
6 years ago
|
|
|
'ssh_path': spec.ssh_executable(),
|
|
|
|
'connect_timeout': spec.ansible_ssh_timeout(),
|
|
|
|
'ssh_args': spec.ssh_args(),
|
|
|
|
'ssh_debug_level': spec.mitogen_ssh_debug_level(),
|
ansible: connection delegation v1
This implements the first edition of Connection Delegation, where
delegating connection establishment is initially single-threaded.
ansible_mitogen/strategy.py:
ansible_mitogen/plugins/connection/*:
Begin splitting connection.Connection into subclasses, exposing them
directly as "mitogen_ssh", "mitogen_local", etc. connection types.
This is far from removing strategy.py, but it's a tiny start.
ansible_mitogen/connection.py:
* config_from_play_context() and config_from_host_vars() build up a
huge dictionary containing either more or less PlayContext contents,
or our best attempt at reconstructing a host's connection config
from its hostvars, where that config is not the current
WorkerProcess target.
They both produce the same format with the same keys, allowing
remaining code to have a single input format.
These dicts contain fields named after how Ansible refers to them,
e.g. "sudo_exe".
* _config_from_via() parses a basic connection specification like
"username@inventory_name" into one of the aforementioned dicts.
* _stack_from_config() produces a list of dicts describing the order
in which (Mitogen) connections should be established, such that each
element is proxied via= the previous element. The dicts produced by
this function use Mitogen keyword arguments, the former di.
These dicts contain fields named after how Mitogen refers to them,
e.g. "sudo_path".
* Pass the stack to ContextService, which is responsible for actual
setup of the full chain.
ansible_mitogen/services.py:
Teach get() to walk the supplied stack, establishing each connection
in turn, creating refounts for it before continuing.
TODO: refcounting is broken in a variety of cases.
7 years ago
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
def _connect_docker(spec):
|
|
|
|
"""
|
|
|
|
Return ContextService arguments for a Docker connection.
|
|
|
|
"""
|
ansible: connection delegation v1
This implements the first edition of Connection Delegation, where
delegating connection establishment is initially single-threaded.
ansible_mitogen/strategy.py:
ansible_mitogen/plugins/connection/*:
Begin splitting connection.Connection into subclasses, exposing them
directly as "mitogen_ssh", "mitogen_local", etc. connection types.
This is far from removing strategy.py, but it's a tiny start.
ansible_mitogen/connection.py:
* config_from_play_context() and config_from_host_vars() build up a
huge dictionary containing either more or less PlayContext contents,
or our best attempt at reconstructing a host's connection config
from its hostvars, where that config is not the current
WorkerProcess target.
They both produce the same format with the same keys, allowing
remaining code to have a single input format.
These dicts contain fields named after how Ansible refers to them,
e.g. "sudo_exe".
* _config_from_via() parses a basic connection specification like
"username@inventory_name" into one of the aforementioned dicts.
* _stack_from_config() produces a list of dicts describing the order
in which (Mitogen) connections should be established, such that each
element is proxied via= the previous element. The dicts produced by
this function use Mitogen keyword arguments, the former di.
These dicts contain fields named after how Mitogen refers to them,
e.g. "sudo_path".
* Pass the stack to ContextService, which is responsible for actual
setup of the full chain.
ansible_mitogen/services.py:
Teach get() to walk the supplied stack, establishing each connection
in turn, creating refounts for it before continuing.
TODO: refcounting is broken in a variety of cases.
7 years ago
|
|
|
return {
|
|
|
|
'method': 'docker',
|
|
|
|
'kwargs': {
|
issue #251, #412, #434: fix connection configuration brainwrong
This refactors connection.py to pull the two huge dict-building
functions out into new transport_transport_config.PlayContextSpec and
MitogenViaSpec classes, leaving a lot more room to breath in both files
to figure out exactly how connection configuration should work.
The changes made in 1f21a30 / 3d58832 are updated or completely removed,
the original change was misguided, in a bid to fix connection delegation
taking variables from the wrong place when delegate_to was active.
The Python path no longer defaults to '/usr/bin/python', this does not
appear to be Ansible's normal behaviour. This has changed several times,
so it may have to change again, and it may cause breakage after release.
Connection delegation respects the c.DEFAULT_REMOTE_USER whereas the
previous version simply tried to fetch whatever was in the
'ansible_user' hostvar. Many more connection delegation variables closer
match vanilla's handling, but this still requires more work. Some of the
variables need access to the command line, and upstream are in the
process of changing all that stuff around.
6 years ago
|
|
|
'username': spec.remote_user(),
|
|
|
|
'container': spec.remote_addr(),
|
|
|
|
'python_path': spec.python_path(),
|
|
|
|
'connect_timeout': spec.ansible_ssh_timeout() or spec.timeout(),
|
ansible: connection delegation v1
This implements the first edition of Connection Delegation, where
delegating connection establishment is initially single-threaded.
ansible_mitogen/strategy.py:
ansible_mitogen/plugins/connection/*:
Begin splitting connection.Connection into subclasses, exposing them
directly as "mitogen_ssh", "mitogen_local", etc. connection types.
This is far from removing strategy.py, but it's a tiny start.
ansible_mitogen/connection.py:
* config_from_play_context() and config_from_host_vars() build up a
huge dictionary containing either more or less PlayContext contents,
or our best attempt at reconstructing a host's connection config
from its hostvars, where that config is not the current
WorkerProcess target.
They both produce the same format with the same keys, allowing
remaining code to have a single input format.
These dicts contain fields named after how Ansible refers to them,
e.g. "sudo_exe".
* _config_from_via() parses a basic connection specification like
"username@inventory_name" into one of the aforementioned dicts.
* _stack_from_config() produces a list of dicts describing the order
in which (Mitogen) connections should be established, such that each
element is proxied via= the previous element. The dicts produced by
this function use Mitogen keyword arguments, the former di.
These dicts contain fields named after how Mitogen refers to them,
e.g. "sudo_path".
* Pass the stack to ContextService, which is responsible for actual
setup of the full chain.
ansible_mitogen/services.py:
Teach get() to walk the supplied stack, establishing each connection
in turn, creating refounts for it before continuing.
TODO: refcounting is broken in a variety of cases.
7 years ago
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
def _connect_kubectl(spec):
|
|
|
|
"""
|
|
|
|
Return ContextService arguments for a Kubernetes connection.
|
|
|
|
"""
|
|
|
|
return {
|
|
|
|
'method': 'kubectl',
|
|
|
|
'kwargs': {
|
issue #251, #412, #434: fix connection configuration brainwrong
This refactors connection.py to pull the two huge dict-building
functions out into new transport_transport_config.PlayContextSpec and
MitogenViaSpec classes, leaving a lot more room to breath in both files
to figure out exactly how connection configuration should work.
The changes made in 1f21a30 / 3d58832 are updated or completely removed,
the original change was misguided, in a bid to fix connection delegation
taking variables from the wrong place when delegate_to was active.
The Python path no longer defaults to '/usr/bin/python', this does not
appear to be Ansible's normal behaviour. This has changed several times,
so it may have to change again, and it may cause breakage after release.
Connection delegation respects the c.DEFAULT_REMOTE_USER whereas the
previous version simply tried to fetch whatever was in the
'ansible_user' hostvar. Many more connection delegation variables closer
match vanilla's handling, but this still requires more work. Some of the
variables need access to the command line, and upstream are in the
process of changing all that stuff around.
6 years ago
|
|
|
'pod': spec.remote_addr(),
|
|
|
|
'python_path': spec.python_path(),
|
|
|
|
'connect_timeout': spec.ansible_ssh_timeout() or spec.timeout(),
|
|
|
|
'kubectl_path': spec.mitogen_kubectl_path(),
|
|
|
|
'kubectl_args': spec.extra_args(),
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
def _connect_jail(spec):
|
|
|
|
"""
|
|
|
|
Return ContextService arguments for a FreeBSD jail connection.
|
|
|
|
"""
|
|
|
|
return {
|
|
|
|
'method': 'jail',
|
|
|
|
'kwargs': {
|
issue #251, #412, #434: fix connection configuration brainwrong
This refactors connection.py to pull the two huge dict-building
functions out into new transport_transport_config.PlayContextSpec and
MitogenViaSpec classes, leaving a lot more room to breath in both files
to figure out exactly how connection configuration should work.
The changes made in 1f21a30 / 3d58832 are updated or completely removed,
the original change was misguided, in a bid to fix connection delegation
taking variables from the wrong place when delegate_to was active.
The Python path no longer defaults to '/usr/bin/python', this does not
appear to be Ansible's normal behaviour. This has changed several times,
so it may have to change again, and it may cause breakage after release.
Connection delegation respects the c.DEFAULT_REMOTE_USER whereas the
previous version simply tried to fetch whatever was in the
'ansible_user' hostvar. Many more connection delegation variables closer
match vanilla's handling, but this still requires more work. Some of the
variables need access to the command line, and upstream are in the
process of changing all that stuff around.
6 years ago
|
|
|
'username': spec.remote_user(),
|
|
|
|
'container': spec.remote_addr(),
|
|
|
|
'python_path': spec.python_path(),
|
|
|
|
'connect_timeout': spec.ansible_ssh_timeout() or spec.timeout(),
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
def _connect_lxc(spec):
|
|
|
|
"""
|
|
|
|
Return ContextService arguments for an LXC Classic container connection.
|
|
|
|
"""
|
|
|
|
return {
|
|
|
|
'method': 'lxc',
|
|
|
|
'kwargs': {
|
issue #251, #412, #434: fix connection configuration brainwrong
This refactors connection.py to pull the two huge dict-building
functions out into new transport_transport_config.PlayContextSpec and
MitogenViaSpec classes, leaving a lot more room to breath in both files
to figure out exactly how connection configuration should work.
The changes made in 1f21a30 / 3d58832 are updated or completely removed,
the original change was misguided, in a bid to fix connection delegation
taking variables from the wrong place when delegate_to was active.
The Python path no longer defaults to '/usr/bin/python', this does not
appear to be Ansible's normal behaviour. This has changed several times,
so it may have to change again, and it may cause breakage after release.
Connection delegation respects the c.DEFAULT_REMOTE_USER whereas the
previous version simply tried to fetch whatever was in the
'ansible_user' hostvar. Many more connection delegation variables closer
match vanilla's handling, but this still requires more work. Some of the
variables need access to the command line, and upstream are in the
process of changing all that stuff around.
6 years ago
|
|
|
'container': spec.remote_addr(),
|
|
|
|
'python_path': spec.python_path(),
|
|
|
|
'lxc_attach_path': spec.mitogen_lxc_attach_path(),
|
|
|
|
'connect_timeout': spec.ansible_ssh_timeout() or spec.timeout(),
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
def _connect_lxd(spec):
|
|
|
|
"""
|
|
|
|
Return ContextService arguments for an LXD container connection.
|
|
|
|
"""
|
|
|
|
return {
|
|
|
|
'method': 'lxd',
|
|
|
|
'kwargs': {
|
issue #251, #412, #434: fix connection configuration brainwrong
This refactors connection.py to pull the two huge dict-building
functions out into new transport_transport_config.PlayContextSpec and
MitogenViaSpec classes, leaving a lot more room to breath in both files
to figure out exactly how connection configuration should work.
The changes made in 1f21a30 / 3d58832 are updated or completely removed,
the original change was misguided, in a bid to fix connection delegation
taking variables from the wrong place when delegate_to was active.
The Python path no longer defaults to '/usr/bin/python', this does not
appear to be Ansible's normal behaviour. This has changed several times,
so it may have to change again, and it may cause breakage after release.
Connection delegation respects the c.DEFAULT_REMOTE_USER whereas the
previous version simply tried to fetch whatever was in the
'ansible_user' hostvar. Many more connection delegation variables closer
match vanilla's handling, but this still requires more work. Some of the
variables need access to the command line, and upstream are in the
process of changing all that stuff around.
6 years ago
|
|
|
'container': spec.remote_addr(),
|
|
|
|
'python_path': spec.python_path(),
|
|
|
|
'lxc_path': spec.mitogen_lxc_path(),
|
|
|
|
'connect_timeout': spec.ansible_ssh_timeout() or spec.timeout(),
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
def _connect_machinectl(spec):
|
|
|
|
"""
|
|
|
|
Return ContextService arguments for a machinectl connection.
|
|
|
|
"""
|
issue #251, #412, #434: fix connection configuration brainwrong
This refactors connection.py to pull the two huge dict-building
functions out into new transport_transport_config.PlayContextSpec and
MitogenViaSpec classes, leaving a lot more room to breath in both files
to figure out exactly how connection configuration should work.
The changes made in 1f21a30 / 3d58832 are updated or completely removed,
the original change was misguided, in a bid to fix connection delegation
taking variables from the wrong place when delegate_to was active.
The Python path no longer defaults to '/usr/bin/python', this does not
appear to be Ansible's normal behaviour. This has changed several times,
so it may have to change again, and it may cause breakage after release.
Connection delegation respects the c.DEFAULT_REMOTE_USER whereas the
previous version simply tried to fetch whatever was in the
'ansible_user' hostvar. Many more connection delegation variables closer
match vanilla's handling, but this still requires more work. Some of the
variables need access to the command line, and upstream are in the
process of changing all that stuff around.
6 years ago
|
|
|
return _connect_setns(spec, kind='machinectl')
|
|
|
|
|
|
|
|
|
issue #251, #412, #434: fix connection configuration brainwrong
This refactors connection.py to pull the two huge dict-building
functions out into new transport_transport_config.PlayContextSpec and
MitogenViaSpec classes, leaving a lot more room to breath in both files
to figure out exactly how connection configuration should work.
The changes made in 1f21a30 / 3d58832 are updated or completely removed,
the original change was misguided, in a bid to fix connection delegation
taking variables from the wrong place when delegate_to was active.
The Python path no longer defaults to '/usr/bin/python', this does not
appear to be Ansible's normal behaviour. This has changed several times,
so it may have to change again, and it may cause breakage after release.
Connection delegation respects the c.DEFAULT_REMOTE_USER whereas the
previous version simply tried to fetch whatever was in the
'ansible_user' hostvar. Many more connection delegation variables closer
match vanilla's handling, but this still requires more work. Some of the
variables need access to the command line, and upstream are in the
process of changing all that stuff around.
6 years ago
|
|
|
def _connect_setns(spec, kind=None):
|
|
|
|
"""
|
|
|
|
Return ContextService arguments for a mitogen_setns connection.
|
|
|
|
"""
|
|
|
|
return {
|
|
|
|
'method': 'setns',
|
|
|
|
'kwargs': {
|
issue #251, #412, #434: fix connection configuration brainwrong
This refactors connection.py to pull the two huge dict-building
functions out into new transport_transport_config.PlayContextSpec and
MitogenViaSpec classes, leaving a lot more room to breath in both files
to figure out exactly how connection configuration should work.
The changes made in 1f21a30 / 3d58832 are updated or completely removed,
the original change was misguided, in a bid to fix connection delegation
taking variables from the wrong place when delegate_to was active.
The Python path no longer defaults to '/usr/bin/python', this does not
appear to be Ansible's normal behaviour. This has changed several times,
so it may have to change again, and it may cause breakage after release.
Connection delegation respects the c.DEFAULT_REMOTE_USER whereas the
previous version simply tried to fetch whatever was in the
'ansible_user' hostvar. Many more connection delegation variables closer
match vanilla's handling, but this still requires more work. Some of the
variables need access to the command line, and upstream are in the
process of changing all that stuff around.
6 years ago
|
|
|
'container': spec.remote_addr(),
|
|
|
|
'username': spec.remote_user(),
|
|
|
|
'python_path': spec.python_path(),
|
|
|
|
'kind': kind or spec.mitogen_kind(),
|
|
|
|
'docker_path': spec.mitogen_docker_path(),
|
|
|
|
'lxc_path': spec.mitogen_lxc_path(),
|
|
|
|
'lxc_info_path': spec.mitogen_lxc_info_path(),
|
|
|
|
'machinectl_path': spec.mitogen_machinectl_path(),
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
def _connect_su(spec):
|
|
|
|
"""
|
|
|
|
Return ContextService arguments for su as a become method.
|
|
|
|
"""
|
|
|
|
return {
|
|
|
|
'method': 'su',
|
|
|
|
'enable_lru': True,
|
|
|
|
'kwargs': {
|
issue #251, #412, #434: fix connection configuration brainwrong
This refactors connection.py to pull the two huge dict-building
functions out into new transport_transport_config.PlayContextSpec and
MitogenViaSpec classes, leaving a lot more room to breath in both files
to figure out exactly how connection configuration should work.
The changes made in 1f21a30 / 3d58832 are updated or completely removed,
the original change was misguided, in a bid to fix connection delegation
taking variables from the wrong place when delegate_to was active.
The Python path no longer defaults to '/usr/bin/python', this does not
appear to be Ansible's normal behaviour. This has changed several times,
so it may have to change again, and it may cause breakage after release.
Connection delegation respects the c.DEFAULT_REMOTE_USER whereas the
previous version simply tried to fetch whatever was in the
'ansible_user' hostvar. Many more connection delegation variables closer
match vanilla's handling, but this still requires more work. Some of the
variables need access to the command line, and upstream are in the
process of changing all that stuff around.
6 years ago
|
|
|
'username': spec.become_user(),
|
|
|
|
'password': spec.become_pass(),
|
issue #251, #412, #434: fix connection configuration brainwrong
This refactors connection.py to pull the two huge dict-building
functions out into new transport_transport_config.PlayContextSpec and
MitogenViaSpec classes, leaving a lot more room to breath in both files
to figure out exactly how connection configuration should work.
The changes made in 1f21a30 / 3d58832 are updated or completely removed,
the original change was misguided, in a bid to fix connection delegation
taking variables from the wrong place when delegate_to was active.
The Python path no longer defaults to '/usr/bin/python', this does not
appear to be Ansible's normal behaviour. This has changed several times,
so it may have to change again, and it may cause breakage after release.
Connection delegation respects the c.DEFAULT_REMOTE_USER whereas the
previous version simply tried to fetch whatever was in the
'ansible_user' hostvar. Many more connection delegation variables closer
match vanilla's handling, but this still requires more work. Some of the
variables need access to the command line, and upstream are in the
process of changing all that stuff around.
6 years ago
|
|
|
'python_path': spec.python_path(),
|
|
|
|
'su_path': spec.become_exe(),
|
|
|
|
'connect_timeout': spec.timeout(),
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
ansible: connection delegation v1
This implements the first edition of Connection Delegation, where
delegating connection establishment is initially single-threaded.
ansible_mitogen/strategy.py:
ansible_mitogen/plugins/connection/*:
Begin splitting connection.Connection into subclasses, exposing them
directly as "mitogen_ssh", "mitogen_local", etc. connection types.
This is far from removing strategy.py, but it's a tiny start.
ansible_mitogen/connection.py:
* config_from_play_context() and config_from_host_vars() build up a
huge dictionary containing either more or less PlayContext contents,
or our best attempt at reconstructing a host's connection config
from its hostvars, where that config is not the current
WorkerProcess target.
They both produce the same format with the same keys, allowing
remaining code to have a single input format.
These dicts contain fields named after how Ansible refers to them,
e.g. "sudo_exe".
* _config_from_via() parses a basic connection specification like
"username@inventory_name" into one of the aforementioned dicts.
* _stack_from_config() produces a list of dicts describing the order
in which (Mitogen) connections should be established, such that each
element is proxied via= the previous element. The dicts produced by
this function use Mitogen keyword arguments, the former di.
These dicts contain fields named after how Mitogen refers to them,
e.g. "sudo_path".
* Pass the stack to ContextService, which is responsible for actual
setup of the full chain.
ansible_mitogen/services.py:
Teach get() to walk the supplied stack, establishing each connection
in turn, creating refounts for it before continuing.
TODO: refcounting is broken in a variety of cases.
7 years ago
|
|
|
def _connect_sudo(spec):
|
|
|
|
"""
|
|
|
|
Return ContextService arguments for sudo as a become method.
|
|
|
|
"""
|
ansible: connection delegation v1
This implements the first edition of Connection Delegation, where
delegating connection establishment is initially single-threaded.
ansible_mitogen/strategy.py:
ansible_mitogen/plugins/connection/*:
Begin splitting connection.Connection into subclasses, exposing them
directly as "mitogen_ssh", "mitogen_local", etc. connection types.
This is far from removing strategy.py, but it's a tiny start.
ansible_mitogen/connection.py:
* config_from_play_context() and config_from_host_vars() build up a
huge dictionary containing either more or less PlayContext contents,
or our best attempt at reconstructing a host's connection config
from its hostvars, where that config is not the current
WorkerProcess target.
They both produce the same format with the same keys, allowing
remaining code to have a single input format.
These dicts contain fields named after how Ansible refers to them,
e.g. "sudo_exe".
* _config_from_via() parses a basic connection specification like
"username@inventory_name" into one of the aforementioned dicts.
* _stack_from_config() produces a list of dicts describing the order
in which (Mitogen) connections should be established, such that each
element is proxied via= the previous element. The dicts produced by
this function use Mitogen keyword arguments, the former di.
These dicts contain fields named after how Mitogen refers to them,
e.g. "sudo_path".
* Pass the stack to ContextService, which is responsible for actual
setup of the full chain.
ansible_mitogen/services.py:
Teach get() to walk the supplied stack, establishing each connection
in turn, creating refounts for it before continuing.
TODO: refcounting is broken in a variety of cases.
7 years ago
|
|
|
return {
|
|
|
|
'method': 'sudo',
|
|
|
|
'enable_lru': True,
|
ansible: connection delegation v1
This implements the first edition of Connection Delegation, where
delegating connection establishment is initially single-threaded.
ansible_mitogen/strategy.py:
ansible_mitogen/plugins/connection/*:
Begin splitting connection.Connection into subclasses, exposing them
directly as "mitogen_ssh", "mitogen_local", etc. connection types.
This is far from removing strategy.py, but it's a tiny start.
ansible_mitogen/connection.py:
* config_from_play_context() and config_from_host_vars() build up a
huge dictionary containing either more or less PlayContext contents,
or our best attempt at reconstructing a host's connection config
from its hostvars, where that config is not the current
WorkerProcess target.
They both produce the same format with the same keys, allowing
remaining code to have a single input format.
These dicts contain fields named after how Ansible refers to them,
e.g. "sudo_exe".
* _config_from_via() parses a basic connection specification like
"username@inventory_name" into one of the aforementioned dicts.
* _stack_from_config() produces a list of dicts describing the order
in which (Mitogen) connections should be established, such that each
element is proxied via= the previous element. The dicts produced by
this function use Mitogen keyword arguments, the former di.
These dicts contain fields named after how Mitogen refers to them,
e.g. "sudo_path".
* Pass the stack to ContextService, which is responsible for actual
setup of the full chain.
ansible_mitogen/services.py:
Teach get() to walk the supplied stack, establishing each connection
in turn, creating refounts for it before continuing.
TODO: refcounting is broken in a variety of cases.
7 years ago
|
|
|
'kwargs': {
|
issue #251, #412, #434: fix connection configuration brainwrong
This refactors connection.py to pull the two huge dict-building
functions out into new transport_transport_config.PlayContextSpec and
MitogenViaSpec classes, leaving a lot more room to breath in both files
to figure out exactly how connection configuration should work.
The changes made in 1f21a30 / 3d58832 are updated or completely removed,
the original change was misguided, in a bid to fix connection delegation
taking variables from the wrong place when delegate_to was active.
The Python path no longer defaults to '/usr/bin/python', this does not
appear to be Ansible's normal behaviour. This has changed several times,
so it may have to change again, and it may cause breakage after release.
Connection delegation respects the c.DEFAULT_REMOTE_USER whereas the
previous version simply tried to fetch whatever was in the
'ansible_user' hostvar. Many more connection delegation variables closer
match vanilla's handling, but this still requires more work. Some of the
variables need access to the command line, and upstream are in the
process of changing all that stuff around.
6 years ago
|
|
|
'username': spec.become_user(),
|
|
|
|
'password': spec.become_pass(),
|
issue #251, #412, #434: fix connection configuration brainwrong
This refactors connection.py to pull the two huge dict-building
functions out into new transport_transport_config.PlayContextSpec and
MitogenViaSpec classes, leaving a lot more room to breath in both files
to figure out exactly how connection configuration should work.
The changes made in 1f21a30 / 3d58832 are updated or completely removed,
the original change was misguided, in a bid to fix connection delegation
taking variables from the wrong place when delegate_to was active.
The Python path no longer defaults to '/usr/bin/python', this does not
appear to be Ansible's normal behaviour. This has changed several times,
so it may have to change again, and it may cause breakage after release.
Connection delegation respects the c.DEFAULT_REMOTE_USER whereas the
previous version simply tried to fetch whatever was in the
'ansible_user' hostvar. Many more connection delegation variables closer
match vanilla's handling, but this still requires more work. Some of the
variables need access to the command line, and upstream are in the
process of changing all that stuff around.
6 years ago
|
|
|
'python_path': spec.python_path(),
|
|
|
|
'sudo_path': spec.become_exe(),
|
|
|
|
'connect_timeout': spec.timeout(),
|
|
|
|
'sudo_args': spec.sudo_args(),
|
ansible: connection delegation v1
This implements the first edition of Connection Delegation, where
delegating connection establishment is initially single-threaded.
ansible_mitogen/strategy.py:
ansible_mitogen/plugins/connection/*:
Begin splitting connection.Connection into subclasses, exposing them
directly as "mitogen_ssh", "mitogen_local", etc. connection types.
This is far from removing strategy.py, but it's a tiny start.
ansible_mitogen/connection.py:
* config_from_play_context() and config_from_host_vars() build up a
huge dictionary containing either more or less PlayContext contents,
or our best attempt at reconstructing a host's connection config
from its hostvars, where that config is not the current
WorkerProcess target.
They both produce the same format with the same keys, allowing
remaining code to have a single input format.
These dicts contain fields named after how Ansible refers to them,
e.g. "sudo_exe".
* _config_from_via() parses a basic connection specification like
"username@inventory_name" into one of the aforementioned dicts.
* _stack_from_config() produces a list of dicts describing the order
in which (Mitogen) connections should be established, such that each
element is proxied via= the previous element. The dicts produced by
this function use Mitogen keyword arguments, the former di.
These dicts contain fields named after how Mitogen refers to them,
e.g. "sudo_path".
* Pass the stack to ContextService, which is responsible for actual
setup of the full chain.
ansible_mitogen/services.py:
Teach get() to walk the supplied stack, establishing each connection
in turn, creating refounts for it before continuing.
TODO: refcounting is broken in a variety of cases.
7 years ago
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
def _connect_doas(spec):
|
|
|
|
"""
|
|
|
|
Return ContextService arguments for doas as a become method.
|
|
|
|
"""
|
|
|
|
return {
|
|
|
|
'method': 'doas',
|
|
|
|
'enable_lru': True,
|
|
|
|
'kwargs': {
|
issue #251, #412, #434: fix connection configuration brainwrong
This refactors connection.py to pull the two huge dict-building
functions out into new transport_transport_config.PlayContextSpec and
MitogenViaSpec classes, leaving a lot more room to breath in both files
to figure out exactly how connection configuration should work.
The changes made in 1f21a30 / 3d58832 are updated or completely removed,
the original change was misguided, in a bid to fix connection delegation
taking variables from the wrong place when delegate_to was active.
The Python path no longer defaults to '/usr/bin/python', this does not
appear to be Ansible's normal behaviour. This has changed several times,
so it may have to change again, and it may cause breakage after release.
Connection delegation respects the c.DEFAULT_REMOTE_USER whereas the
previous version simply tried to fetch whatever was in the
'ansible_user' hostvar. Many more connection delegation variables closer
match vanilla's handling, but this still requires more work. Some of the
variables need access to the command line, and upstream are in the
process of changing all that stuff around.
6 years ago
|
|
|
'username': spec.become_user(),
|
|
|
|
'password': spec.become_pass(),
|
issue #251, #412, #434: fix connection configuration brainwrong
This refactors connection.py to pull the two huge dict-building
functions out into new transport_transport_config.PlayContextSpec and
MitogenViaSpec classes, leaving a lot more room to breath in both files
to figure out exactly how connection configuration should work.
The changes made in 1f21a30 / 3d58832 are updated or completely removed,
the original change was misguided, in a bid to fix connection delegation
taking variables from the wrong place when delegate_to was active.
The Python path no longer defaults to '/usr/bin/python', this does not
appear to be Ansible's normal behaviour. This has changed several times,
so it may have to change again, and it may cause breakage after release.
Connection delegation respects the c.DEFAULT_REMOTE_USER whereas the
previous version simply tried to fetch whatever was in the
'ansible_user' hostvar. Many more connection delegation variables closer
match vanilla's handling, but this still requires more work. Some of the
variables need access to the command line, and upstream are in the
process of changing all that stuff around.
6 years ago
|
|
|
'python_path': spec.python_path(),
|
|
|
|
'doas_path': spec.become_exe(),
|
|
|
|
'connect_timeout': spec.timeout(),
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
def _connect_mitogen_su(spec):
|
|
|
|
"""
|
|
|
|
Return ContextService arguments for su as a first class connection.
|
|
|
|
"""
|
|
|
|
return {
|
|
|
|
'method': 'su',
|
|
|
|
'kwargs': {
|
issue #251, #412, #434: fix connection configuration brainwrong
This refactors connection.py to pull the two huge dict-building
functions out into new transport_transport_config.PlayContextSpec and
MitogenViaSpec classes, leaving a lot more room to breath in both files
to figure out exactly how connection configuration should work.
The changes made in 1f21a30 / 3d58832 are updated or completely removed,
the original change was misguided, in a bid to fix connection delegation
taking variables from the wrong place when delegate_to was active.
The Python path no longer defaults to '/usr/bin/python', this does not
appear to be Ansible's normal behaviour. This has changed several times,
so it may have to change again, and it may cause breakage after release.
Connection delegation respects the c.DEFAULT_REMOTE_USER whereas the
previous version simply tried to fetch whatever was in the
'ansible_user' hostvar. Many more connection delegation variables closer
match vanilla's handling, but this still requires more work. Some of the
variables need access to the command line, and upstream are in the
process of changing all that stuff around.
6 years ago
|
|
|
'username': spec.remote_user(),
|
|
|
|
'password': spec.password(),
|
issue #251, #412, #434: fix connection configuration brainwrong
This refactors connection.py to pull the two huge dict-building
functions out into new transport_transport_config.PlayContextSpec and
MitogenViaSpec classes, leaving a lot more room to breath in both files
to figure out exactly how connection configuration should work.
The changes made in 1f21a30 / 3d58832 are updated or completely removed,
the original change was misguided, in a bid to fix connection delegation
taking variables from the wrong place when delegate_to was active.
The Python path no longer defaults to '/usr/bin/python', this does not
appear to be Ansible's normal behaviour. This has changed several times,
so it may have to change again, and it may cause breakage after release.
Connection delegation respects the c.DEFAULT_REMOTE_USER whereas the
previous version simply tried to fetch whatever was in the
'ansible_user' hostvar. Many more connection delegation variables closer
match vanilla's handling, but this still requires more work. Some of the
variables need access to the command line, and upstream are in the
process of changing all that stuff around.
6 years ago
|
|
|
'python_path': spec.python_path(),
|
|
|
|
'su_path': spec.become_exe(),
|
|
|
|
'connect_timeout': spec.timeout(),
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
def _connect_mitogen_sudo(spec):
|
|
|
|
"""
|
|
|
|
Return ContextService arguments for sudo as a first class connection.
|
|
|
|
"""
|
|
|
|
return {
|
|
|
|
'method': 'sudo',
|
|
|
|
'kwargs': {
|
issue #251, #412, #434: fix connection configuration brainwrong
This refactors connection.py to pull the two huge dict-building
functions out into new transport_transport_config.PlayContextSpec and
MitogenViaSpec classes, leaving a lot more room to breath in both files
to figure out exactly how connection configuration should work.
The changes made in 1f21a30 / 3d58832 are updated or completely removed,
the original change was misguided, in a bid to fix connection delegation
taking variables from the wrong place when delegate_to was active.
The Python path no longer defaults to '/usr/bin/python', this does not
appear to be Ansible's normal behaviour. This has changed several times,
so it may have to change again, and it may cause breakage after release.
Connection delegation respects the c.DEFAULT_REMOTE_USER whereas the
previous version simply tried to fetch whatever was in the
'ansible_user' hostvar. Many more connection delegation variables closer
match vanilla's handling, but this still requires more work. Some of the
variables need access to the command line, and upstream are in the
process of changing all that stuff around.
6 years ago
|
|
|
'username': spec.remote_user(),
|
|
|
|
'password': spec.password(),
|
issue #251, #412, #434: fix connection configuration brainwrong
This refactors connection.py to pull the two huge dict-building
functions out into new transport_transport_config.PlayContextSpec and
MitogenViaSpec classes, leaving a lot more room to breath in both files
to figure out exactly how connection configuration should work.
The changes made in 1f21a30 / 3d58832 are updated or completely removed,
the original change was misguided, in a bid to fix connection delegation
taking variables from the wrong place when delegate_to was active.
The Python path no longer defaults to '/usr/bin/python', this does not
appear to be Ansible's normal behaviour. This has changed several times,
so it may have to change again, and it may cause breakage after release.
Connection delegation respects the c.DEFAULT_REMOTE_USER whereas the
previous version simply tried to fetch whatever was in the
'ansible_user' hostvar. Many more connection delegation variables closer
match vanilla's handling, but this still requires more work. Some of the
variables need access to the command line, and upstream are in the
process of changing all that stuff around.
6 years ago
|
|
|
'python_path': spec.python_path(),
|
|
|
|
'sudo_path': spec.become_exe(),
|
|
|
|
'connect_timeout': spec.timeout(),
|
|
|
|
'sudo_args': spec.sudo_args(),
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
def _connect_mitogen_doas(spec):
|
|
|
|
"""
|
|
|
|
Return ContextService arguments for doas as a first class connection.
|
|
|
|
"""
|
|
|
|
return {
|
|
|
|
'method': 'doas',
|
|
|
|
'kwargs': {
|
issue #251, #412, #434: fix connection configuration brainwrong
This refactors connection.py to pull the two huge dict-building
functions out into new transport_transport_config.PlayContextSpec and
MitogenViaSpec classes, leaving a lot more room to breath in both files
to figure out exactly how connection configuration should work.
The changes made in 1f21a30 / 3d58832 are updated or completely removed,
the original change was misguided, in a bid to fix connection delegation
taking variables from the wrong place when delegate_to was active.
The Python path no longer defaults to '/usr/bin/python', this does not
appear to be Ansible's normal behaviour. This has changed several times,
so it may have to change again, and it may cause breakage after release.
Connection delegation respects the c.DEFAULT_REMOTE_USER whereas the
previous version simply tried to fetch whatever was in the
'ansible_user' hostvar. Many more connection delegation variables closer
match vanilla's handling, but this still requires more work. Some of the
variables need access to the command line, and upstream are in the
process of changing all that stuff around.
6 years ago
|
|
|
'username': spec.remote_user(),
|
|
|
|
'password': spec.password(),
|
issue #251, #412, #434: fix connection configuration brainwrong
This refactors connection.py to pull the two huge dict-building
functions out into new transport_transport_config.PlayContextSpec and
MitogenViaSpec classes, leaving a lot more room to breath in both files
to figure out exactly how connection configuration should work.
The changes made in 1f21a30 / 3d58832 are updated or completely removed,
the original change was misguided, in a bid to fix connection delegation
taking variables from the wrong place when delegate_to was active.
The Python path no longer defaults to '/usr/bin/python', this does not
appear to be Ansible's normal behaviour. This has changed several times,
so it may have to change again, and it may cause breakage after release.
Connection delegation respects the c.DEFAULT_REMOTE_USER whereas the
previous version simply tried to fetch whatever was in the
'ansible_user' hostvar. Many more connection delegation variables closer
match vanilla's handling, but this still requires more work. Some of the
variables need access to the command line, and upstream are in the
process of changing all that stuff around.
6 years ago
|
|
|
'python_path': spec.python_path(),
|
|
|
|
'doas_path': spec.become_exe(),
|
|
|
|
'connect_timeout': spec.timeout(),
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
#: Mapping of connection method names to functions invoked as `func(spec)`
|
|
|
|
#: generating ContextService keyword arguments matching a connection
|
|
|
|
#: specification.
|
ansible: connection delegation v1
This implements the first edition of Connection Delegation, where
delegating connection establishment is initially single-threaded.
ansible_mitogen/strategy.py:
ansible_mitogen/plugins/connection/*:
Begin splitting connection.Connection into subclasses, exposing them
directly as "mitogen_ssh", "mitogen_local", etc. connection types.
This is far from removing strategy.py, but it's a tiny start.
ansible_mitogen/connection.py:
* config_from_play_context() and config_from_host_vars() build up a
huge dictionary containing either more or less PlayContext contents,
or our best attempt at reconstructing a host's connection config
from its hostvars, where that config is not the current
WorkerProcess target.
They both produce the same format with the same keys, allowing
remaining code to have a single input format.
These dicts contain fields named after how Ansible refers to them,
e.g. "sudo_exe".
* _config_from_via() parses a basic connection specification like
"username@inventory_name" into one of the aforementioned dicts.
* _stack_from_config() produces a list of dicts describing the order
in which (Mitogen) connections should be established, such that each
element is proxied via= the previous element. The dicts produced by
this function use Mitogen keyword arguments, the former di.
These dicts contain fields named after how Mitogen refers to them,
e.g. "sudo_path".
* Pass the stack to ContextService, which is responsible for actual
setup of the full chain.
ansible_mitogen/services.py:
Teach get() to walk the supplied stack, establishing each connection
in turn, creating refounts for it before continuing.
TODO: refcounting is broken in a variety of cases.
7 years ago
|
|
|
CONNECTION_METHOD = {
|
|
|
|
'docker': _connect_docker,
|
|
|
|
'kubectl': _connect_kubectl,
|
|
|
|
'jail': _connect_jail,
|
|
|
|
'local': _connect_local,
|
|
|
|
'lxc': _connect_lxc,
|
|
|
|
'lxd': _connect_lxd,
|
|
|
|
'machinectl': _connect_machinectl,
|
|
|
|
'setns': _connect_setns,
|
|
|
|
'ssh': _connect_ssh,
|
|
|
|
'su': _connect_su,
|
|
|
|
'sudo': _connect_sudo,
|
|
|
|
'doas': _connect_doas,
|
|
|
|
'mitogen_su': _connect_mitogen_su,
|
|
|
|
'mitogen_sudo': _connect_mitogen_sudo,
|
|
|
|
'mitogen_doas': _connect_mitogen_doas,
|
ansible: connection delegation v1
This implements the first edition of Connection Delegation, where
delegating connection establishment is initially single-threaded.
ansible_mitogen/strategy.py:
ansible_mitogen/plugins/connection/*:
Begin splitting connection.Connection into subclasses, exposing them
directly as "mitogen_ssh", "mitogen_local", etc. connection types.
This is far from removing strategy.py, but it's a tiny start.
ansible_mitogen/connection.py:
* config_from_play_context() and config_from_host_vars() build up a
huge dictionary containing either more or less PlayContext contents,
or our best attempt at reconstructing a host's connection config
from its hostvars, where that config is not the current
WorkerProcess target.
They both produce the same format with the same keys, allowing
remaining code to have a single input format.
These dicts contain fields named after how Ansible refers to them,
e.g. "sudo_exe".
* _config_from_via() parses a basic connection specification like
"username@inventory_name" into one of the aforementioned dicts.
* _stack_from_config() produces a list of dicts describing the order
in which (Mitogen) connections should be established, such that each
element is proxied via= the previous element. The dicts produced by
this function use Mitogen keyword arguments, the former di.
These dicts contain fields named after how Mitogen refers to them,
e.g. "sudo_path".
* Pass the stack to ContextService, which is responsible for actual
setup of the full chain.
ansible_mitogen/services.py:
Teach get() to walk the supplied stack, establishing each connection
in turn, creating refounts for it before continuing.
TODO: refcounting is broken in a variety of cases.
7 years ago
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
class Broker(mitogen.master.Broker):
|
|
|
|
"""
|
|
|
|
WorkerProcess maintains at most 2 file descriptors, therefore does not need
|
|
|
|
the exuberant syscall expense of EpollPoller, so override it and restore
|
|
|
|
the poll() poller.
|
|
|
|
"""
|
|
|
|
poller_class = mitogen.core.Poller
|
|
|
|
|
|
|
|
|
|
|
|
class CallChain(mitogen.parent.CallChain):
|
|
|
|
"""
|
|
|
|
Extend :class:`mitogen.parent.CallChain` to additionally cause the
|
|
|
|
associated :class:`Connection` to be reset if a ChannelError occurs.
|
|
|
|
|
|
|
|
This only catches failures that occur while a call is pending, it is a
|
|
|
|
stop-gap until a more general method is available to notice connection in
|
|
|
|
every situation.
|
|
|
|
"""
|
|
|
|
call_aborted_msg = (
|
|
|
|
'Mitogen was disconnected from the remote environment while a call '
|
|
|
|
'was in-progress. If you feel this is in error, please file a bug. '
|
|
|
|
'Original error was: %s'
|
|
|
|
)
|
|
|
|
|
|
|
|
def __init__(self, connection, context, pipelined=False):
|
|
|
|
super(CallChain, self).__init__(context, pipelined)
|
|
|
|
#: The connection to reset on CallError.
|
|
|
|
self._connection = connection
|
|
|
|
|
|
|
|
def _rethrow(self, recv):
|
|
|
|
try:
|
|
|
|
return recv.get().unpickle()
|
|
|
|
except mitogen.core.ChannelError as e:
|
|
|
|
self._connection.reset()
|
|
|
|
raise ansible.errors.AnsibleConnectionFailure(
|
|
|
|
self.call_aborted_msg % (e,)
|
|
|
|
)
|
|
|
|
|
|
|
|
def call(self, func, *args, **kwargs):
|
|
|
|
"""
|
|
|
|
Like :meth:`mitogen.parent.CallChain.call`, but log timings.
|
|
|
|
"""
|
|
|
|
t0 = time.time()
|
|
|
|
try:
|
|
|
|
recv = self.call_async(func, *args, **kwargs)
|
|
|
|
return self._rethrow(recv)
|
|
|
|
finally:
|
|
|
|
LOG.debug('Call took %d ms: %r', 1000 * (time.time() - t0),
|
|
|
|
mitogen.parent.CallSpec(func, args, kwargs))
|
|
|
|
|
|
|
|
|
|
|
|
class Connection(ansible.plugins.connection.ConnectionBase):
|
|
|
|
#: mitogen.master.Broker for this worker.
|
|
|
|
broker = None
|
|
|
|
|
|
|
|
#: mitogen.master.Router for this worker.
|
|
|
|
router = None
|
|
|
|
|
|
|
|
#: mitogen.parent.Context representing the parent Context, which is
|
|
|
|
#: presently always the connection multiplexer process.
|
|
|
|
parent = None
|
|
|
|
|
|
|
|
#: mitogen.parent.Context for the target account on the target, possibly
|
|
|
|
#: reached via become.
|
|
|
|
context = None
|
|
|
|
|
|
|
|
#: Context for the login account on the target. This is always the login
|
|
|
|
#: account, even when become=True.
|
|
|
|
login_context = None
|
|
|
|
|
|
|
|
#: Only sudo, su, and doas are supported for now.
|
|
|
|
become_methods = ['sudo', 'su', 'doas']
|
|
|
|
|
|
|
|
#: Dict containing init_child() return value as recorded at startup by
|
|
|
|
#: ContextService. Contains:
|
|
|
|
#:
|
|
|
|
#: fork_context: Context connected to the fork parent : process in the
|
|
|
|
#: target account.
|
|
|
|
#: home_dir: Target context's home directory.
|
|
|
|
#: good_temp_dir: A writeable directory where new temporary directories
|
|
|
|
#: can be created.
|
|
|
|
init_child_result = None
|
|
|
|
|
|
|
|
#: A :class:`mitogen.parent.CallChain` for calls made to the target
|
|
|
|
#: account, to ensure subsequent calls fail with the original exception if
|
|
|
|
#: pipelined directory creation or file transfer fails.
|
|
|
|
chain = None
|
|
|
|
|
|
|
|
#
|
|
|
|
# Note: any of the attributes below may be :data:`None` if the connection
|
|
|
|
# plugin was constructed directly by a non-cooperative action, such as in
|
|
|
|
# the case of the synchronize module.
|
|
|
|
#
|
|
|
|
|
|
|
|
#: Set to the host name as it appears in inventory by on_action_run().
|
|
|
|
inventory_hostname = None
|
|
|
|
|
|
|
|
#: Set to task_vars by on_action_run().
|
|
|
|
_task_vars = None
|
ansible: connection delegation v1
This implements the first edition of Connection Delegation, where
delegating connection establishment is initially single-threaded.
ansible_mitogen/strategy.py:
ansible_mitogen/plugins/connection/*:
Begin splitting connection.Connection into subclasses, exposing them
directly as "mitogen_ssh", "mitogen_local", etc. connection types.
This is far from removing strategy.py, but it's a tiny start.
ansible_mitogen/connection.py:
* config_from_play_context() and config_from_host_vars() build up a
huge dictionary containing either more or less PlayContext contents,
or our best attempt at reconstructing a host's connection config
from its hostvars, where that config is not the current
WorkerProcess target.
They both produce the same format with the same keys, allowing
remaining code to have a single input format.
These dicts contain fields named after how Ansible refers to them,
e.g. "sudo_exe".
* _config_from_via() parses a basic connection specification like
"username@inventory_name" into one of the aforementioned dicts.
* _stack_from_config() produces a list of dicts describing the order
in which (Mitogen) connections should be established, such that each
element is proxied via= the previous element. The dicts produced by
this function use Mitogen keyword arguments, the former di.
These dicts contain fields named after how Mitogen refers to them,
e.g. "sudo_path".
* Pass the stack to ContextService, which is responsible for actual
setup of the full chain.
ansible_mitogen/services.py:
Teach get() to walk the supplied stack, establishing each connection
in turn, creating refounts for it before continuing.
TODO: refcounting is broken in a variety of cases.
7 years ago
|
|
|
|
|
|
|
#: Set to 'hostvars' by on_action_run()
|
|
|
|
host_vars = None
|
|
|
|
|
|
|
|
#: Set by on_action_run()
|
|
|
|
delegate_to_hostname = None
|
|
|
|
|
|
|
|
#: Set to '_loader.get_basedir()' by on_action_run(). Used by mitogen_local
|
|
|
|
#: to change the working directory to that of the current playbook,
|
|
|
|
#: matching vanilla Ansible behaviour.
|
|
|
|
loader_basedir = None
|
|
|
|
|
ansible: connection delegation v1
This implements the first edition of Connection Delegation, where
delegating connection establishment is initially single-threaded.
ansible_mitogen/strategy.py:
ansible_mitogen/plugins/connection/*:
Begin splitting connection.Connection into subclasses, exposing them
directly as "mitogen_ssh", "mitogen_local", etc. connection types.
This is far from removing strategy.py, but it's a tiny start.
ansible_mitogen/connection.py:
* config_from_play_context() and config_from_host_vars() build up a
huge dictionary containing either more or less PlayContext contents,
or our best attempt at reconstructing a host's connection config
from its hostvars, where that config is not the current
WorkerProcess target.
They both produce the same format with the same keys, allowing
remaining code to have a single input format.
These dicts contain fields named after how Ansible refers to them,
e.g. "sudo_exe".
* _config_from_via() parses a basic connection specification like
"username@inventory_name" into one of the aforementioned dicts.
* _stack_from_config() produces a list of dicts describing the order
in which (Mitogen) connections should be established, such that each
element is proxied via= the previous element. The dicts produced by
this function use Mitogen keyword arguments, the former di.
These dicts contain fields named after how Mitogen refers to them,
e.g. "sudo_path".
* Pass the stack to ContextService, which is responsible for actual
setup of the full chain.
ansible_mitogen/services.py:
Teach get() to walk the supplied stack, establishing each connection
in turn, creating refounts for it before continuing.
TODO: refcounting is broken in a variety of cases.
7 years ago
|
|
|
def __init__(self, play_context, new_stdin, **kwargs):
|
|
|
|
assert ansible_mitogen.process.MuxProcess.unix_listener_path, (
|
ansible: connection delegation v1
This implements the first edition of Connection Delegation, where
delegating connection establishment is initially single-threaded.
ansible_mitogen/strategy.py:
ansible_mitogen/plugins/connection/*:
Begin splitting connection.Connection into subclasses, exposing them
directly as "mitogen_ssh", "mitogen_local", etc. connection types.
This is far from removing strategy.py, but it's a tiny start.
ansible_mitogen/connection.py:
* config_from_play_context() and config_from_host_vars() build up a
huge dictionary containing either more or less PlayContext contents,
or our best attempt at reconstructing a host's connection config
from its hostvars, where that config is not the current
WorkerProcess target.
They both produce the same format with the same keys, allowing
remaining code to have a single input format.
These dicts contain fields named after how Ansible refers to them,
e.g. "sudo_exe".
* _config_from_via() parses a basic connection specification like
"username@inventory_name" into one of the aforementioned dicts.
* _stack_from_config() produces a list of dicts describing the order
in which (Mitogen) connections should be established, such that each
element is proxied via= the previous element. The dicts produced by
this function use Mitogen keyword arguments, the former di.
These dicts contain fields named after how Mitogen refers to them,
e.g. "sudo_path".
* Pass the stack to ContextService, which is responsible for actual
setup of the full chain.
ansible_mitogen/services.py:
Teach get() to walk the supplied stack, establishing each connection
in turn, creating refounts for it before continuing.
TODO: refcounting is broken in a variety of cases.
7 years ago
|
|
|
'Mitogen connection types may only be instantiated '
|
|
|
|
'while the "mitogen" strategy is active.'
|
|
|
|
)
|
|
|
|
super(Connection, self).__init__(play_context, new_stdin)
|
|
|
|
|
|
|
|
def __del__(self):
|
|
|
|
"""
|
|
|
|
Ansible cannot be trusted to always call close() e.g. the synchronize
|
|
|
|
action constructs a local connection like this. So provide a destructor
|
|
|
|
in the hopes of catching these cases.
|
|
|
|
"""
|
|
|
|
# https://github.com/dw/mitogen/issues/140
|
|
|
|
self.close()
|
|
|
|
|
|
|
|
def on_action_run(self, task_vars, delegate_to_hostname, loader_basedir):
|
|
|
|
"""
|
|
|
|
Invoked by ActionModuleMixin to indicate a new task is about to start
|
|
|
|
executing. We use the opportunity to grab relevant bits from the
|
|
|
|
task-specific data.
|
|
|
|
|
|
|
|
:param dict task_vars:
|
|
|
|
Task variable dictionary.
|
|
|
|
:param str delegate_to_hostname:
|
|
|
|
:data:`None`, or the template-expanded inventory hostname this task
|
|
|
|
is being delegated to. A similar variable exists on PlayContext
|
|
|
|
when ``delegate_to:`` is active, however it is unexpanded.
|
|
|
|
:param str loader_basedir:
|
|
|
|
Loader base directory; see :attr:`loader_basedir`.
|
|
|
|
"""
|
ansible: connection delegation v1
This implements the first edition of Connection Delegation, where
delegating connection establishment is initially single-threaded.
ansible_mitogen/strategy.py:
ansible_mitogen/plugins/connection/*:
Begin splitting connection.Connection into subclasses, exposing them
directly as "mitogen_ssh", "mitogen_local", etc. connection types.
This is far from removing strategy.py, but it's a tiny start.
ansible_mitogen/connection.py:
* config_from_play_context() and config_from_host_vars() build up a
huge dictionary containing either more or less PlayContext contents,
or our best attempt at reconstructing a host's connection config
from its hostvars, where that config is not the current
WorkerProcess target.
They both produce the same format with the same keys, allowing
remaining code to have a single input format.
These dicts contain fields named after how Ansible refers to them,
e.g. "sudo_exe".
* _config_from_via() parses a basic connection specification like
"username@inventory_name" into one of the aforementioned dicts.
* _stack_from_config() produces a list of dicts describing the order
in which (Mitogen) connections should be established, such that each
element is proxied via= the previous element. The dicts produced by
this function use Mitogen keyword arguments, the former di.
These dicts contain fields named after how Mitogen refers to them,
e.g. "sudo_path".
* Pass the stack to ContextService, which is responsible for actual
setup of the full chain.
ansible_mitogen/services.py:
Teach get() to walk the supplied stack, establishing each connection
in turn, creating refounts for it before continuing.
TODO: refcounting is broken in a variety of cases.
7 years ago
|
|
|
self.inventory_hostname = task_vars['inventory_hostname']
|
|
|
|
self._task_vars = task_vars
|
ansible: connection delegation v1
This implements the first edition of Connection Delegation, where
delegating connection establishment is initially single-threaded.
ansible_mitogen/strategy.py:
ansible_mitogen/plugins/connection/*:
Begin splitting connection.Connection into subclasses, exposing them
directly as "mitogen_ssh", "mitogen_local", etc. connection types.
This is far from removing strategy.py, but it's a tiny start.
ansible_mitogen/connection.py:
* config_from_play_context() and config_from_host_vars() build up a
huge dictionary containing either more or less PlayContext contents,
or our best attempt at reconstructing a host's connection config
from its hostvars, where that config is not the current
WorkerProcess target.
They both produce the same format with the same keys, allowing
remaining code to have a single input format.
These dicts contain fields named after how Ansible refers to them,
e.g. "sudo_exe".
* _config_from_via() parses a basic connection specification like
"username@inventory_name" into one of the aforementioned dicts.
* _stack_from_config() produces a list of dicts describing the order
in which (Mitogen) connections should be established, such that each
element is proxied via= the previous element. The dicts produced by
this function use Mitogen keyword arguments, the former di.
These dicts contain fields named after how Mitogen refers to them,
e.g. "sudo_path".
* Pass the stack to ContextService, which is responsible for actual
setup of the full chain.
ansible_mitogen/services.py:
Teach get() to walk the supplied stack, establishing each connection
in turn, creating refounts for it before continuing.
TODO: refcounting is broken in a variety of cases.
7 years ago
|
|
|
self.host_vars = task_vars['hostvars']
|
|
|
|
self.delegate_to_hostname = delegate_to_hostname
|
|
|
|
self.loader_basedir = loader_basedir
|
|
|
|
self._mitogen_reset(mode='put')
|
|
|
|
|
|
|
|
def get_task_var(self, key, default=None):
|
issue #251, #412, #434: fix connection configuration brainwrong
This refactors connection.py to pull the two huge dict-building
functions out into new transport_transport_config.PlayContextSpec and
MitogenViaSpec classes, leaving a lot more room to breath in both files
to figure out exactly how connection configuration should work.
The changes made in 1f21a30 / 3d58832 are updated or completely removed,
the original change was misguided, in a bid to fix connection delegation
taking variables from the wrong place when delegate_to was active.
The Python path no longer defaults to '/usr/bin/python', this does not
appear to be Ansible's normal behaviour. This has changed several times,
so it may have to change again, and it may cause breakage after release.
Connection delegation respects the c.DEFAULT_REMOTE_USER whereas the
previous version simply tried to fetch whatever was in the
'ansible_user' hostvar. Many more connection delegation variables closer
match vanilla's handling, but this still requires more work. Some of the
variables need access to the command line, and upstream are in the
process of changing all that stuff around.
6 years ago
|
|
|
"""
|
|
|
|
Fetch the value of a task variable related to connection configuration,
|
|
|
|
or, if delegate_to is active, fetch the same variable via HostVars for
|
|
|
|
the delegated-to machine.
|
|
|
|
|
|
|
|
When running with delegate_to, Ansible tasks have variables associated
|
|
|
|
with the original machine, not the delegated-to machine, therefore it
|
|
|
|
does not make sense to extract connection-related configuration for the
|
|
|
|
delegated-to machine from them.
|
issue #251, #412, #434: fix connection configuration brainwrong
This refactors connection.py to pull the two huge dict-building
functions out into new transport_transport_config.PlayContextSpec and
MitogenViaSpec classes, leaving a lot more room to breath in both files
to figure out exactly how connection configuration should work.
The changes made in 1f21a30 / 3d58832 are updated or completely removed,
the original change was misguided, in a bid to fix connection delegation
taking variables from the wrong place when delegate_to was active.
The Python path no longer defaults to '/usr/bin/python', this does not
appear to be Ansible's normal behaviour. This has changed several times,
so it may have to change again, and it may cause breakage after release.
Connection delegation respects the c.DEFAULT_REMOTE_USER whereas the
previous version simply tried to fetch whatever was in the
'ansible_user' hostvar. Many more connection delegation variables closer
match vanilla's handling, but this still requires more work. Some of the
variables need access to the command line, and upstream are in the
process of changing all that stuff around.
6 years ago
|
|
|
"""
|
|
|
|
if self._task_vars:
|
|
|
|
if self.delegate_to_hostname is None:
|
|
|
|
if key in self._task_vars:
|
|
|
|
return self._task_vars[key]
|
|
|
|
else:
|
|
|
|
delegated_vars = self._task_vars['ansible_delegated_vars']
|
|
|
|
if self.delegate_to_hostname in delegated_vars:
|
|
|
|
task_vars = delegated_vars[self.delegate_to_hostname]
|
|
|
|
if key in task_vars:
|
|
|
|
return task_vars[key]
|
|
|
|
|
|
|
|
return default
|
|
|
|
|
|
|
|
@property
|
|
|
|
def homedir(self):
|
|
|
|
self._connect()
|
|
|
|
return self.init_child_result['home_dir']
|
|
|
|
|
|
|
|
@property
|
|
|
|
def connected(self):
|
|
|
|
return self.context is not None
|
|
|
|
|
|
|
|
def _spec_from_via(self, proxied_inventory_name, via_spec):
|
|
|
|
"""
|
|
|
|
Produce a dict connection specifiction given a string `via_spec`, of
|
|
|
|
the form `[[become_method:]become_user@]inventory_hostname`.
|
|
|
|
"""
|
ansible: connection delegation v1
This implements the first edition of Connection Delegation, where
delegating connection establishment is initially single-threaded.
ansible_mitogen/strategy.py:
ansible_mitogen/plugins/connection/*:
Begin splitting connection.Connection into subclasses, exposing them
directly as "mitogen_ssh", "mitogen_local", etc. connection types.
This is far from removing strategy.py, but it's a tiny start.
ansible_mitogen/connection.py:
* config_from_play_context() and config_from_host_vars() build up a
huge dictionary containing either more or less PlayContext contents,
or our best attempt at reconstructing a host's connection config
from its hostvars, where that config is not the current
WorkerProcess target.
They both produce the same format with the same keys, allowing
remaining code to have a single input format.
These dicts contain fields named after how Ansible refers to them,
e.g. "sudo_exe".
* _config_from_via() parses a basic connection specification like
"username@inventory_name" into one of the aforementioned dicts.
* _stack_from_config() produces a list of dicts describing the order
in which (Mitogen) connections should be established, such that each
element is proxied via= the previous element. The dicts produced by
this function use Mitogen keyword arguments, the former di.
These dicts contain fields named after how Mitogen refers to them,
e.g. "sudo_path".
* Pass the stack to ContextService, which is responsible for actual
setup of the full chain.
ansible_mitogen/services.py:
Teach get() to walk the supplied stack, establishing each connection
in turn, creating refounts for it before continuing.
TODO: refcounting is broken in a variety of cases.
7 years ago
|
|
|
become_user, _, inventory_name = via_spec.rpartition('@')
|
issue #251, #412, #434: fix connection configuration brainwrong
This refactors connection.py to pull the two huge dict-building
functions out into new transport_transport_config.PlayContextSpec and
MitogenViaSpec classes, leaving a lot more room to breath in both files
to figure out exactly how connection configuration should work.
The changes made in 1f21a30 / 3d58832 are updated or completely removed,
the original change was misguided, in a bid to fix connection delegation
taking variables from the wrong place when delegate_to was active.
The Python path no longer defaults to '/usr/bin/python', this does not
appear to be Ansible's normal behaviour. This has changed several times,
so it may have to change again, and it may cause breakage after release.
Connection delegation respects the c.DEFAULT_REMOTE_USER whereas the
previous version simply tried to fetch whatever was in the
'ansible_user' hostvar. Many more connection delegation variables closer
match vanilla's handling, but this still requires more work. Some of the
variables need access to the command line, and upstream are in the
process of changing all that stuff around.
6 years ago
|
|
|
become_method, _, become_user = become_user.rpartition(':')
|
|
|
|
|
|
|
|
# must use __contains__ to avoid a TypeError for a missing host on
|
|
|
|
# Ansible 2.3.
|
|
|
|
if self.host_vars is None or inventory_name not in self.host_vars:
|
ansible: connection delegation v1
This implements the first edition of Connection Delegation, where
delegating connection establishment is initially single-threaded.
ansible_mitogen/strategy.py:
ansible_mitogen/plugins/connection/*:
Begin splitting connection.Connection into subclasses, exposing them
directly as "mitogen_ssh", "mitogen_local", etc. connection types.
This is far from removing strategy.py, but it's a tiny start.
ansible_mitogen/connection.py:
* config_from_play_context() and config_from_host_vars() build up a
huge dictionary containing either more or less PlayContext contents,
or our best attempt at reconstructing a host's connection config
from its hostvars, where that config is not the current
WorkerProcess target.
They both produce the same format with the same keys, allowing
remaining code to have a single input format.
These dicts contain fields named after how Ansible refers to them,
e.g. "sudo_exe".
* _config_from_via() parses a basic connection specification like
"username@inventory_name" into one of the aforementioned dicts.
* _stack_from_config() produces a list of dicts describing the order
in which (Mitogen) connections should be established, such that each
element is proxied via= the previous element. The dicts produced by
this function use Mitogen keyword arguments, the former di.
These dicts contain fields named after how Mitogen refers to them,
e.g. "sudo_path".
* Pass the stack to ContextService, which is responsible for actual
setup of the full chain.
ansible_mitogen/services.py:
Teach get() to walk the supplied stack, establishing each connection
in turn, creating refounts for it before continuing.
TODO: refcounting is broken in a variety of cases.
7 years ago
|
|
|
raise ansible.errors.AnsibleConnectionFailure(
|
|
|
|
self.unknown_via_msg % (
|
|
|
|
via_spec,
|
|
|
|
proxied_inventory_name,
|
ansible: connection delegation v1
This implements the first edition of Connection Delegation, where
delegating connection establishment is initially single-threaded.
ansible_mitogen/strategy.py:
ansible_mitogen/plugins/connection/*:
Begin splitting connection.Connection into subclasses, exposing them
directly as "mitogen_ssh", "mitogen_local", etc. connection types.
This is far from removing strategy.py, but it's a tiny start.
ansible_mitogen/connection.py:
* config_from_play_context() and config_from_host_vars() build up a
huge dictionary containing either more or less PlayContext contents,
or our best attempt at reconstructing a host's connection config
from its hostvars, where that config is not the current
WorkerProcess target.
They both produce the same format with the same keys, allowing
remaining code to have a single input format.
These dicts contain fields named after how Ansible refers to them,
e.g. "sudo_exe".
* _config_from_via() parses a basic connection specification like
"username@inventory_name" into one of the aforementioned dicts.
* _stack_from_config() produces a list of dicts describing the order
in which (Mitogen) connections should be established, such that each
element is proxied via= the previous element. The dicts produced by
this function use Mitogen keyword arguments, the former di.
These dicts contain fields named after how Mitogen refers to them,
e.g. "sudo_path".
* Pass the stack to ContextService, which is responsible for actual
setup of the full chain.
ansible_mitogen/services.py:
Teach get() to walk the supplied stack, establishing each connection
in turn, creating refounts for it before continuing.
TODO: refcounting is broken in a variety of cases.
7 years ago
|
|
|
)
|
|
|
|
)
|
|
|
|
|
|
|
|
via_vars = self.host_vars[inventory_name]
|
issue #251, #412, #434: fix connection configuration brainwrong
This refactors connection.py to pull the two huge dict-building
functions out into new transport_transport_config.PlayContextSpec and
MitogenViaSpec classes, leaving a lot more room to breath in both files
to figure out exactly how connection configuration should work.
The changes made in 1f21a30 / 3d58832 are updated or completely removed,
the original change was misguided, in a bid to fix connection delegation
taking variables from the wrong place when delegate_to was active.
The Python path no longer defaults to '/usr/bin/python', this does not
appear to be Ansible's normal behaviour. This has changed several times,
so it may have to change again, and it may cause breakage after release.
Connection delegation respects the c.DEFAULT_REMOTE_USER whereas the
previous version simply tried to fetch whatever was in the
'ansible_user' hostvar. Many more connection delegation variables closer
match vanilla's handling, but this still requires more work. Some of the
variables need access to the command line, and upstream are in the
process of changing all that stuff around.
6 years ago
|
|
|
return ansible_mitogen.transport_config.MitogenViaSpec(
|
ansible: connection delegation v1
This implements the first edition of Connection Delegation, where
delegating connection establishment is initially single-threaded.
ansible_mitogen/strategy.py:
ansible_mitogen/plugins/connection/*:
Begin splitting connection.Connection into subclasses, exposing them
directly as "mitogen_ssh", "mitogen_local", etc. connection types.
This is far from removing strategy.py, but it's a tiny start.
ansible_mitogen/connection.py:
* config_from_play_context() and config_from_host_vars() build up a
huge dictionary containing either more or less PlayContext contents,
or our best attempt at reconstructing a host's connection config
from its hostvars, where that config is not the current
WorkerProcess target.
They both produce the same format with the same keys, allowing
remaining code to have a single input format.
These dicts contain fields named after how Ansible refers to them,
e.g. "sudo_exe".
* _config_from_via() parses a basic connection specification like
"username@inventory_name" into one of the aforementioned dicts.
* _stack_from_config() produces a list of dicts describing the order
in which (Mitogen) connections should be established, such that each
element is proxied via= the previous element. The dicts produced by
this function use Mitogen keyword arguments, the former di.
These dicts contain fields named after how Mitogen refers to them,
e.g. "sudo_path".
* Pass the stack to ContextService, which is responsible for actual
setup of the full chain.
ansible_mitogen/services.py:
Teach get() to walk the supplied stack, establishing each connection
in turn, creating refounts for it before continuing.
TODO: refcounting is broken in a variety of cases.
7 years ago
|
|
|
inventory_name=inventory_name,
|
|
|
|
play_context=self._play_context,
|
issue #251, #412, #434: fix connection configuration brainwrong
This refactors connection.py to pull the two huge dict-building
functions out into new transport_transport_config.PlayContextSpec and
MitogenViaSpec classes, leaving a lot more room to breath in both files
to figure out exactly how connection configuration should work.
The changes made in 1f21a30 / 3d58832 are updated or completely removed,
the original change was misguided, in a bid to fix connection delegation
taking variables from the wrong place when delegate_to was active.
The Python path no longer defaults to '/usr/bin/python', this does not
appear to be Ansible's normal behaviour. This has changed several times,
so it may have to change again, and it may cause breakage after release.
Connection delegation respects the c.DEFAULT_REMOTE_USER whereas the
previous version simply tried to fetch whatever was in the
'ansible_user' hostvar. Many more connection delegation variables closer
match vanilla's handling, but this still requires more work. Some of the
variables need access to the command line, and upstream are in the
process of changing all that stuff around.
6 years ago
|
|
|
host_vars=dict(via_vars), # TODO: make it lazy
|
|
|
|
become_method=become_method or None,
|
ansible: connection delegation v1
This implements the first edition of Connection Delegation, where
delegating connection establishment is initially single-threaded.
ansible_mitogen/strategy.py:
ansible_mitogen/plugins/connection/*:
Begin splitting connection.Connection into subclasses, exposing them
directly as "mitogen_ssh", "mitogen_local", etc. connection types.
This is far from removing strategy.py, but it's a tiny start.
ansible_mitogen/connection.py:
* config_from_play_context() and config_from_host_vars() build up a
huge dictionary containing either more or less PlayContext contents,
or our best attempt at reconstructing a host's connection config
from its hostvars, where that config is not the current
WorkerProcess target.
They both produce the same format with the same keys, allowing
remaining code to have a single input format.
These dicts contain fields named after how Ansible refers to them,
e.g. "sudo_exe".
* _config_from_via() parses a basic connection specification like
"username@inventory_name" into one of the aforementioned dicts.
* _stack_from_config() produces a list of dicts describing the order
in which (Mitogen) connections should be established, such that each
element is proxied via= the previous element. The dicts produced by
this function use Mitogen keyword arguments, the former di.
These dicts contain fields named after how Mitogen refers to them,
e.g. "sudo_path".
* Pass the stack to ContextService, which is responsible for actual
setup of the full chain.
ansible_mitogen/services.py:
Teach get() to walk the supplied stack, establishing each connection
in turn, creating refounts for it before continuing.
TODO: refcounting is broken in a variety of cases.
7 years ago
|
|
|
become_user=become_user or None,
|
|
|
|
)
|
|
|
|
|
ansible: connection delegation v1
This implements the first edition of Connection Delegation, where
delegating connection establishment is initially single-threaded.
ansible_mitogen/strategy.py:
ansible_mitogen/plugins/connection/*:
Begin splitting connection.Connection into subclasses, exposing them
directly as "mitogen_ssh", "mitogen_local", etc. connection types.
This is far from removing strategy.py, but it's a tiny start.
ansible_mitogen/connection.py:
* config_from_play_context() and config_from_host_vars() build up a
huge dictionary containing either more or less PlayContext contents,
or our best attempt at reconstructing a host's connection config
from its hostvars, where that config is not the current
WorkerProcess target.
They both produce the same format with the same keys, allowing
remaining code to have a single input format.
These dicts contain fields named after how Ansible refers to them,
e.g. "sudo_exe".
* _config_from_via() parses a basic connection specification like
"username@inventory_name" into one of the aforementioned dicts.
* _stack_from_config() produces a list of dicts describing the order
in which (Mitogen) connections should be established, such that each
element is proxied via= the previous element. The dicts produced by
this function use Mitogen keyword arguments, the former di.
These dicts contain fields named after how Mitogen refers to them,
e.g. "sudo_path".
* Pass the stack to ContextService, which is responsible for actual
setup of the full chain.
ansible_mitogen/services.py:
Teach get() to walk the supplied stack, establishing each connection
in turn, creating refounts for it before continuing.
TODO: refcounting is broken in a variety of cases.
7 years ago
|
|
|
unknown_via_msg = 'mitogen_via=%s of %s specifies an unknown hostname'
|
|
|
|
via_cycle_msg = 'mitogen_via=%s of %s creates a cycle (%s)'
|
|
|
|
|
issue #251, #412, #434: fix connection configuration brainwrong
This refactors connection.py to pull the two huge dict-building
functions out into new transport_transport_config.PlayContextSpec and
MitogenViaSpec classes, leaving a lot more room to breath in both files
to figure out exactly how connection configuration should work.
The changes made in 1f21a30 / 3d58832 are updated or completely removed,
the original change was misguided, in a bid to fix connection delegation
taking variables from the wrong place when delegate_to was active.
The Python path no longer defaults to '/usr/bin/python', this does not
appear to be Ansible's normal behaviour. This has changed several times,
so it may have to change again, and it may cause breakage after release.
Connection delegation respects the c.DEFAULT_REMOTE_USER whereas the
previous version simply tried to fetch whatever was in the
'ansible_user' hostvar. Many more connection delegation variables closer
match vanilla's handling, but this still requires more work. Some of the
variables need access to the command line, and upstream are in the
process of changing all that stuff around.
6 years ago
|
|
|
def _stack_from_spec(self, spec, stack=(), seen_names=()):
|
|
|
|
"""
|
|
|
|
Return a tuple of ContextService parameter dictionaries corresponding
|
|
|
|
to the connection described by `spec`, and any connection referenced by
|
|
|
|
its `mitogen_via` or `become` fields. Each element is a dict of the
|
|
|
|
form::
|
|
|
|
|
|
|
|
{
|
|
|
|
# Optional. If present and `True`, this hop is elegible for
|
|
|
|
# interpreter recycling.
|
|
|
|
"enable_lru": True,
|
|
|
|
# mitogen.master.Router method name.
|
|
|
|
"method": "ssh",
|
|
|
|
# mitogen.master.Router method kwargs.
|
|
|
|
"kwargs": {
|
|
|
|
"hostname": "..."
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
:param ansible_mitogen.transport_config.Spec spec:
|
|
|
|
Connection specification.
|
|
|
|
:param tuple stack:
|
|
|
|
Stack elements from parent call (used for recursion).
|
|
|
|
:param tuple seen_names:
|
|
|
|
Inventory hostnames from parent call (cycle detection).
|
|
|
|
:returns:
|
|
|
|
Tuple `(stack, seen_names)`.
|
|
|
|
"""
|
issue #251, #412, #434: fix connection configuration brainwrong
This refactors connection.py to pull the two huge dict-building
functions out into new transport_transport_config.PlayContextSpec and
MitogenViaSpec classes, leaving a lot more room to breath in both files
to figure out exactly how connection configuration should work.
The changes made in 1f21a30 / 3d58832 are updated or completely removed,
the original change was misguided, in a bid to fix connection delegation
taking variables from the wrong place when delegate_to was active.
The Python path no longer defaults to '/usr/bin/python', this does not
appear to be Ansible's normal behaviour. This has changed several times,
so it may have to change again, and it may cause breakage after release.
Connection delegation respects the c.DEFAULT_REMOTE_USER whereas the
previous version simply tried to fetch whatever was in the
'ansible_user' hostvar. Many more connection delegation variables closer
match vanilla's handling, but this still requires more work. Some of the
variables need access to the command line, and upstream are in the
process of changing all that stuff around.
6 years ago
|
|
|
if spec.inventory_name() in seen_names:
|
ansible: connection delegation v1
This implements the first edition of Connection Delegation, where
delegating connection establishment is initially single-threaded.
ansible_mitogen/strategy.py:
ansible_mitogen/plugins/connection/*:
Begin splitting connection.Connection into subclasses, exposing them
directly as "mitogen_ssh", "mitogen_local", etc. connection types.
This is far from removing strategy.py, but it's a tiny start.
ansible_mitogen/connection.py:
* config_from_play_context() and config_from_host_vars() build up a
huge dictionary containing either more or less PlayContext contents,
or our best attempt at reconstructing a host's connection config
from its hostvars, where that config is not the current
WorkerProcess target.
They both produce the same format with the same keys, allowing
remaining code to have a single input format.
These dicts contain fields named after how Ansible refers to them,
e.g. "sudo_exe".
* _config_from_via() parses a basic connection specification like
"username@inventory_name" into one of the aforementioned dicts.
* _stack_from_config() produces a list of dicts describing the order
in which (Mitogen) connections should be established, such that each
element is proxied via= the previous element. The dicts produced by
this function use Mitogen keyword arguments, the former di.
These dicts contain fields named after how Mitogen refers to them,
e.g. "sudo_path".
* Pass the stack to ContextService, which is responsible for actual
setup of the full chain.
ansible_mitogen/services.py:
Teach get() to walk the supplied stack, establishing each connection
in turn, creating refounts for it before continuing.
TODO: refcounting is broken in a variety of cases.
7 years ago
|
|
|
raise ansible.errors.AnsibleConnectionFailure(
|
|
|
|
self.via_cycle_msg % (
|
issue #251, #412, #434: fix connection configuration brainwrong
This refactors connection.py to pull the two huge dict-building
functions out into new transport_transport_config.PlayContextSpec and
MitogenViaSpec classes, leaving a lot more room to breath in both files
to figure out exactly how connection configuration should work.
The changes made in 1f21a30 / 3d58832 are updated or completely removed,
the original change was misguided, in a bid to fix connection delegation
taking variables from the wrong place when delegate_to was active.
The Python path no longer defaults to '/usr/bin/python', this does not
appear to be Ansible's normal behaviour. This has changed several times,
so it may have to change again, and it may cause breakage after release.
Connection delegation respects the c.DEFAULT_REMOTE_USER whereas the
previous version simply tried to fetch whatever was in the
'ansible_user' hostvar. Many more connection delegation variables closer
match vanilla's handling, but this still requires more work. Some of the
variables need access to the command line, and upstream are in the
process of changing all that stuff around.
6 years ago
|
|
|
spec.mitogen_via(),
|
|
|
|
spec.inventory_name(),
|
ansible: connection delegation v1
This implements the first edition of Connection Delegation, where
delegating connection establishment is initially single-threaded.
ansible_mitogen/strategy.py:
ansible_mitogen/plugins/connection/*:
Begin splitting connection.Connection into subclasses, exposing them
directly as "mitogen_ssh", "mitogen_local", etc. connection types.
This is far from removing strategy.py, but it's a tiny start.
ansible_mitogen/connection.py:
* config_from_play_context() and config_from_host_vars() build up a
huge dictionary containing either more or less PlayContext contents,
or our best attempt at reconstructing a host's connection config
from its hostvars, where that config is not the current
WorkerProcess target.
They both produce the same format with the same keys, allowing
remaining code to have a single input format.
These dicts contain fields named after how Ansible refers to them,
e.g. "sudo_exe".
* _config_from_via() parses a basic connection specification like
"username@inventory_name" into one of the aforementioned dicts.
* _stack_from_config() produces a list of dicts describing the order
in which (Mitogen) connections should be established, such that each
element is proxied via= the previous element. The dicts produced by
this function use Mitogen keyword arguments, the former di.
These dicts contain fields named after how Mitogen refers to them,
e.g. "sudo_path".
* Pass the stack to ContextService, which is responsible for actual
setup of the full chain.
ansible_mitogen/services.py:
Teach get() to walk the supplied stack, establishing each connection
in turn, creating refounts for it before continuing.
TODO: refcounting is broken in a variety of cases.
7 years ago
|
|
|
' -> '.join(reversed(
|
issue #251, #412, #434: fix connection configuration brainwrong
This refactors connection.py to pull the two huge dict-building
functions out into new transport_transport_config.PlayContextSpec and
MitogenViaSpec classes, leaving a lot more room to breath in both files
to figure out exactly how connection configuration should work.
The changes made in 1f21a30 / 3d58832 are updated or completely removed,
the original change was misguided, in a bid to fix connection delegation
taking variables from the wrong place when delegate_to was active.
The Python path no longer defaults to '/usr/bin/python', this does not
appear to be Ansible's normal behaviour. This has changed several times,
so it may have to change again, and it may cause breakage after release.
Connection delegation respects the c.DEFAULT_REMOTE_USER whereas the
previous version simply tried to fetch whatever was in the
'ansible_user' hostvar. Many more connection delegation variables closer
match vanilla's handling, but this still requires more work. Some of the
variables need access to the command line, and upstream are in the
process of changing all that stuff around.
6 years ago
|
|
|
seen_names + (spec.inventory_name(),)
|
ansible: connection delegation v1
This implements the first edition of Connection Delegation, where
delegating connection establishment is initially single-threaded.
ansible_mitogen/strategy.py:
ansible_mitogen/plugins/connection/*:
Begin splitting connection.Connection into subclasses, exposing them
directly as "mitogen_ssh", "mitogen_local", etc. connection types.
This is far from removing strategy.py, but it's a tiny start.
ansible_mitogen/connection.py:
* config_from_play_context() and config_from_host_vars() build up a
huge dictionary containing either more or less PlayContext contents,
or our best attempt at reconstructing a host's connection config
from its hostvars, where that config is not the current
WorkerProcess target.
They both produce the same format with the same keys, allowing
remaining code to have a single input format.
These dicts contain fields named after how Ansible refers to them,
e.g. "sudo_exe".
* _config_from_via() parses a basic connection specification like
"username@inventory_name" into one of the aforementioned dicts.
* _stack_from_config() produces a list of dicts describing the order
in which (Mitogen) connections should be established, such that each
element is proxied via= the previous element. The dicts produced by
this function use Mitogen keyword arguments, the former di.
These dicts contain fields named after how Mitogen refers to them,
e.g. "sudo_path".
* Pass the stack to ContextService, which is responsible for actual
setup of the full chain.
ansible_mitogen/services.py:
Teach get() to walk the supplied stack, establishing each connection
in turn, creating refounts for it before continuing.
TODO: refcounting is broken in a variety of cases.
7 years ago
|
|
|
)),
|
|
|
|
)
|
|
|
|
)
|
|
|
|
|
issue #251, #412, #434: fix connection configuration brainwrong
This refactors connection.py to pull the two huge dict-building
functions out into new transport_transport_config.PlayContextSpec and
MitogenViaSpec classes, leaving a lot more room to breath in both files
to figure out exactly how connection configuration should work.
The changes made in 1f21a30 / 3d58832 are updated or completely removed,
the original change was misguided, in a bid to fix connection delegation
taking variables from the wrong place when delegate_to was active.
The Python path no longer defaults to '/usr/bin/python', this does not
appear to be Ansible's normal behaviour. This has changed several times,
so it may have to change again, and it may cause breakage after release.
Connection delegation respects the c.DEFAULT_REMOTE_USER whereas the
previous version simply tried to fetch whatever was in the
'ansible_user' hostvar. Many more connection delegation variables closer
match vanilla's handling, but this still requires more work. Some of the
variables need access to the command line, and upstream are in the
process of changing all that stuff around.
6 years ago
|
|
|
if spec.mitogen_via():
|
|
|
|
stack = self._stack_from_spec(
|
|
|
|
self._spec_from_via(spec.inventory_name(), spec.mitogen_via()),
|
ansible: connection delegation v1
This implements the first edition of Connection Delegation, where
delegating connection establishment is initially single-threaded.
ansible_mitogen/strategy.py:
ansible_mitogen/plugins/connection/*:
Begin splitting connection.Connection into subclasses, exposing them
directly as "mitogen_ssh", "mitogen_local", etc. connection types.
This is far from removing strategy.py, but it's a tiny start.
ansible_mitogen/connection.py:
* config_from_play_context() and config_from_host_vars() build up a
huge dictionary containing either more or less PlayContext contents,
or our best attempt at reconstructing a host's connection config
from its hostvars, where that config is not the current
WorkerProcess target.
They both produce the same format with the same keys, allowing
remaining code to have a single input format.
These dicts contain fields named after how Ansible refers to them,
e.g. "sudo_exe".
* _config_from_via() parses a basic connection specification like
"username@inventory_name" into one of the aforementioned dicts.
* _stack_from_config() produces a list of dicts describing the order
in which (Mitogen) connections should be established, such that each
element is proxied via= the previous element. The dicts produced by
this function use Mitogen keyword arguments, the former di.
These dicts contain fields named after how Mitogen refers to them,
e.g. "sudo_path".
* Pass the stack to ContextService, which is responsible for actual
setup of the full chain.
ansible_mitogen/services.py:
Teach get() to walk the supplied stack, establishing each connection
in turn, creating refounts for it before continuing.
TODO: refcounting is broken in a variety of cases.
7 years ago
|
|
|
stack=stack,
|
issue #251, #412, #434: fix connection configuration brainwrong
This refactors connection.py to pull the two huge dict-building
functions out into new transport_transport_config.PlayContextSpec and
MitogenViaSpec classes, leaving a lot more room to breath in both files
to figure out exactly how connection configuration should work.
The changes made in 1f21a30 / 3d58832 are updated or completely removed,
the original change was misguided, in a bid to fix connection delegation
taking variables from the wrong place when delegate_to was active.
The Python path no longer defaults to '/usr/bin/python', this does not
appear to be Ansible's normal behaviour. This has changed several times,
so it may have to change again, and it may cause breakage after release.
Connection delegation respects the c.DEFAULT_REMOTE_USER whereas the
previous version simply tried to fetch whatever was in the
'ansible_user' hostvar. Many more connection delegation variables closer
match vanilla's handling, but this still requires more work. Some of the
variables need access to the command line, and upstream are in the
process of changing all that stuff around.
6 years ago
|
|
|
seen_names=seen_names + (spec.inventory_name(),),
|
ansible: connection delegation v1
This implements the first edition of Connection Delegation, where
delegating connection establishment is initially single-threaded.
ansible_mitogen/strategy.py:
ansible_mitogen/plugins/connection/*:
Begin splitting connection.Connection into subclasses, exposing them
directly as "mitogen_ssh", "mitogen_local", etc. connection types.
This is far from removing strategy.py, but it's a tiny start.
ansible_mitogen/connection.py:
* config_from_play_context() and config_from_host_vars() build up a
huge dictionary containing either more or less PlayContext contents,
or our best attempt at reconstructing a host's connection config
from its hostvars, where that config is not the current
WorkerProcess target.
They both produce the same format with the same keys, allowing
remaining code to have a single input format.
These dicts contain fields named after how Ansible refers to them,
e.g. "sudo_exe".
* _config_from_via() parses a basic connection specification like
"username@inventory_name" into one of the aforementioned dicts.
* _stack_from_config() produces a list of dicts describing the order
in which (Mitogen) connections should be established, such that each
element is proxied via= the previous element. The dicts produced by
this function use Mitogen keyword arguments, the former di.
These dicts contain fields named after how Mitogen refers to them,
e.g. "sudo_path".
* Pass the stack to ContextService, which is responsible for actual
setup of the full chain.
ansible_mitogen/services.py:
Teach get() to walk the supplied stack, establishing each connection
in turn, creating refounts for it before continuing.
TODO: refcounting is broken in a variety of cases.
7 years ago
|
|
|
)
|
|
|
|
|
issue #251, #412, #434: fix connection configuration brainwrong
This refactors connection.py to pull the two huge dict-building
functions out into new transport_transport_config.PlayContextSpec and
MitogenViaSpec classes, leaving a lot more room to breath in both files
to figure out exactly how connection configuration should work.
The changes made in 1f21a30 / 3d58832 are updated or completely removed,
the original change was misguided, in a bid to fix connection delegation
taking variables from the wrong place when delegate_to was active.
The Python path no longer defaults to '/usr/bin/python', this does not
appear to be Ansible's normal behaviour. This has changed several times,
so it may have to change again, and it may cause breakage after release.
Connection delegation respects the c.DEFAULT_REMOTE_USER whereas the
previous version simply tried to fetch whatever was in the
'ansible_user' hostvar. Many more connection delegation variables closer
match vanilla's handling, but this still requires more work. Some of the
variables need access to the command line, and upstream are in the
process of changing all that stuff around.
6 years ago
|
|
|
stack += (CONNECTION_METHOD[spec.transport()](spec),)
|
|
|
|
if spec.become() and ((spec.become_user() != spec.remote_user()) or
|
|
|
|
C.BECOME_ALLOW_SAME_USER):
|
issue #251, #412, #434: fix connection configuration brainwrong
This refactors connection.py to pull the two huge dict-building
functions out into new transport_transport_config.PlayContextSpec and
MitogenViaSpec classes, leaving a lot more room to breath in both files
to figure out exactly how connection configuration should work.
The changes made in 1f21a30 / 3d58832 are updated or completely removed,
the original change was misguided, in a bid to fix connection delegation
taking variables from the wrong place when delegate_to was active.
The Python path no longer defaults to '/usr/bin/python', this does not
appear to be Ansible's normal behaviour. This has changed several times,
so it may have to change again, and it may cause breakage after release.
Connection delegation respects the c.DEFAULT_REMOTE_USER whereas the
previous version simply tried to fetch whatever was in the
'ansible_user' hostvar. Many more connection delegation variables closer
match vanilla's handling, but this still requires more work. Some of the
variables need access to the command line, and upstream are in the
process of changing all that stuff around.
6 years ago
|
|
|
stack += (CONNECTION_METHOD[spec.become_method()](spec),)
|
|
|
|
|
|
|
|
return stack
|
|
|
|
|
|
|
|
def _connect_broker(self):
|
|
|
|
"""
|
|
|
|
Establish a reference to the Broker, Router and parent context used for
|
|
|
|
connections.
|
|
|
|
"""
|
|
|
|
if not self.broker:
|
|
|
|
self.broker = mitogen.master.Broker()
|
|
|
|
self.router, self.parent = mitogen.unix.connect(
|
|
|
|
path=ansible_mitogen.process.MuxProcess.unix_listener_path,
|
|
|
|
broker=self.broker,
|
|
|
|
)
|
|
|
|
|
|
|
|
def _build_stack(self):
|
|
|
|
"""
|
|
|
|
Construct a list of dictionaries representing the connection
|
|
|
|
configuration between the controller and the target. This is
|
|
|
|
additionally used by the integration tests "mitogen_get_stack" action
|
|
|
|
to fetch the would-be connection configuration.
|
|
|
|
"""
|
|
|
|
return self._stack_from_spec(
|
|
|
|
ansible_mitogen.transport_config.PlayContextSpec(
|
|
|
|
connection=self,
|
|
|
|
play_context=self._play_context,
|
|
|
|
transport=self.transport,
|
|
|
|
inventory_name=self.inventory_hostname,
|
|
|
|
)
|
|
|
|
)
|
ansible: connection delegation v1
This implements the first edition of Connection Delegation, where
delegating connection establishment is initially single-threaded.
ansible_mitogen/strategy.py:
ansible_mitogen/plugins/connection/*:
Begin splitting connection.Connection into subclasses, exposing them
directly as "mitogen_ssh", "mitogen_local", etc. connection types.
This is far from removing strategy.py, but it's a tiny start.
ansible_mitogen/connection.py:
* config_from_play_context() and config_from_host_vars() build up a
huge dictionary containing either more or less PlayContext contents,
or our best attempt at reconstructing a host's connection config
from its hostvars, where that config is not the current
WorkerProcess target.
They both produce the same format with the same keys, allowing
remaining code to have a single input format.
These dicts contain fields named after how Ansible refers to them,
e.g. "sudo_exe".
* _config_from_via() parses a basic connection specification like
"username@inventory_name" into one of the aforementioned dicts.
* _stack_from_config() produces a list of dicts describing the order
in which (Mitogen) connections should be established, such that each
element is proxied via= the previous element. The dicts produced by
this function use Mitogen keyword arguments, the former di.
These dicts contain fields named after how Mitogen refers to them,
e.g. "sudo_path".
* Pass the stack to ContextService, which is responsible for actual
setup of the full chain.
ansible_mitogen/services.py:
Teach get() to walk the supplied stack, establishing each connection
in turn, creating refounts for it before continuing.
TODO: refcounting is broken in a variety of cases.
7 years ago
|
|
|
|
|
|
|
def _connect_stack(self, stack):
|
|
|
|
"""
|
|
|
|
Pass `stack` to ContextService, requesting a copy of the context object
|
|
|
|
representing the last tuple element. If no connection exists yet,
|
|
|
|
ContextService will recursively establish it before returning it or
|
|
|
|
throwing an error.
|
|
|
|
|
|
|
|
See :meth:`ansible_mitogen.services.ContextService.get` docstring for
|
|
|
|
description of the returned dictionary.
|
|
|
|
"""
|
|
|
|
try:
|
|
|
|
dct = self.parent.call_service(
|
|
|
|
service_name='ansible_mitogen.services.ContextService',
|
|
|
|
method_name='get',
|
|
|
|
stack=mitogen.utils.cast(list(stack)),
|
|
|
|
)
|
|
|
|
except mitogen.core.CallError:
|
|
|
|
LOG.warning('Connection failed; stack configuration was:\n%s',
|
|
|
|
pprint.pformat(stack))
|
|
|
|
raise
|
|
|
|
|
ansible: connection delegation v1
This implements the first edition of Connection Delegation, where
delegating connection establishment is initially single-threaded.
ansible_mitogen/strategy.py:
ansible_mitogen/plugins/connection/*:
Begin splitting connection.Connection into subclasses, exposing them
directly as "mitogen_ssh", "mitogen_local", etc. connection types.
This is far from removing strategy.py, but it's a tiny start.
ansible_mitogen/connection.py:
* config_from_play_context() and config_from_host_vars() build up a
huge dictionary containing either more or less PlayContext contents,
or our best attempt at reconstructing a host's connection config
from its hostvars, where that config is not the current
WorkerProcess target.
They both produce the same format with the same keys, allowing
remaining code to have a single input format.
These dicts contain fields named after how Ansible refers to them,
e.g. "sudo_exe".
* _config_from_via() parses a basic connection specification like
"username@inventory_name" into one of the aforementioned dicts.
* _stack_from_config() produces a list of dicts describing the order
in which (Mitogen) connections should be established, such that each
element is proxied via= the previous element. The dicts produced by
this function use Mitogen keyword arguments, the former di.
These dicts contain fields named after how Mitogen refers to them,
e.g. "sudo_path".
* Pass the stack to ContextService, which is responsible for actual
setup of the full chain.
ansible_mitogen/services.py:
Teach get() to walk the supplied stack, establishing each connection
in turn, creating refounts for it before continuing.
TODO: refcounting is broken in a variety of cases.
7 years ago
|
|
|
if dct['msg']:
|
|
|
|
if dct['method_name'] in self.become_methods:
|
|
|
|
raise ansible.errors.AnsibleModuleError(dct['msg'])
|
|
|
|
raise ansible.errors.AnsibleConnectionFailure(dct['msg'])
|
|
|
|
|
ansible: connection delegation v1
This implements the first edition of Connection Delegation, where
delegating connection establishment is initially single-threaded.
ansible_mitogen/strategy.py:
ansible_mitogen/plugins/connection/*:
Begin splitting connection.Connection into subclasses, exposing them
directly as "mitogen_ssh", "mitogen_local", etc. connection types.
This is far from removing strategy.py, but it's a tiny start.
ansible_mitogen/connection.py:
* config_from_play_context() and config_from_host_vars() build up a
huge dictionary containing either more or less PlayContext contents,
or our best attempt at reconstructing a host's connection config
from its hostvars, where that config is not the current
WorkerProcess target.
They both produce the same format with the same keys, allowing
remaining code to have a single input format.
These dicts contain fields named after how Ansible refers to them,
e.g. "sudo_exe".
* _config_from_via() parses a basic connection specification like
"username@inventory_name" into one of the aforementioned dicts.
* _stack_from_config() produces a list of dicts describing the order
in which (Mitogen) connections should be established, such that each
element is proxied via= the previous element. The dicts produced by
this function use Mitogen keyword arguments, the former di.
These dicts contain fields named after how Mitogen refers to them,
e.g. "sudo_path".
* Pass the stack to ContextService, which is responsible for actual
setup of the full chain.
ansible_mitogen/services.py:
Teach get() to walk the supplied stack, establishing each connection
in turn, creating refounts for it before continuing.
TODO: refcounting is broken in a variety of cases.
7 years ago
|
|
|
self.context = dct['context']
|
|
|
|
self.chain = CallChain(self, self.context, pipelined=True)
|
|
|
|
if self._play_context.become:
|
|
|
|
self.login_context = dct['via']
|
|
|
|
else:
|
|
|
|
self.login_context = self.context
|
|
|
|
|
|
|
|
self.init_child_result = dct['init_child_result']
|
|
|
|
|
|
|
|
def get_good_temp_dir(self):
|
|
|
|
"""
|
|
|
|
Return the 'good temporary directory' as discovered by
|
|
|
|
:func:`ansible_mitogen.target.init_child` immediately after
|
|
|
|
ContextService constructed the target context.
|
|
|
|
"""
|
|
|
|
self._connect()
|
|
|
|
return self.init_child_result['good_temp_dir']
|
|
|
|
|
|
|
|
def _generate_tmp_path(self):
|
|
|
|
return os.path.join(
|
|
|
|
self.get_good_temp_dir(),
|
|
|
|
'ansible_mitogen_action_%016x' % (
|
|
|
|
random.getrandbits(8*8),
|
|
|
|
)
|
|
|
|
)
|
|
|
|
|
|
|
|
def _make_tmp_path(self):
|
|
|
|
assert getattr(self._shell, 'tmpdir', None) is None
|
|
|
|
self._shell.tmpdir = self._generate_tmp_path()
|
|
|
|
LOG.debug('Temporary directory: %r', self._shell.tmpdir)
|
|
|
|
self.get_chain().call_no_reply(os.mkdir, self._shell.tmpdir)
|
|
|
|
return self._shell.tmpdir
|
|
|
|
|
|
|
|
def _reset_tmp_path(self):
|
|
|
|
"""
|
|
|
|
Called by _mitogen_reset(); ask the remote context to delete any
|
|
|
|
temporary directory created for the action. CallChain is not used here
|
|
|
|
to ensure exception is logged by the context on failure, since the
|
|
|
|
CallChain itself is about to be destructed.
|
|
|
|
"""
|
|
|
|
if getattr(self._shell, 'tmpdir', None) is not None:
|
|
|
|
self.context.call_no_reply(
|
|
|
|
ansible_mitogen.target.prune_tree,
|
|
|
|
self._shell.tmpdir,
|
|
|
|
)
|
|
|
|
self._shell.tmpdir = None
|
|
|
|
|
|
|
|
def _connect(self):
|
|
|
|
"""
|
|
|
|
Establish a connection to the master process's UNIX listener socket,
|
|
|
|
constructing a mitogen.master.Router to communicate with the master,
|
|
|
|
and a mitogen.parent.Context to represent it.
|
|
|
|
|
|
|
|
Depending on the original transport we should emulate, trigger one of
|
|
|
|
the _connect_*() service calls defined above to cause the master
|
|
|
|
process to establish the real connection on our behalf, or return a
|
|
|
|
reference to the existing one.
|
|
|
|
"""
|
|
|
|
if self.connected:
|
|
|
|
return
|
|
|
|
|
|
|
|
self._connect_broker()
|
|
|
|
stack = self._build_stack()
|
|
|
|
self._connect_stack(stack)
|
|
|
|
|
|
|
|
def _mitogen_reset(self, mode):
|
|
|
|
"""
|
|
|
|
Forget everything we know about the connected context. This function
|
|
|
|
cannot be called _reset() since that name is used as a public API by
|
|
|
|
Ansible 2.4 wait_for_connection plug-in.
|
|
|
|
|
|
|
|
:param str mode:
|
|
|
|
Name of ContextService method to use to discard the context, either
|
|
|
|
'put' or 'reset'.
|
|
|
|
"""
|
|
|
|
if not self.context:
|
|
|
|
return
|
|
|
|
|
|
|
|
self._reset_tmp_path()
|
|
|
|
self.chain.reset()
|
|
|
|
self.parent.call_service(
|
|
|
|
service_name='ansible_mitogen.services.ContextService',
|
|
|
|
method_name=mode,
|
|
|
|
context=self.context
|
|
|
|
)
|
|
|
|
|
|
|
|
self.context = None
|
|
|
|
self.login_context = None
|
|
|
|
self.init_child_result = None
|
|
|
|
self.chain = None
|
|
|
|
|
|
|
|
def _shutdown_broker(self):
|
|
|
|
"""
|
|
|
|
Shutdown the broker thread during :meth:`close` or :meth:`reset`.
|
|
|
|
"""
|
|
|
|
if self.broker:
|
|
|
|
self.broker.shutdown()
|
|
|
|
self.broker.join()
|
|
|
|
self.broker = None
|
|
|
|
self.router = None
|
|
|
|
|
|
|
|
# #420: Ansible executes "meta" actions in the top-level process,
|
|
|
|
# meaning "reset_connection" will cause :class:`mitogen.core.Latch`
|
|
|
|
# FDs to be cached and erroneously shared by children on subsequent
|
|
|
|
# WorkerProcess forks. To handle that, call on_fork() to ensure any
|
|
|
|
# shared state is discarded.
|
|
|
|
# #490: only attempt to clean up when it's known that some
|
|
|
|
# resources exist to cleanup, otherwise later __del__ double-call
|
|
|
|
# to close() due to GC at random moment may obliterate an unrelated
|
|
|
|
# Connection's resources.
|
|
|
|
mitogen.fork.on_fork()
|
|
|
|
|
|
|
|
def close(self):
|
|
|
|
"""
|
|
|
|
Arrange for the mitogen.master.Router running in the worker to
|
|
|
|
gracefully shut down, and wait for shutdown to complete. Safe to call
|
|
|
|
multiple times.
|
|
|
|
"""
|
|
|
|
self._mitogen_reset(mode='put')
|
|
|
|
self._shutdown_broker()
|
|
|
|
|
|
|
|
def _reset_find_task_vars(self):
|
|
|
|
"""
|
|
|
|
Monsterous hack: since "meta: reset_connection" does not run from an
|
|
|
|
action, we cannot capture task variables via :meth:`on_action_run`.
|
|
|
|
Instead walk the parent frames searching for the `all_vars` local from
|
|
|
|
StrategyBase._execute_meta(). If this fails, just leave task_vars
|
|
|
|
unset, likely causing a subtly wrong configuration to be selected.
|
|
|
|
"""
|
|
|
|
frame = sys._getframe()
|
|
|
|
while frame and not self._task_vars:
|
|
|
|
self._task_vars = frame.f_locals.get('all_vars')
|
|
|
|
frame = frame.f_back
|
|
|
|
|
|
|
|
reset_compat_msg = (
|
|
|
|
'Mitogen only supports "reset_connection" on Ansible 2.5.6 or later'
|
|
|
|
)
|
|
|
|
|
|
|
|
def reset(self):
|
|
|
|
"""
|
|
|
|
Explicitly terminate the connection to the remote host. This discards
|
|
|
|
any local state we hold for the connection, returns the Connection to
|
|
|
|
the 'disconnected' state, and informs ContextService the connection is
|
|
|
|
bad somehow, and should be shut down and discarded.
|
|
|
|
"""
|
|
|
|
if self._task_vars is None:
|
|
|
|
self._reset_find_task_vars()
|
|
|
|
|
|
|
|
if self._play_context.remote_addr is None:
|
|
|
|
# <2.5.6 incorrectly populate PlayContext for reset_connection
|
|
|
|
# https://github.com/ansible/ansible/issues/27520
|
|
|
|
raise ansible.errors.AnsibleConnectionFailure(
|
|
|
|
self.reset_compat_msg
|
|
|
|
)
|
|
|
|
|
|
|
|
self._connect()
|
|
|
|
self._mitogen_reset(mode='reset')
|
|
|
|
self._shutdown_broker()
|
|
|
|
|
|
|
|
# Compatibility with Ansible 2.4 wait_for_connection plug-in.
|
|
|
|
_reset = reset
|
|
|
|
|
|
|
|
def get_chain(self, use_login=False, use_fork=False):
|
|
|
|
"""
|
|
|
|
Return the :class:`mitogen.parent.CallChain` to use for executing
|
|
|
|
function calls.
|
|
|
|
|
|
|
|
:param bool use_login:
|
|
|
|
If :data:`True`, always return the chain for the login account
|
|
|
|
rather than any active become user.
|
|
|
|
:param bool use_fork:
|
|
|
|
If :data:`True`, return the chain for the fork parent.
|
|
|
|
:returns mitogen.parent.CallChain:
|
|
|
|
"""
|
|
|
|
self._connect()
|
|
|
|
if use_login:
|
|
|
|
return self.login_context.default_call_chain
|
|
|
|
# See FORK_SUPPORTED comments in target.py.
|
|
|
|
if use_fork and self.init_child_result['fork_context'] is not None:
|
|
|
|
return self.init_child_result['fork_context'].default_call_chain
|
|
|
|
return self.chain
|
|
|
|
|
|
|
|
def spawn_isolated_child(self):
|
|
|
|
"""
|
|
|
|
Fork or launch a new child off the target context.
|
|
|
|
|
|
|
|
:returns:
|
|
|
|
mitogen.core.Context of the new child.
|
|
|
|
"""
|
|
|
|
return self.get_chain(use_fork=True).call(
|
|
|
|
ansible_mitogen.target.spawn_isolated_child
|
|
|
|
)
|
|
|
|
|
|
|
|
def get_extra_args(self):
|
|
|
|
"""
|
|
|
|
Overridden by connections/mitogen_kubectl.py to a list of additional
|
|
|
|
arguments for the command.
|
|
|
|
"""
|
|
|
|
# TODO: maybe use this for SSH too.
|
|
|
|
return []
|
|
|
|
|
|
|
|
def get_default_cwd(self):
|
|
|
|
"""
|
|
|
|
Overridden by connections/mitogen_local.py to emulate behaviour of CWD
|
|
|
|
being fixed to that of ActionBase._loader.get_basedir().
|
|
|
|
"""
|
|
|
|
return None
|
|
|
|
|
|
|
|
def get_default_env(self):
|
|
|
|
"""
|
|
|
|
Overridden by connections/mitogen_local.py to emulate behaviour of
|
|
|
|
WorkProcess environment inherited from WorkerProcess.
|
|
|
|
"""
|
|
|
|
return None
|
|
|
|
|
|
|
|
def exec_command(self, cmd, in_data='', sudoable=True, mitogen_chdir=None):
|
|
|
|
"""
|
|
|
|
Implement exec_command() by calling the corresponding
|
|
|
|
ansible_mitogen.target function in the target.
|
|
|
|
|
|
|
|
:param str cmd:
|
|
|
|
Shell command to execute.
|
|
|
|
:param bytes in_data:
|
|
|
|
Data to supply on ``stdin`` of the process.
|
|
|
|
:returns:
|
|
|
|
(return code, stdout bytes, stderr bytes)
|
|
|
|
"""
|
|
|
|
emulate_tty = (not in_data and sudoable)
|
|
|
|
rc, stdout, stderr = self.get_chain().call(
|
|
|
|
ansible_mitogen.target.exec_command,
|
|
|
|
cmd=mitogen.utils.cast(cmd),
|
|
|
|
in_data=mitogen.utils.cast(in_data),
|
|
|
|
chdir=mitogen_chdir or self.get_default_cwd(),
|
|
|
|
emulate_tty=emulate_tty,
|
|
|
|
)
|
|
|
|
|
|
|
|
stderr += b'Shared connection to %s closed.%s' % (
|
|
|
|
self._play_context.remote_addr.encode(),
|
|
|
|
(b'\r\n' if emulate_tty else b'\n'),
|
|
|
|
)
|
|
|
|
return rc, stdout, stderr
|
|
|
|
|
|
|
|
def fetch_file(self, in_path, out_path):
|
|
|
|
"""
|
|
|
|
Implement fetch_file() by calling the corresponding
|
|
|
|
ansible_mitogen.target function in the target.
|
|
|
|
|
|
|
|
:param str in_path:
|
|
|
|
Remote filesystem path to read.
|
|
|
|
:param str out_path:
|
|
|
|
Local filesystem path to write.
|
|
|
|
"""
|
|
|
|
output = self.get_chain().call(
|
|
|
|
ansible_mitogen.target.read_path,
|
|
|
|
mitogen.utils.cast(in_path),
|
|
|
|
)
|
|
|
|
ansible_mitogen.target.write_path(out_path, output)
|
|
|
|
|
|
|
|
def put_data(self, out_path, data, mode=None, utimes=None):
|
|
|
|
"""
|
|
|
|
Implement put_file() by caling the corresponding ansible_mitogen.target
|
|
|
|
function in the target, transferring small files inline. This is
|
|
|
|
pipelined and will return immediately; failed transfers are reported as
|
|
|
|
exceptions in subsequent functon calls.
|
|
|
|
|
|
|
|
:param str out_path:
|
|
|
|
Remote filesystem path to write.
|
|
|
|
:param byte data:
|
|
|
|
File contents to put.
|
|
|
|
"""
|
|
|
|
self.get_chain().call_no_reply(
|
|
|
|
ansible_mitogen.target.write_path,
|
|
|
|
mitogen.utils.cast(out_path),
|
|
|
|
mitogen.core.Blob(data),
|
|
|
|
mode=mode,
|
|
|
|
utimes=utimes,
|
|
|
|
)
|
|
|
|
|
|
|
|
#: Maximum size of a small file before switching to streaming
|
|
|
|
#: transfer. This should really be the same as
|
|
|
|
#: mitogen.services.FileService.IO_SIZE, however the message format has
|
|
|
|
#: slightly more overhead, so just randomly subtract 4KiB.
|
|
|
|
SMALL_FILE_LIMIT = mitogen.core.CHUNK_SIZE - 4096
|
|
|
|
|
|
|
|
def _throw_io_error(self, e, path):
|
|
|
|
if e.args[0] == errno.ENOENT:
|
|
|
|
s = 'file or module does not exist: ' + path
|
|
|
|
raise ansible.errors.AnsibleFileNotFound(s)
|
|
|
|
|
|
|
|
def put_file(self, in_path, out_path):
|
|
|
|
"""
|
|
|
|
Implement put_file() by streamily transferring the file via
|
|
|
|
FileService.
|
|
|
|
|
|
|
|
:param str in_path:
|
|
|
|
Local filesystem path to read.
|
|
|
|
:param str out_path:
|
|
|
|
Remote filesystem path to write.
|
|
|
|
"""
|
|
|
|
try:
|
|
|
|
st = os.stat(in_path)
|
|
|
|
except OSError as e:
|
|
|
|
self._throw_io_error(e, in_path)
|
|
|
|
raise
|
|
|
|
|
|
|
|
if not stat.S_ISREG(st.st_mode):
|
|
|
|
raise IOError('%r is not a regular file.' % (in_path,))
|
|
|
|
|
|
|
|
# If the file is sufficiently small, just ship it in the argument list
|
|
|
|
# rather than introducing an extra RTT for the child to request it from
|
|
|
|
# FileService.
|
|
|
|
if st.st_size <= self.SMALL_FILE_LIMIT:
|
|
|
|
try:
|
|
|
|
fp = open(in_path, 'rb')
|
|
|
|
try:
|
|
|
|
s = fp.read(self.SMALL_FILE_LIMIT + 1)
|
|
|
|
finally:
|
|
|
|
fp.close()
|
|
|
|
except OSError:
|
|
|
|
self._throw_io_error(e, in_path)
|
|
|
|
raise
|
|
|
|
|
|
|
|
# Ensure did not grow during read.
|
|
|
|
if len(s) == st.st_size:
|
|
|
|
return self.put_data(out_path, s, mode=st.st_mode,
|
|
|
|
utimes=(st.st_atime, st.st_mtime))
|
|
|
|
|
|
|
|
self._connect()
|
|
|
|
self.parent.call_service(
|
|
|
|
service_name='mitogen.service.FileService',
|
|
|
|
method_name='register',
|
|
|
|
path=mitogen.utils.cast(in_path)
|
|
|
|
)
|
|
|
|
|
|
|
|
# For now this must remain synchronous, as the action plug-in may have
|
|
|
|
# passed us a temporary file to transfer. A future FileService could
|
|
|
|
# maintain an LRU list of open file descriptors to keep the temporary
|
|
|
|
# file alive, but that requires more work.
|
|
|
|
self.get_chain().call(
|
|
|
|
ansible_mitogen.target.transfer_file,
|
|
|
|
context=self.parent,
|
|
|
|
in_path=in_path,
|
|
|
|
out_path=out_path
|
|
|
|
)
|