Add configuration to override location of ansible-connection (#46128)

* Add configuration to override location of ansible-connection

* Check var or argv[0] before $PATH
This commit is contained in:
Nathaniel Case 2018-10-01 14:29:59 -04:00 committed by GitHub
parent d3d812b604
commit cdaf5bd806
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 34 additions and 26 deletions

View file

@ -13,6 +13,18 @@ ALLOW_WORLD_READABLE_TMPFILES:
type: boolean type: boolean
yaml: {key: defaults.allow_world_readable_tmpfiles} yaml: {key: defaults.allow_world_readable_tmpfiles}
version_added: "2.1" version_added: "2.1"
ANSIBLE_CONNECTION_PATH:
name: Path of ansible-connection script
default: null
description:
- Specify where to look for the ansible-connection script. This location will be checked before searching $PATH.
- If null, ansible will start with the same directory as the ansible script.
type: path
env: [{name: ANSIBLE_CONNECTION_PATH}]
ini:
- {key: ansible_connection_path, section: persistent_connection}
yaml: {key: persistent_connection.ansible_connection_path}
version_added: "2.8"
ANSIBLE_COW_SELECTION: ANSIBLE_COW_SELECTION:
name: Cowsay filter selection name: Cowsay filter selection
default: default default: default

View file

@ -936,22 +936,20 @@ class TaskExecutor:
''' '''
Starts the persistent connection Starts the persistent connection
''' '''
master, slave = pty.openpty() candidate_paths = [C.ANSIBLE_CONNECTION_PATH or os.path.dirname(sys.argv[0])]
candidate_paths.extend(os.environ['PATH'].split(os.pathsep))
for dirname in candidate_paths:
ansible_connection = os.path.join(dirname, 'ansible-connection')
if os.path.isfile(ansible_connection):
break
else:
raise AnsibleError("Unable to find location of 'ansible-connection'. "
"Please set or check the value of ANSIBLE_CONNECTION_PATH")
python = sys.executable python = sys.executable
master, slave = pty.openpty()
def find_file_in_path(filename):
# Check $PATH first, followed by same directory as sys.argv[0]
paths = os.environ['PATH'].split(os.pathsep) + [os.path.dirname(sys.argv[0])]
for dirname in paths:
fullpath = os.path.join(dirname, filename)
if os.path.isfile(fullpath):
return fullpath
raise AnsibleError("Unable to find location of '%s'" % filename)
p = subprocess.Popen( p = subprocess.Popen(
[python, find_file_in_path('ansible-connection'), to_text(os.getppid())], [python, ansible_connection, to_text(os.getppid())],
stdin=slave, stdout=subprocess.PIPE, stderr=subprocess.PIPE stdin=slave, stdout=subprocess.PIPE, stderr=subprocess.PIPE
) )
os.close(slave) os.close(slave)

View file

@ -91,22 +91,20 @@ class Connection(ConnectionBase):
''' '''
Starts the persistent connection Starts the persistent connection
''' '''
master, slave = pty.openpty() candidate_paths = [C.ANSIBLE_CONNECTION_PATH or os.path.dirname(sys.argv[0])]
candidate_paths.extend(os.environ['PATH'].split(os.pathsep))
for dirname in candidate_paths:
ansible_connection = os.path.join(dirname, 'ansible-connection')
if os.path.isfile(ansible_connection):
break
else:
raise AnsibleError("Unable to find location of 'ansible-connection'. "
"Please set or check the value of ANSIBLE_CONNECTION_PATH")
python = sys.executable python = sys.executable
master, slave = pty.openpty()
def find_file_in_path(filename):
# Check $PATH first, followed by same directory as sys.argv[0]
paths = os.environ['PATH'].split(os.pathsep) + [os.path.dirname(sys.argv[0])]
for dirname in paths:
fullpath = os.path.join(dirname, filename)
if os.path.isfile(fullpath):
return fullpath
raise AnsibleError("Unable to find location of '%s'" % filename)
p = subprocess.Popen( p = subprocess.Popen(
[python, find_file_in_path('ansible-connection'), to_text(os.getppid())], [python, ansible_connection, to_text(os.getppid())],
stdin=slave, stdout=subprocess.PIPE, stderr=subprocess.PIPE stdin=slave, stdout=subprocess.PIPE, stderr=subprocess.PIPE
) )
os.close(slave) os.close(slave)