script finished while get share connection close error

Dears,
I customized a python module to help on dcos package installation, the package installed successfully(per checking in dcos), while ansible fails with share connection close error, may u kindly help on this, thanks~
ansible version

`

ansible 2.7.10
  config file = /etc/ansible/ansible.cfg
  configured module search path = [u'/home/admin/.ansible/plugins/modules', u'/usr/share/ansible/plugins/modules']
  ansible python module location = /usr/lib/python2.7/dist-packages/ansible
  executable location = /usr/bin/ansible
  python version = 2.7.15rc1 (default, Nov 12 2018, 14:31:15) [GCC 7.3.0]

`

Customized python module

`

#!/usr/bin/python

“”"

Aimed to install dcos packages

ref

  1. https://github.com/dcos-labs/ansible-dcos-module.git

“”"

import os

import sys

import time

import json

import tempfile

import subprocess

from ansible.module_utils.basic import AnsibleModule

def run_command(cmd, description=‘run command’, stop_on_error=False, input=None):

“”“Run a command and catch exceptions for Ansible.”“”

print("command: " + ’ '.join(cmd))

from subprocess import CalledProcessError, check_output

try:

output = check_output(cmd, stderr=subprocess.STDOUT)

returncode = 0

except CalledProcessError as e:

print(“Failed to run command, exception as {}”.format(e))

output = e.output

returncode = e.returncode

if stop_on_error and returncode != 0:

raise Exception(‘Failed to {}: {}’.format(description, e))

return output

def get_current_version(package, app_id):

“”“Get the current version of an installed package.”“”

r = subprocess.check_output(

[‘dcos’, ‘package’, ‘list’, ‘–json’, ‘–app-id=’+app_id])

packages = json.loads(r)

print(‘looking for package {} app_id {}’.format(package, app_id))

v = None

for p in packages:

try:

if p[‘name’] == package and ‘/’ + app_id in p[‘apps’]:

v = p[‘version’]

except KeyError:

continue

print(‘{} current version: {}’.format(package, v))

return v

def install_package(package, version, options):

“”“Install a Universe package on DC/OS.”“”

print(“DC/OS: installing package {} version {}”.format(package, version))

create a temporary file for the options json file

with tempfile.NamedTemporaryFile(‘w+’) as f:

json.dump(options, f)

f.write(options)

force write the file to disk to make sure subcommand can read it

f.flush()

os.fsync(f)

print(“options as \n” + subprocess.check_output([‘cat’, f.name]).decode())

cmd = [

‘dcos’,

‘package’,

‘install’,

package,

‘–yes’,

‘–package-version=%s’ % version,

‘–options=%s’ % f.name,

]

run_command(cmd, ‘install package’, stop_on_error=True)

time.sleep(20)

def update_package(package, app_id, version, options):

“”“Update a Universe package on DC/OS.”“”

print(“DC/OS: updating package {} version {}”.format(package, version))

app_remove(app_id)

time.sleep(20)

while get_current_version(package, app_id) is not None:

time.sleep(1)

install_package(package, version, options)

def uninstall_package(package, app_id):

print(“DC/OS: uninstalling package {}”.format(package))

cmd = [

‘dcos’,

‘package’,

‘uninstall’,

package,

‘–yes’,

‘–app’,

‘–app-id’,

‘/’ + app_id,

]

run_command(cmd, ‘uninstall package’, stop_on_error=True)

def app_remove(app_id):

print(“DC/OS: remove app {}”.format(app_id))

cmd = [

‘dcos’,

‘marathon’,

‘app’,

‘remove’,

‘/’ + app_id,

]

run_command(cmd, ‘remove app’, stop_on_error=True)

def main():

result = {}

changed = True

fields = {

“name”: {“default”: True, “type”: “str”},

“app_id”: {“default”: True, “type”: “str”},

“version”: {“default”: True, “type”: “str”},

“options”: {“default”: True, “type”: “str”},

}

module = AnsibleModule(argument_spec=fields)

package_name = module.params.get(‘name’, None)

wanted_version = module.params.get(‘version’, None)

ensure app_id has no leading or trailing /

app_id = module.params.get(‘app_id’, package_name).strip(‘/’)

options = module.params.get(‘options’)

current_version = get_current_version(package_name, app_id)

if current_version == wanted_version:

print(“Package {} already in desired state”.format(package_name))

result[‘action’] = “[No Action]already get target version”

changed = False

else:

print(“Package {} not in desired state”.format(package_name))

if wanted_version is not None:

if current_version is not None:

update_package(package_name, app_id,

wanted_version, options)

result[‘action’] = “[Upgrade] already installed cassandra while not target version, do remove and install”

else:

install_package(package_name, wanted_version, options)

result[‘action’] = “[Install] no cassandra found, do install target version”

else:

uninstall_package(package_name, app_id)

result[‘action’] = “[Uninstall] cassandra found while no version specified, do uninstall”

result[‘current_version’] = current_version

result[‘param’] = module.params

module.exit_json(changed=changed, meta=result)

if name == ‘main’:

main()

` **Playbook**

`

- name: Ensure cassandra is installed
  dcos_package:
    name: cassandra
    app_id: cassandra
    version: "{{cassandra_version}}"
    options: >
      {
          "nodes": {
              "count": 3,
              "cpus": 0.3,
              "mem": 3072,
              "disk": 3584,
              "heap": {
                  "size": 1536
              },
              "placement_constraint": "[[\"hostname\", \"MAX_PER\", \"1\"],[\"role\", \"LIKE\", \"cassandra\" ]]"
          }
      }
  register: install_cassandra

- debug: var=install_cassandra

`

log output with -vvv

`

TASK [dcos_packages : Ensure cassandra is installed] ****************************************************************************************************************************************************************************************
task path: /terraform-ansible/roles/dcos_packages/tasks/main.yml:2
<XXX.XXX.XXX.XXX> ESTABLISH SSH CONNECTION FOR USER: admin
<XXX.XXX.XXX.XXX> SSH: EXEC ssh -C -o ControlMaster=auto -o ControlPersist=120s -o KbdInteractiveAuthentication=no -o PreferredAuthentications=gssapi-with-mic,gssapi-keyex,hostbased,publickey -o PasswordAuthentication=no -o User=admin -o ConnectTimeout=10 -o StrictHostKeyChecking=no -o ‘ProxyCommand=ssh -W %h:22 -q -p 22 admin@bastion_host’ -o ControlPath=/home/admin/.ansible/cp/1e34139989 XXX.XXX.XXX.XXX ‘/bin/sh -c ‘"’“‘echo ~admin && sleep 0’”’“‘’
<XXX.XXX.XXX.XXX> (0, ‘/home/admin\n’, ‘’)
<XXX.XXX.XXX.XXX> ESTABLISH SSH CONNECTION FOR USER: admin
<XXX.XXX.XXX.XXX> SSH: EXEC ssh -C -o ControlMaster=auto -o ControlPersist=120s -o KbdInteractiveAuthentication=no -o PreferredAuthentications=gssapi-with-mic,gssapi-keyex,hostbased,publickey -o PasswordAuthentication=no -o User=admin -o ConnectTimeout=10 -o StrictHostKeyChecking=no -o ‘ProxyCommand=ssh -W %h:22 -q -p 22 admin@bastion_host’ -o ControlPath=/home/admin/.ansible/cp/1e34139989 XXX.XXX.XXX.XXX '/bin/sh -c '”‘"’( umask 77 && mkdir -p “echo /home/admin/.ansible/tmp/ansible-tmp-1559208567.96-144121008933299” && echo ansible-tmp-1559208567.96-144121008933299=“echo /home/admin/.ansible/tmp/ansible-tmp-1559208567.96-144121008933299” ) && sleep 0’“'”‘’
<XXX.XXX.XXX.XXX> (0, ‘ansible-tmp-1559208567.96-144121008933299=/home/admin/.ansible/tmp/ansible-tmp-1559208567.96-144121008933299\n’, ‘’)
Using module file /terraform-ansible/library/dcos_package.py
<XXX.XXX.XXX.XXX> PUT /home/admin/.ansible/tmp/ansible-local-28131ZNQ5K/tmpszdroA TO /home/admin/.ansible/tmp/ansible-tmp-1559208567.96-144121008933299/AnsiballZ_dcos_package.py
<XXX.XXX.XXX.XXX> SSH: EXEC scp -C -o ControlMaster=auto -o ControlPersist=120s -o KbdInteractiveAuthentication=no -o PreferredAuthentications=gssapi-with-mic,gssapi-keyex,hostbased,publickey -o PasswordAuthentication=no -o User=admin -o ConnectTimeout=10 -o StrictHostKeyChecking=no -o ‘ProxyCommand=ssh -W %h:22 -q -p 22 admin@bastion_host’ -o ControlPath=/home/admin/.ansible/cp/1e34139989 /home/admin/.ansible/tmp/ansible-local-28131ZNQ5K/tmpszdroA ‘[XXX.XXX.XXX.XXX]:/home/admin/.ansible/tmp/ansible-tmp-1559208567.96-144121008933299/AnsiballZ_dcos_package.py’
<XXX.XXX.XXX.XXX> (0, ‘’, ‘’)
<XXX.XXX.XXX.XXX> ESTABLISH SSH CONNECTION FOR USER: admin
<XXX.XXX.XXX.XXX> SSH: EXEC ssh -C -o ControlMaster=auto -o ControlPersist=120s -o KbdInteractiveAuthentication=no -o PreferredAuthentications=gssapi-with-mic,gssapi-keyex,hostbased,publickey -o PasswordAuthentication=no -o User=admin -o ConnectTimeout=10 -o StrictHostKeyChecking=no -o ‘ProxyCommand=ssh -W %h:22 -q -p 22 admin@bastion_host’ -o ControlPath=/home/admin/.ansible/cp/1e34139989 XXX.XXX.XXX.XXX ‘/bin/sh -c ‘"’“‘chmod u+x /home/admin/.ansible/tmp/ansible-tmp-1559208567.96-144121008933299/ /home/admin/.ansible/tmp/ansible-tmp-1559208567.96-144121008933299/AnsiballZ_dcos_package.py && sleep 0’”’“‘’
<XXX.XXX.XXX.XXX> (0, ‘’, ‘’)
<XXX.XXX.XXX.XXX> ESTABLISH SSH CONNECTION FOR USER: admin
<XXX.XXX.XXX.XXX> SSH: EXEC ssh -C -o ControlMaster=auto -o ControlPersist=120s -o KbdInteractiveAuthentication=no -o PreferredAuthentications=gssapi-with-mic,gssapi-keyex,hostbased,publickey -o PasswordAuthentication=no -o User=admin -o ConnectTimeout=10 -o StrictHostKeyChecking=no -o ‘ProxyCommand=ssh -W %h:22 -q -p 22 admin@bastion_host’ -o ControlPath=/home/admin/.ansible/cp/1e34139989 -tt XXX.XXX.XXX.XXX '/bin/sh -c '”‘“'sudo -H -S -n -u root /bin/sh -c '”’“'”‘"’“'”‘"’“‘echo BECOME-SUCCESS-imgjrgyfedfryywgodhpumidkfxbyzyh; /usr/bin/python /home/admin/.ansible/tmp/ansible-tmp-1559208567.96-144121008933299/AnsiballZ_dcos_package.py’”‘"’“'”‘"’“'”‘"’ && sleep 0’“'”‘’
Escalation succeeded
<XXX.XXX.XXX.XXX> (0, ‘looking for package cassandra app_id cassandra\r\ncassandra current version: None\r\nPackage cassandra not in desired state\r\nDC/OS: installing package cassandra version 2.5.0-3.11.3\r\noptions as \r\n{\r\n “nodes”: {\r\n “count”: 3,\r\n “cpus”: 0.3,\r\n “mem”: 3072,\r\n “disk”: 3584,\r\n “heap”: {\r\n “size”: 1536\r\n },\r\n “placement_constraint”: “[[\“hostname\”, \“MAX_PER\”, \“1\”],[\“role\”, \“LIKE\”, \“cassandra\” ]]”\r\n }\r\n}\r\n\r\ncommand: dcos package install cassandra --yes --package-version=2.5.0-3.11.3 --options=/tmp/tmpZ225kn\r\n\r\n{“invocation”: {“module_args”: {“version”: “2.5.0-3.11.3”, “app_id”: “cassandra”, “name”: “cassandra”, “options”: “{\n \“nodes\”: {\n \“count\”: 3,\n \“cpus\”: 0.3,\n \“mem\”: 3072,\n \“disk\”: 3584,\n \“heap\”: {\n \“size\”: 1536\n },\n \“placement_constraint\”: \”[[\\\“hostname\\\”, \\\“MAX_PER\\\”, \\\“1\\\”],[\\\“role\\\”, \\\“LIKE\\\”, \\\“cassandra\\\” ]]\“\n }\n}\n”}}, “changed”: true, “meta”: {“action”: “[Install] no cassandra found, do install target version”, “current_version”: null, “param”: {“version”: “2.5.0-3.11.3”, “app_id”: “cassandra”, “name”: “cassandra”, “options”: “{\n \“nodes\”: {\n \“count\”: 3,\n \“cpus\”: 0.3,\n \“mem\”: 3072,\n \“disk\”: 3584,\n \“heap\”: {\n \“size\”: 1536\n },\n \“placement_constraint\”: \”[[\\\“hostname\\\”, \\\“MAX_PER\\\”, \\\“1\\\”],[\\\“role\\\”, \\\“LIKE\\\”, \\\“cassandra\\\” ]]\“\n }\n}\n”}}}\r\n’, ‘Shared connection to XXX.XXX.XXX.XXX closed.\r\n’)
<XXX.XXX.XXX.XXX> ESTABLISH SSH CONNECTION FOR USER: admin
<XXX.XXX.XXX.XXX> SSH: EXEC ssh -C -o ControlMaster=auto -o ControlPersist=120s -o KbdInteractiveAuthentication=no -o PreferredAuthentications=gssapi-with-mic,gssapi-keyex,hostbased,publickey -o PasswordAuthentication=no -o User=admin -o ConnectTimeout=10 -o StrictHostKeyChecking=no -o ‘ProxyCommand=ssh -W %h:22 -q -p 22 admin@bastion_host’ -o ControlPath=/home/admin/.ansible/cp/1e34139989 XXX.XXX.XXX.XXX ‘/bin/sh -c ‘"’“‘rm -f -r /home/admin/.ansible/tmp/ansible-tmp-1559208567.96-144121008933299/ > /dev/null 2>&1 && sleep 0’”’"‘’
<XXX.XXX.XXX.XXX> (0, ‘’, ‘’)
fatal: [XXX.XXX.XXX.XXX]: FAILED! => changed=false
module_stderr: |-
Shared connection to XXX.XXX.XXX.XXX closed.
module_stdout: |-
looking for package cassandra app_id cassandra
cassandra current version: None
Package cassandra not in desired state
DC/OS: installing package cassandra version 2.5.0-3.11.3
options as
{
“nodes”: {
“count”: 3,
“cpus”: 0.3,
“mem”: 3072,
“disk”: 3584,
“heap”: {
“size”: 1536
},
“placement_constraint”: “[["hostname", "MAX_PER", "1"],["role", "LIKE", "cassandra" ]]”
}
}

command: dcos package install cassandra --yes --package-version=2.5.0-3.11.3 --options=/tmp/tmpZ225kn

{“invocation”: {“module_args”: {“version”: “2.5.0-3.11.3”, “app_id”: “cassandra”, “name”: “cassandra”, “options”: “{\n "nodes": {\n "count": 3,\n "cpus": 0.3,\n "mem": 3072,\n "disk": 3584,\n "heap": {\n "size": 1536\n },\n "placement_constraint": "[[\"hostname\", \"MAX_PER\", \"1\"],[\"role\", \"LIKE\", \"cassandra\" ]]"\n }\n}\n”}}, “changed”: true, “meta”: {“action”: “[Install] no cassandra found, do install target version”, “current_version”: null, “param”: {“version”: “2.5.0-3.11.3”, “app_id”: “cassandra”, “name”: “cassandra”, “options”: “{\n "nodes": {\n "count": 3,\n "cpus": 0.3,\n "mem": 3072,\n "disk": 3584,\n "heap": {\n "size": 1536\n },\n "placement_constraint": "[[\"hostname\", \"MAX_PER\", \"1\"],[\"role\", \"LIKE\", \"cassandra\" ]]"\n }\n}\n”}}}
msg: |-
MODULE FAILURE
See stdout/stderr for the exact error
rc: 0
to retry, use: --limit @/terraform-ansible/deploy-services.retry

PLAY RECAP **********************************************************************************************************************************************************************************************************************************
XXX.XXX.XXX.XXX : ok=1 changed=0 unreachable=0 failed=1

`

Appreciate if any kindly help, thanks~

When disabled all print actions in the python module, everything worked.
Have no idea about the reason.
Appreciate if any kindly help, thanks~