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
任务中打印它来确认这一点。
我正在尝试执行一个具有使用 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
任务中打印它来确认这一点。