我正在创建一个虚拟机来模仿我们的生产Web服务器,以便我可以与新的开发人员共享它,以便尽快加快速度.我已经浏览过Vagrant文档但是我不明白使用通用基本框和使用Puppet配置所有内容的优势,而不是打包已经安装和配置的所有内容的自定义框.我能想到的只是;
使用Puppet与自定义打包盒的优点
使用Puppet与自定义打包盒的缺点
我觉得我必须错过一些重要的细节,你能想到更多吗?
目录和文件布局如下:
app_test/
app_test/manifests
app_test/manifests/init.pp
app_test/manifests/test.pp
Run Code Online (Sandbox Code Playgroud)
内容init.pp:
class app_test {
include app_test::test
}
Run Code Online (Sandbox Code Playgroud)
内容test.pp:
class app_test::test {
exec { 'hello world':
command => "/bin/echo Hello World >> /tmp/are-you-there.txt"
}
}
Run Code Online (Sandbox Code Playgroud)
Puppet v2.7.11已安装.
$ puppet apply init.pp
notice: Finished catalog run in 0.01 seconds
Run Code Online (Sandbox Code Playgroud)
有人可以说明为什么这不会生成文件/tmp/are-you-there-txt?
我正在尝试找出用puppet设置一些环境变量的最佳方法.
我可以使用exec而且只是这样做export VAR=blah.但是,这只会持续到本届会议.我还想过将它添加到文件的末尾,比如bashrc.然而,我不认为有一种可靠的方法可以检查它是否已经准备就绪; 所以它最终会在每一次傀儡中加入.
Puppet 2.7.19
Vagrant version 1.0.6
VM OS Ubuntu 12.04
Run Code Online (Sandbox Code Playgroud)
我试图从vagrant设置puppet模块路径.这看起来应该很简单.
在我的Vagrant文件中,我有:
Vagrant::Config.run do |config|
config.vm.provision :puppet, :module_path => "my_modules"
config.vm.provision :puppet, :options => ["--modulepath", "my_modules"]
end
Run Code Online (Sandbox Code Playgroud)
当我更改模块路径的值时,似乎没有效果(之后vagrant reload)
这是一个来自的小贴士 vagrant up
[default] -- v-root: /vagrant
[default] -- manifests: /tmp/vagrant-puppet/manifests
[default] -- v-pp-m0: /tmp/vagrant-puppet/modules-0
Run Code Online (Sandbox Code Playgroud)
请注意/tmp/vagrant-puppet/modules-0?这是关于什么的?
然后从流浪者里面:
vagrant@precise64:~$ puppet apply --configprint modulepath
/home/vagrant/.puppet/modules:/usr/share/puppet/modules
Run Code Online (Sandbox Code Playgroud)
所以当我这样做时: puppet module install puppetlabs/mysql
我收到此错误:
Preparing to install into /home/vagrant/.puppet/modules ...
Error: Could not install module 'puppetlabs-mysql' (latest)
Directory /home/vagrant/.puppet/modules does not exist
Run Code Online (Sandbox Code Playgroud)
所以我必须要: …
我已经研究了如何点燃一个流浪盒和apt-get install包装
我现在想要git clone在运行npm install和运行应用程序之前从github获取node.js reponode app.js
我希望能够通过发布BASH命令来实现这一目标,但我现在看到傀儡要求以傀儡的方式完成.谷歌在这个问题上的结果令人困惑和不一致.
那你如何告诉Puppet git clone从github获取node.js包然后安装呢npm install?
该Gemfile 指定
gem "puppet", :path => File.dirname(__FILE__), :require => false
Run Code Online (Sandbox Code Playgroud)
但是我安装的其中一颗宝石毕竟$GEM_HOME出现了$:.
$ bundle exec ruby -e 'puts $:'
...
/home/puppy/puppet-git-clone/lib
...
/usr/lib/ruby/vendor_ruby
...
/home/puppy/gems/gems/puppet-3.7.5/lib
...
Run Code Online (Sandbox Code Playgroud)
这本身并不是问题,但显然Ruby会加载Puppet 3.7.5而不是3.7.3我检出的git repo.
$ bundle exec irb
irb(main):001:0> require 'puppet'
=> true
irb(main):002:0> Facter.value(:puppetversion)
=> "3.7.5"
Run Code Online (Sandbox Code Playgroud)
为什么Puppet没有从git树加载,我该如何进一步调试呢?
木偶.gemspec可能会参与其中.它在指定版本方面很聪明.我现在担心Rubygems实际上会加载已安装的3.7.5gem,以便Puppet.version真实地报告错误的值,抛弃bundler.这可能是发生了什么?
正如评论中所建议的那样,我尝试静态设置路径和版本Gemfile.
gem "puppet", "3.4.2", :path => "/home/puppy/puppet-git-clone", :require => false
Run Code Online (Sandbox Code Playgroud)
至于结果,至少bundler …
我正在尝试使用EC2实例在AWS中构建一个木偶管理基础架构(非企业).使用puppetlabs-aws模块我可以通过方便的方式创建机器.接下来是在每个节点上进行本地设置,最重要的是设置唯一的主机名.我怎样才能做到这一点?
我知道的一种方法是通过user_data参数提供脚本.这将是很好的,但为了可用,我需要能够参数化该脚本,以避免为每个代理重复一次脚本.
是否有意义?我真的很感激一种实现这一目标的便捷方式,因为我想以编程方式启动新实例.任何建议都将被考虑.
举一个我的问题的例子,考虑我的配置木偶清单的这个片段:
ec2_instance { 'backend':
ensure => present,
name => 'backend',
region => 'us-west-2',
image_id => 'ami-f0091d91',
instance_type => 't2.micro',
key_name => 'mykey',
security_groups => ['provision-sg'],
user_data => template('configure.erb'),
}
ec2_instance { 'webfront':
ensure => present,
name => 'webfront',
region => 'us-west-2',
image_id => 'ami-f0091d91',
instance_type => 't2.micro',
key_name => 'mykey',
security_groups => ['provision-sg'],
user_data => template('configure.erb'),
}
Run Code Online (Sandbox Code Playgroud)
这将确保两个实例启动并运行.请注意user_data => template('configure.erb')引用模板脚本,该脚本在创建后在实例上执行.如果我只知道决定依据的数据,我可以在这里设置主机名(或我想要的任何东西).我可以在实例描述中添加标签,但configure.erb据我所知,从脚本中无法读取.
无论如何,设置主机名只是我解决根本问题的想法.可能还有其他更方便的方法.我想要的只是让这两个实例代表木偶大师的不同节点类型的方法.
我在用木偶编码地狱的文件.即使是最简单的尝试也行不通:
hiera-data/test.yaml:
---
test: Äñö
init.pp:
$test = hiera('test')
file { "/root/encoding.txt":
ensure => file,
content => $test
}
Run Code Online (Sandbox Code Playgroud)
在puppet服务器上一切都很好看:
puppet:~ # file -i /etc/puppetlabs/puppet/hiera-data/env/test.yaml
/etc/puppetlabs/puppet/hiera-data/env/test.yaml: text/plain charset=utf-8
puppet:~ # cat /etc/puppetlabs/puppet/hiera-data/env/test.yaml
---
test: Äñö
puppet:~ # locale
LANG=POSIX
LC_CTYPE=en_US.UTF-8
Run Code Online (Sandbox Code Playgroud)
在傀儡代理人:
puppet-test:~ # locale
LANG=POSIX
LC_CTYPE=en_US.UTF-8
Run Code Online (Sandbox Code Playgroud)
跑完后:
puppet-test:~ # file -i encoding.txt
encoding.txt: text/plain charset=utf-8
Run Code Online (Sandbox Code Playgroud)
但:
更新:这里是约翰评论中提到的HEX数据(查看时vi :%!xxd):
0000000: efbf bdef bfbd efbf bdef bfbd efbf bdef ................
0000010: bfbd 0a ...
Run Code Online (Sandbox Code Playgroud)
更新:正如彼得的评论中所述,直接运行hiera并未提供任何进一步的见解.特别是,我只能在服务器上试用它,因为代理没有源.

我的环境已经过时,但我不允许使用任何更新的版本(至少还没有,没有任何好的理由):
我的任务是在多台Windows机器上建立基于Java的开发环境.问题是我希望在每台机器上自动轻松地完成这个过程,这样开发人员就不必浪费时间下载和安装所有不同的应用程序.理想情况下,我希望有以下内容:
我已经研究了几种工具.目前最有前途的似乎是Puppet.但是,Puppet在Windows中不能正常工作......使用VM映像可以解决第一个要求,但由于硬件在整个机器上不同并且升级不容易,因此它是不可能的.
有没有人有过这种任务的经验?你会如何解决它?
我有一个要求,我想在几个虚拟机上配置Java应用程序所需的机器特定SSL证书(使用机器的IP /主机名生成).
我可以提前创建这些证书,如QA-Machine01,Prod-Machine01等名称,并可以将它们保存在某个文件夹中.
如何让Vagrant动态选择这些证书,获取它的名称(QA-Machine01,Prod-Machine01)并使用证书名称为机器名配置VM?
puppet ×10
vagrant ×4
ruby ×3
amazon-ec2 ×1
apply ×1
bundler ×1
chef-infra ×1
deployment ×1
encoding ×1
environment ×1
gem ×1
git ×1
java ×1
manifest ×1
node.js ×1
npm ×1
provisioning ×1
rubygems ×1
ubuntu-12.04 ×1