Puppet代理守护程序没有读取事实(EC2,cloud-init)

TL-*_*ene 0 environment-variables puppet amazon-ec2 cloud-init facter

我正在使用puppet从facter中读取一个事实,并基于此我将不同的配置应用于我的模块.

问题:

傀儡代理人没有看到这个事实.以puppet agent --test交互方式运行按预期工作.即使从脚本非交互式运行它似乎工作正常.只有代理商本身搞砸了.

处理:

我正在EC2上部署基于Ubuntu的应用程序堆栈.使用userdata(#cloud-config),我在/ etc/environment中设置了一个环境变量:

export FACTER_tl_role=development
Run Code Online (Sandbox Code Playgroud)

然后立即在#cloud-config,i source/etc/environment中.只有那时我才得到安装木偶(我放弃了使用包:木偶来消除#cloud-config步骤序列中的歧义)

一旦实例启动,我确认事实是可用的:运行facter tl_role返回"开发".然后检查/ var/log/syslog,显然木偶代理没有看到这个事实 - 我知道这是因为它无法编译目录,并且没有什么(空白)我应该看到它的价值变量集取决于这个事实.

但是,以puppet agent --test交互方式运行编译并运行目录就好了.甚至从#cloud-config脚本(安装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
Run Code Online (Sandbox Code Playgroud)

主要木偶清单:

# /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}
Run Code Online (Sandbox Code Playgroud)

然后我看到$ sitedomain应该是的失败,所以$ tl_role似乎没有设置.

有任何想法吗?这让我大脑爆炸了......

小智 5

另一个简单的选择是将事实放入外部事实中.

将文件放入/etc/facter/facts.d/*非常简单,您可以使用文本文件,yaml json或可执行文件来执行此操作.

http://docs.puppetlabs.com/guides/custom_facts.html#external-facts

*那是在开源木偶上,在unix-y机器上.请参阅完整文档的链接.