Ansible不能取消存档tar.gz文件

时间:2019-04-18 16:53:10

标签: ansible

我试图用ansible解压缩tar.gz文件(我做了很多事情),但是由于某种原因,我这次无法解决该错误。

我不断得到:

"msg": "Failed to find handler for \"/tmp/ansible_mnXJGp/internalbuildscripts1.tar.gz\". Make sure the required command to extract the file is installed. Command \"/bin/tar\" could not handle archive. Command \"/usr/bin/unzip\" could not handle archive."

奇怪的是,它似乎试图在tar.gz文件上使用解压缩。

任务看起来像这样:

- name: Download build scripts
  unarchive:
    src: https://sblah.com/internalbuildscripts1.tar.gz
    dest: /home/xxxx/buildscripts
    remote_src: yes

1 个答案:

答案 0 :(得分:2)

所以我遇到了同样的问题,最终调试了非归档模块,以找出为什么它认为无法处理文件。

TL; DR我的dest是相对路径。 unarchive检查gtar是否可以处理文件的检查是这样的:

/usr/local/bin/gtar --list -C ./my/dest/path -z -f /Users/fransf/.ansible/tmp/ansible-tmp-1603283396.0748851-45418-232955281061540/source

但这是在将工作目录ALSO设置为./my/dest/path的情况下完成的,因此它实际上是在尝试解压缩到不存在的./my/dest/path/my/dest/path中。 !

所以这就是我的问题。我改用绝对路径,unarchive很高兴。我确实认为这是一个错误,并且显然不是unarchive测试套件中的测试用例。

调试Ansible模块

  1. ANSIBLE_KEEP_REMOTE_FILES环境变量设置为1(即ANSIBLE_KEEP_REMOTE_FILES=1 ansible-playbook -vvvv deploy.yml)的情况下运行您的剧本。在输出中的某处(如果您使用-vvvv运行),您将看到类似以下内容的内容:

     EXEC /bin/sh -c '/usr/local/Cellar/ansible/2.9.10/libexec/bin/python3.8 /Users/fransf/.ansible/tmp/ansible-tmp-1603283396.0748851-45418-232955281061540/AnsiballZ_unarchive.py && sleep 0'
    
  2. 运行相同的命令,但带有explode参数,如下所示:

     /usr/local/Cellar/ansible/2.9.10/libexec/bin/python3.8 /Users/fransf/.ansible/tmp/ansible-tmp-1603283396.0748851-45418-232955281061540/AnsiballZ_unarchive.py explode
    
  3. 您将获得一些输出,告诉您爆炸模块源的写入位置,例如

     2955281061540/AnsiballZ_unarchive.py explode
     Module expanded into:
     /Users/fransf/.ansible/tmp/ansible-tmp-1603283396.0748851-45418232955281061540/debug_dir
    
  4. 现在,您已经可以使用print语句或通过实际的调试器运行的Python源代码。要运行该模块,请使用与爆炸相同的命令,但指定execute而不是explode

     /usr/local/Cellar/ansible/2.9.10/libexec/bin/python3.8 /Users/fransf/.ansible/tmp/ansible-tmp-1603283396.0748851-45418-232955281061540/AnsiballZ_unarchive.py execute
    

    您可以从命令行或从IDE中执行此操作。我已经在使用IntelliJ Ultimate并安装Python插件,这是我能够通过调试器运行此模块,设置断点,查看变量以及找出问题所在的全部条件。

希望这可以帮助其他有类似问题的人。