1

我使用 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 脚本,在 Ansible 完成后运行:

$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,但结果相同。

你知道如何进行吗?

4

1 回答 1

1

仅仅包含变量赋值是不够/etc/bash.bashrc的。source $HOME/.bashrc变量赋值实际上必须有机会被执行。

如果您查看这两个脚本的源代码(下面来自 Debian 的示例),它们包含在非交互式 shell 中调用时会中断执行的行:

  • /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"在这些条件之后,它们将永远不会被执行,因为配置脚本作为非交互式 shell 运行。

您实际上并没有展示如何插入变量赋值行,但您说您“附加”它们。如果您使用 Ansible 的lineinfile模块,您可以添加insertbefore参数以确保在脚本退出之前放置这些行。

于 2016-12-26T21:38:41.417 回答