Skip to content

Commit

Permalink
Add configuration to override location of ansible-connection (ansible…
Browse files Browse the repository at this point in the history
…#46128)

* Add configuration to override location of ansible-connection

* Check var or argv[0] before $PATH
  • Loading branch information
Qalthos authored Oct 1, 2018
1 parent d3d812b commit cdaf5bd
Show file tree
Hide file tree
Showing 3 changed files with 34 additions and 26 deletions.
12 changes: 12 additions & 0 deletions lib/ansible/config/base.yml
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,18 @@ ALLOW_WORLD_READABLE_TMPFILES:
type: boolean
yaml: {key: defaults.allow_world_readable_tmpfiles}
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:
name: Cowsay filter selection
default: default
Expand Down
24 changes: 11 additions & 13 deletions lib/ansible/executor/task_executor.py
Original file line number Diff line number Diff line change
Expand Up @@ -936,22 +936,20 @@ def _start_connection(self, variables):
'''
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

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)

master, slave = pty.openpty()
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
)
os.close(slave)
Expand Down
24 changes: 11 additions & 13 deletions lib/ansible/plugins/connection/persistent.py
Original file line number Diff line number Diff line change
Expand Up @@ -91,22 +91,20 @@ def _start_connection(self):
'''
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

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)

master, slave = pty.openpty()
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
)
os.close(slave)
Expand Down

0 comments on commit cdaf5bd

Please sign in to comment.