美文网首页
ansible中直行脚本报错解决

ansible中直行脚本报错解决

作者: 小蜗牛爬楼梯 | 来源:发表于2019-12-27 20:10 被阅读0次

    我的错误信息:

    fatal: [org0.example.com]: FAILED! => {"changed": false, "cmd": "sshpass -d9 /usr/bin/rsync --delay-updates -F --compress --archive '--rsh=/usr/bin/ssh -S none -o Port=22 -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null' '--out-format=<<CHANGED>>%i %n%L' /Users/liyi/github/Ansible-Fabric-Starter/templates/chaincode ''", "msg": "[Errno 32] Broken pipe", "rc": 32}
    

    网友错误信息:

    The full traceback is:
    WARNING: The below traceback may *not* be related to the actual failure.
      File "/tmp/ansible_synchronize_payload_vWRlFT/ansible_synchronize_payload.zip/ansible/module_utils/basic.py", line 2563, in run_command
        before_communicate_callback(cmd)
      File "/tmp/ansible_synchronize_payload_vWRlFT/__main__.py", line 581, in _write_********_to_pipe
        os.write(_sshpass_pipe[1], to_bytes(rsync_********) + b'\n')
    
    localhost | FAILED! => {
        "ansible_facts": {
            "discovered_interpreter_python": "/usr/bin/python"
        }, 
        "changed": false, 
        "cmd": "sshpass -d11 /usr/bin/rsync --delay-updates -F --compress --archive '--rsh=/usr/bin/ssh -S none -o Port=9000 -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null' '--out-format=<<CHANGED>>%i %n%L' /tmp/foo ''", 
        "invocation": {
            "module_args": {
                "_local_rsync_password": "VALUE_SPECIFIED_IN_NO_LOG_PARAMETER", 
                "_local_rsync_path": "rsync", 
                "_substitute_controller": false, 
                "archive": true, 
                "checksum": false, 
                "compress": true, 
                "copy_links": false, 
                "delete": false, 
                "dest": "root@localhost:/tmp", 
                "dest_port": 9000, 
                "dirs": false, 
                "existing_only": false, 
                "group": null, 
                "link_dest": null, 
                "links": null, 
                "mode": "push", 
                "owner": null, 
                "partial": false, 
                "perms": null, 
                "private_key": null, 
                "recursive": null, 
                "rsync_opts": [], 
                "rsync_path": null, 
                "rsync_timeout": 0, 
                "set_remote_user": true, 
                "src": "/tmp/foo", 
                "ssh_args": null, 
                "times": null, 
                "verify_host": false
            }
        }, 
        "msg": "[Errno 32] Broken pipe", 
        "rc": 32
    }
    

    当通过Python 2解释器在控件主机上运行Ansible时,似乎会出现此问题。 为避免在命令行中将密码传递给sshpass,它使用管道和Popen(pass_fds =),这仅在Python 3中可用。

    我在控制机上运行Ubuntu 18.04 LTS,似乎它仍然使用python2解释器运行Ansible,因此它无法将密码传递给sshpass,并且过程失败。

    修补/usr/lib/python2.7/dist-packages/ansible/modules/files/synchronize.py相对简单,以便在命令行而不是使用管道来传递密码。 这是diff(基本文件来自Ansible 2.9.1版):

    463,464c463,464
    <         _sshpass_pipe = os.pipe()
    <         cmd = ['sshpass', '-d' + to_native(_sshpass_pipe[0], errors='surrogate_or_strict')] + cmd
    ---
    >         cmd = ['sshpass', '-p' + rsync_password] + cmd
    > 
    577,592c577
    <     # If we are using password authentication, write the password into the pipe
    <     if rsync_password:
    <         def _write_password_to_pipe(proc):
    <             os.close(_sshpass_pipe[0])
    <             try:
    <                 os.write(_sshpass_pipe[1], to_bytes(rsync_password) + b'\n')
    <             except OSError as exc:
    <                 # Ignore broken pipe errors if the sshpass process has exited.
    <                 if exc.errno != errno.EPIPE or proc.poll() is None:
    <                     raise
    < 
    <         (rc, out, err) = module.run_command(
    <             cmd, pass_fds=_sshpass_pipe,
    <             before_communicate_callback=_write_password_to_pipe)
    <     else:
    <         (rc, out, err) = module.run_command(cmd)
    ---
    >     (rc, out, err) = module.run_command(cmd)
    

    我还使用了模块选项rsync_path:rsync以避免远程计算机上的sudo密码出现问题(我在那里不需要提升的特权)。

    附言 我认为添加选项以在命令行上将密码传递给sshpass来容纳python2用户可能很好并且非常容易。 如果需要,我可以提供PR。

    相关文章

      网友评论

          本文标题:ansible中直行脚本报错解决

          本文链接:https://www.haomeiwen.com/subject/cfxjoctx.html