i通过使用Ansible使用变量同时附加/etc/bash.bashrc
和$HOME/.bashrc
。
Ansible完成后,两个文件看起来如下。
在/etc/bash.bashrc
中:
...
export VAR1="some text comes here"
...
在$HOME/.bashrc
中:
...
export VAR2="other text comes here"
...
因此,Ansible的工作完美。
vagrantfile中的shell脚本,该脚本在可安排完成后运行:
$init = <<-SCRIPT
whoami
echo $HOME
cat /etc/bash.bashrc
cat $HOME/.bashrc
source /etc/bash.bashrc
source $HOME/.bashrc
echo "VAR1 :: $VAR1"
echo "VAR2 :: $VAR2"
SCRIPT
config.vm.provision :init, type: :shell, inline: $init, privileged: false
,即使两个变量设置在两个文件中,然后两个文件都采购,输出为:
vagrant
/home/vagrant
---> /etc/bash.bashrc contains the export
---> $HOME/.bashrc contains the export as well
VAR1 ::
VAR2 ::
我们看到两个变量未设置并提供空字符串。
我尝试了$HOME/.profile
,但结果相同。
您是否知道该如何进行?
/etc/bash.bashrc
和source $HOME/.bashrc
包含变量分配是不够的。变量分配实际上必须有机会执行。
如果您查看两个脚本的来源(以下来自Debian的示例),它们包含在非交互式外壳中调用时破坏执行的行:
-
/etc/bash.bashrc
# If not running interactively, don't do anything [ -z "$PS1" ] && return
-
$HOME/.bashrc
# If not running interactively, don't do anything case $- in *i*) ;; *) return;; esac
因此,即使您明确源源来源源,如果您在这些条件后插入export VAR1="some text comes here"
或export VAR2="other text comes here"
行,当配置脚本以非相互作用外壳运行时,它们也永远不会执行。
您实际上并未显示如何插入变量分配行,但是您说" append "它们。如果使用Ansible的lineinfile
模块,则可以添加insertbefore
参数,以确保将这些行放置在脚本退出之前。