![](/img/trans.png)
[英]Gitlab backup restore Error --> tar: This does not look like a tar archive
[英]How does ansible's unarchive module look for the tar binary?
我正在尝试执行一个ansible剧本,该剧本具有使用unarchive
模块的任务。 因为我是在OSX上执行此操作,所以我需要它使用gnu-tar
而不是OSX通常随附的bsd tar
,因为BSD tar没有得到官方支持 。
我已经使用brew
安装了gnu-tar
,并将此程序包的gnubin
文件夹放在$PATH
变量中其他路径的前面。 但是,我的剧本仍在/usr/bin
文件夹(原始tar
的位置)中寻找tar
,而不是新安装的gnu-tar
。
我的问题是,非unarchive
模块如何查找tar
二进制文件,而对我来说,重写此行为以便使其利用gnu-tar
的最佳方式是什么?
我找到了解决方案。
在继续之前,这是我的代码,用于确保酿造安装的gnu-tar
优先于OSX随附的bsd-tar
:
# gnu-tar
export PATH="/usr/local/opt/gnu-tar/libexec/gnubin:$PATH"
export MANPATH="/usr/local/opt/gnu-tar/libexec/gnuman:$MANPATH"
该代码最初位于我的~/.bash_profile
文件中。
ansible查找tar
二进制文件的方式与您期望的一样: $PATH
变量,与任何其他进程一样。 但是,运行播放会创建一个交互式非登录shell 。 正如解释这里的~/.bashrc
文件被加载交互式非登录炮弹 ,而~/.bash_profile
被加载的登录外壳 。
由于我的代码位于~/.bash_profile
文件中,因此无论我何时运行播放,它都不会执行。 同样,这是因为运行播放会创建一个交互式非登录外壳 ,该外壳 不会加载~/.bash_profile
。 因此,代码实际上应该在~/.bashrc
。
确实,我将代码移至~/.bashrc
的那一刻是我的任务开始使用已安装的gnu-tar
。 我能够通过创建一个任务来将which tar
注册到变量中并在另一个debug
任务中打印出来来确认这一点。
从源代码看来,tar正在寻找gtar
二进制文件,如果不是,则在寻找tar
# Prefer gtar (GNU tar) as it supports the compression options -zjJ self.cmd_path = self.module.get_bin_path('gtar', None) if not self.cmd_path: # Fallback to tar self.cmd_path = self.module.get_bin_path('tar')
因此,将您的brew安装的gnu tar别名为“ gtar”或“ tar”应该可以解决此问题
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.