Amazon ec2 傀儡代理守护程序未读取事实(EC2,cloud init)

Amazon ec2 傀儡代理守护程序未读取事实(EC2,cloud init),amazon-ec2,environment-variables,puppet,cloud-init,facter,Amazon Ec2,Environment Variables,Puppet,Cloud Init,Facter,我使用puppet从facter读取一个事实,并在此基础上对我的模块应用不同的配置 问题: 傀儡特工没有看到这个事实。运行puppet代理--test可以按预期交互工作。即使从脚本以非交互方式运行它似乎也可以正常工作。只有特工自己搞砸了 过程: 我正在EC2上部署一个基于Ubuntu的应用程序堆栈。使用userdata(#cloud config),我在/etc/environment中设置了一个环境变量: export FACTER_tl_role=development 然后立即在#clo

我使用puppet从facter读取一个事实,并在此基础上对我的模块应用不同的配置

问题: 傀儡特工没有看到这个事实。运行
puppet代理--test
可以按预期交互工作。即使从脚本以非交互方式运行它似乎也可以正常工作。只有特工自己搞砸了

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

export FACTER_tl_role=development
然后立即在#cloud config中,i source/etc/environment。 只有这样,我才开始安装puppet(我不再使用package:puppet来消除#cloud-config步骤序列中的歧义)

一旦实例启动,我确认事实是可用的:运行
facter tlu role
返回“development”。然后我检查/var/log/syslog,显然puppet代理没有看到这一事实——我知道这一点,因为它无法编译目录,并且根据这一事实,我没有看到变量集的值(空白)

但是,运行
puppet代理--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
主要木偶舱单:

# /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_角色似乎没有设置


有什么想法吗?这让我的大脑爆炸了….

我不认为
/etc/environment
将以cloud init执行
runcmd
的方式正常工作。两种可能的解决办法:

  • 使用puppet agent命令导出变量:

    export FACTER\u tl\u role=开发和傀儡代理--测试

如果这不起作用:

  • 只需将命令放到用户数据脚本中,并将它们连接为“多部分输入”(如中所述)

第二种解决方案将命令作为适当的shell脚本执行,并可能解决该问题。不过,如果第一种方法有效,那么你就可以更轻松地使用现有的工具。

谢谢你,@christopher。这可能是一个很好的解决方案,我将对它进行测试,并可能从我目前可怕的黑客攻击中转移到它。 我在Puppet Users Google小组中得到的答案是,我不应该假定Puppet代理进程将有一个登录shell的环境,Facter在由Puppet代理运行时也会有这个环境

以下是我解决问题的方法(无可否认,是用暴力):


如您所见,在安装Puppet之后,我停止代理,并将一行添加到/etc/init.d/Puppet到source/etc/environment。然后我启动代理。不理想。。。但它是有效的

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

将文件放到/etc/facter/facts.d/*中相当容易,您可以使用文本文件、yaml json或可执行文件来完成


*这是在开源puppet上,在unix-y机器上。查看完整文档的链接。

感谢分享您的解决方案——这使我避免了大量的修补工作。:-)这是一个比我3月份的原始解决方案更好的解决方案——现在Facter支持简单地添加外部事实。我把你的答案设置为正确的。
runcmd:
- echo 'export FACTER_tl_role=development' >> /etc/environment
- . /etc/environment
- apt-get install puppet
- service puppet stop
- sed -i '/init-functions/a\. \/etc\/environment' /etc/init.d/puppet
- puppet agent --test
- service puppet start