我正在使用 puppet 从 facter 中读取事实,并基于此将不同的配置应用于我的模块。
问题:
傀儡特工没有看到这个事实。以交互方式运行puppet agent --test
按预期工作。即使从脚本以非交互方式运行它似乎也可以正常工作。只有代理本身在搞砸。
过程:
我正在 EC2 上部署一个基于 Ubuntu 的应用程序堆栈。使用 userdata (#cloud-config),我在 /etc/environment 中设置了一个环境变量:
export FACTER_tl_role=development
然后立即在#cloud-config 中,我获取/etc/environment。只有那么我 apt-get install puppet (我不再使用 package: puppet 来消除#cloud-config 步骤序列中的歧义)
实例启动后,我确认事实可用:运行facter tl_role
返回“开发”。然后我检查 /var/log/syslog,显然 puppet 代理没有看到这个事实 - 我知道这一点是因为它无法编译目录,并且没有任何(空白)我应该看到的值变量集取决于这个事实。
但是,puppet agent --test
交互式运行可以很好地编译和运行目录。即使从#cloud-config 脚本(安装puppet 后立即)运行它也可以正常工作。
我如何让 puppet 代理了解这个事实?重新启动代理服务没有任何区别,它仍然不知道自定义事实。重新启动实例也没有任何区别。
这是一些代码:
EC2 用户数据:
#cloud-config
puppet:
conf:
agent:
server: "puppet.foo.bar"
certname: "%i.%f"
report: "true"
runcmd:
- sleep 20
- echo 'export FACTER_tl_role=development' >> /etc/environment
- . /etc/environment
- apt-get install puppet
- puppet agent --test
主要木偶清单:
# /etc/puppet/manifests/site.pp
node default {
case $tl_role {
'development': { $sitedomain = "dev.foo.bar"}
'production': { $sitedomain = "new.foo.bar"}
}
class {"code" : sitedomain => $sitedomain}
class {"apache::site" : sitedomain => $sitedomain}
class {"nodejs::grunt-daemon" : sitedomain => $sitedomain}
然后我看到 $sitedomain 应该是失败的地方,所以 $tl_role 似乎没有设置。
有任何想法吗?这让我脑洞大开……