猿问

ansible的unarchive模块如何查找tar二进制文件?

我正在尝试执行一个使用该unarchive模块的任务的ansible剧本。因为我是在OSX上执行此操作,所以我需要使用它gnu-tar,而不是bsd tarOSX通常附带的功能,因为BSD tar不受官方支持。

我已gnu-tar使用安装了brewgnubin文件,并将此程序包的文件夹放在$PATH变量中其他路径的前面。但是,我的剧本仍在文件夹(原始位置)中查找,而不是在新安装tar/usr/bin文件夹中查找。targnu-tar

我的问题是,unarchive模块如何查找tar二进制文件?对我来说,重写此行为以便利用的最佳方法是什么gnu-tar


慕尼黑8549860
浏览 308回答 2
2回答

慕运维8079593

我找到了解决方案。在继续之前,这是我的代码,用于确保Brew-installedgnu-tar优先于bsd-tarOSX附带的代码:# gnu-tarexport PATH="/usr/local/opt/gnu-tar/libexec/gnubin:$PATH"export MANPATH="/usr/local/opt/gnu-tar/libexec/gnuman:$MANPATH"该代码最初位于我的~/.bash_profile文件中。Ansible查找tar二进制文件的方式与您期望的一样:该$PATH变量与其他任何过程一样。但是,运行剧本会创建一个交互式非登录外壳程序。正如解释在这里,该~/.bashrc文件被加载交互式非登录shell,而~/.bash_profile被载入了登录shell。由于我的代码位于~/.bash_profile文件中,因此无论我何时运行播放,它都永远不会执行。同样,这是因为运行播放会创建一个交互式非登录外壳,该外壳不会加载~/.bash_profile。因此,代码实际上应该在中~/.bashrc。的确如此,当我将代码移至的那一刻~/.bashrc是我的任务开始使用installed的时间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”应该可以解决问题
随时随地看视频慕课网APP
我要回答