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

How does ansible's unarchive module look for the tar binary?

我正在尝试执行一个具有使用 unarchive 模块的任务的 ansible 剧本。因为我在 OSX 上执行此操作,所以我需要它使用 gnu-tar,而不是 OSX 通常附带的 bsd tar,因为 BSD tar is not officially supported

我已经使用 brew 安装了 gnu-tar,并将此包的 gnubin 文件夹放在 $PATH 变量中其他路径的前面。但是,我的playbook还是在/usr/bin文件夹(原来tar的位置)里找tar,而不是新安装的gnu-tar.

我的问题是,unarchive 模块如何查找 tar 二进制文件,什么是我覆盖此行为以利用 gnu-tar 的最佳方式, 而不是?

从源代码看来,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" 应该可以解决问题

我找到了解决办法。

在我们继续之前,这是我的代码,用于确保 brew 安装的 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。如 here 所述,~/.bashrc 文件为 交互式非登录 shells 加载,而 ~/.bash_profile登录shells.

由于我的代码位于 ~/.bash_profile 文件中,所以它永远不会在我 运行 播放时执行。同样,这是因为 运行玩游戏会创建一个 交互式非登录 shell 不会 加载 ~/.bash_profile。因此,代码实际上应该在 ~/.bashrc.

确实如此,我将代码移至 ~/.bashrc 的那一刻正是我的任务开始使用已安装的 gnu-tar 的时候。我能够通过创建一个任务将 which tar 注册到一个变量中并在另一个 debug 任务中打印它来确认这一点。