在托管nod上强制使用nonOS Python解释器时,Playbook陷入困境

2024-10-02 00:40:00 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试为其中一个托管RHEL5.6的应用程序自动化部署。操作系统默认为python2.4.3。 我的Ansible控件节点在RHEL7.2和Python2.7.5上运行。你知道吗

我已经在托管节点上安装了python2.7.5,并强制Ansible使用新的版本,但是现在它无法生成任何输出。你知道吗

当我尝试运行playbook时,失败了,错误如下:

fatal: [<hostname>]: FAILED! => {
    "msg": "Failed to get information on remote file (/secure/ShellScript/Params/SFT_Folder.txt): Shared connection to <IP Address> closed.\r\n"

详细的输出提示了使用/usr/bin/python的问题

我在托管节点的不同位置安装了python2.7.5,并在hosts文件中添加了ansible\u Python\u interpreter=/opt/python2.7/bin/python2.7

这将详细错误更改为共享库,同时保留相同的最终错误消息:

<IP Address> SSH: EXEC ssh -C -o ControlMaster=auto -o ControlPersist=60s -o StrictHostKeyChecking=no -o KbdInteractiveAuthentication=no -o PreferredAuthentications=gssapi-with-mic,gssapi-keyex,hostbased,publickey -o PasswordAuthentication=no -o User=batchusr -o ConnectTimeout=10 -o ControlPath=/home/ansible/.ansible/cp/ce68d6977c -tt <IP Address> '/bin/sh -c '"'"'/opt/python2.7/bin/python2.7 /home/batchusr/.ansible/tmp/ansible-tmp-1554464098.34-28789780698815/AnsiballZ_stat.py && sleep 0'"'"''
<10.30.18.6> (127, '/opt/python2.7/bin/python2.7: error while loading shared libraries: libpython2.7.so.1.0: cannot open shared object file: No such file or directory\r\n', 'Shared connection to <IP Address> closed.\r\n')
fatal: [ibmsitlsft02]: FAILED! => {
    "msg": "Failed to get information on remote file (/secure/ShellScript/Params/SFT_Folder.txt): Shared connection to <IP Address> closed.\r\n"

因此,我创建了一个包含以下内容的可执行python文件,更改了解释器的位置并再次尝试

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/opt/python2.7/lib
/opt/python2.7/bin/python2.7

现在它只是停留在下面的步骤中,没有进一步的输出或日志生成。你知道吗

<IP Address> SSH: EXEC ssh -C -o ControlMaster=auto -o ControlPersist=60s -o StrictHostKeyChecking=no -o KbdInteractiveAuthentication=no -o PreferredAuthentications=gssapi-with-mic,gssapi-keyex,hostbased,publickey -o PasswordAuthentication=no -o User=batchusr -o ConnectTimeout=10 -o ControlPath=/home/ansible/.ansible/cp/ce68d6977c -tt <IP Address> '/bin/sh -c '"'"'/opt/python2.7/python /home/batchusr/.ansible/tmp/ansible-tmp-1554464252.78-244901400191906/AnsiballZ_stat.py && sleep 0'"'"''

ansible-playbook -i inventories/hosts sft_deploy_main.yml -vvv

预期产量:

PLAY RECAP **************************************************************************************************************************************************
<hostname>                 : ok=1    changed=0    unreachable=0    failed=0
localhost                  : ok=1    changed=0    unreachable=0    failed=0

实际输出: 不前进


Tags: tonoiphomebin节点address错误
3条回答

我认为问题是您的可执行文件不接受传递给它的参数。如果尝试将可执行文件替换为:

#!/bin/bash
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/opt/python2.7/lib
/opt/python2.7/bin/python2.7 "$@"

还要确保在该文件上设置了execute位。你知道吗

最近的问题是由您编写的包装器引起的。你知道吗

您试图用以下内容替换python可执行文件:

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/opt/python2.7/lib
/opt/python2.7/bin/python2.7

这有两个问题:

  1. 您真的应该从#!/bin/sh开始,而不是依赖于回退行为。你知道吗
  2. 您应该使用exec /opt/python2.7/bin/python2.7,而不是将shell进程挂起
  3. 最重要的是,您将丢弃python命令的所有参数。您需要更改:

    /opt/python2.7/bin/python2.7
    

    收件人:

    /opt/python2.7/bin/python2.7 "$@"
    

正如您编写的包装器一样,运行时:

/path/to/wrapper myfile.py

实际上,您将启动一个交互式Python解释器,而不是运行myfile.py,这就是您的playbook运行挂起的原因。你知道吗

退一步说,比使用包装器更好的解决方案是适当地配置/etc/ld.so.conf,这样/opt/python2.7/bin/python2.7就可以在不设置LD_LIBRARY_PATH的情况下运行。你知道吗

根据larsks和MassPikeMike的建议,我现在已经将托管节点上的python文件修改为以下内容,它现在可以完美地工作:

# cat /opt/python2.7/python
#!/bin/sh
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/opt/python2.7/lib
exec /opt/python2.7/bin/python2.7 "$@"

相关问题 更多 >

    热门问题