【发布时间】:2017-11-21 04:39:58
【问题描述】:
我正在尝试制作一个使用 ansible-playbook 在远程主机上安装 halyard 的剧本。其中一项任务是对实际安装程序执行“InstallHalyard.sh”包装脚本(参考:https://www.spinnaker.io/setup/install/halyard/)。
不存在错误/失败,但也没有任何变化,就好像没有执行 InstallHalyard.sh 脚本一样。不过,如果我通过输入手动命令来做到这一点就可以了。另一个类似的任务完美运行。
可以看到InstallHalyard.sh脚本实现:here
知道发生了什么吗?
这是我的剧本中的任务:
name: Run InstallHalyard.sh
become: yes
become_user: sudo
shell: "{{ ansible_env.HOME }}/.spinnaker/InstallHalyard.sh"
任何帮助将不胜感激,非常感谢你:)
编辑:
已经尝试过使用脚本、命令和 shell 模块。
仅供参考,InstallHalyard.sh 脚本将通过传递一个环境变量来调用自身,并且需要执行 curl -O
我怀疑脚本中的“导出”操作不起作用,因为 Ansible 对环境变量有不同的理解。 (例如,ansible 不会识别“$HOME”,而是使用“{{ ansible_env.HOME }}”。)
编辑:
我发现脚本做了一个fork的操作,ansible能处理这种操作吗?
在 localhost 上测试,得到了相同的结果。
解决方案
这是因为ansible对环境变量的不同解释。如果我手动执行脚本,包装器会设置环境变量并将其传递给下一个脚本调用,而这是 ansible 无法做到的。所以我所做的是在执行脚本之前使用 ansible 模块手动设置环境变量(只需添加 2 行)
这是我修改后的任务:
name: Run InstallHalyard.sh
become: yes
become_user: sudo
environment:
HAL_USER: "{{ ansible_env.USER }}"
shell: "{{ ansible_env.HOME }}/.spinnaker/InstallHalyard.sh"
【问题讨论】:
-
您应该检查基本路径目录,您可以将相对路径替换为InstallHalyard.sh脚本中可执行文件的绝对路径。并注意 sudo 意味着用户是 root 用户。它的环境变量是基于root的。
-
你可以尝试使用:命令:“{{ ansible_env.HOME }}/.spinnaker/InstallHalyard.sh”
-
@Daein {{ ansible_env.HOME }} 给当前用户 $HOME 环境变量是 /home/user,这意味着它意味着绝对路径,我也尝试通过手动输入绝对路径,仍然不工作。感谢您的回答
-
@abhishekphukan 已经尝试过了,没有任何反应。谢谢你的回答
-
仅供参考,InstallHalyard.sh 脚本将通过传递一个环境变量来调用自身,并且需要执行 curl -O