我对使用 Chef 还很陌生,尤其是使用 vagrant,所以对于更有经验的用户来说,这很可能是一个愚蠢的问题。
我正在使用这本食谱:https : //github.com/opscode-cookbooks/application_nginx
我只想添加我自己的站点配置(vhost)。
它必须是以下之一:
选项 1 对我来说似乎不正确,我不知道如何在不必完全分开食谱的情况下完成选项 2。
任何人都可以就如何实现这一目标提出建议吗?
我试图弄清楚如何构建模板(或文件,因为它的工作方式相同)文件夹的路径,然后我可以读取它并在循环中使用模板资源,因此每个模板文件都可以触发更改通知.
我不能使用 remote_directory 因为我只想在模板更改时通知服务。
我也想避免手动模板规范,因为这些目录中可能有很多文件。另外,它允许我们只更改模板文件夹中的配置,而无需更改配方。
主要问题是那些子目录,如 default、host、host-version 和逻辑厨师通过确定正确的模板文件夹。我在想,我可以从我的自定义食谱中调用一个 Chef 类中的一个方法,以到达我的逻辑(循环)的起点。
我认为应该是这样的:
entry_point = CHEF::...getEntryPointDir
entry_point.glob..
.each do
template fname do
...
end
end
Run Code Online (Sandbox Code Playgroud)
我将不胜感激任何帮助!
我正在编写一个厨师食谱来安装 nginx 和 Phusion Passenger。简短的总结是我的运行列表中的配方没有按照我期望的顺序执行,这导致 apt 包安装以我不知道如何修复的方式失败。整个序列有点复杂,我会尽力保留基本细节。
我有自己的配方,lr-web用于将 Web 服务器自定义为我希望它处于的状态。它对nginx.conf. 我还有一个角色来协调整体配置,其运行列表是:
"run_list":[
"recipe[apt]",
"recipe[nginx]",
"recipe[passenger]",
"recipe[lr-web]"
]
Run Code Online (Sandbox Code Playgroud)
此外,lr-web配方列表passenger,并nginx在它的依赖metadata.rb。
在apt和nginx食谱是标准的Opscode公司的。但是我已经编写了自己的passenger配方,因为 OpsCode 使用 rubygems 来安装乘客,但该版本不再受支持。按照modrails.com上的建议通过 apt 安装,我的passenger食谱中有以下步骤:
cookbook_file "/etc/apt/sources.list.d/passenger.list" do
source "passenger.list"
mode 600
action :create_if_missing
end
bash "apt-get-update" do
user "root"
code <<-EOF
apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 561F9B9CAC40B2F7
apt-get install apt-transport-https ca-certificates
apt-get update
EOF
end
apt_package "nginx-extras" …Run Code Online (Sandbox Code Playgroud) 这是情况:
我有一个我一直在努力安装 monit 和安装自定义 monit 配置的方法。该配置在过去几天发生了变化。
我有一个厨师服务器和一个厨师节点。服务器具有我提到的配方的最新版本。当我运行 'sudo chef-client' 时,它似乎运行通常的语句,但是当我检查 monit 配置时,它是旧版本,而不是最新版本。
当我将 Web UI 用于我的厨师服务器时,我可以看到它具有我的食谱的最新版本。
我该如何去调试这个?
执行时:
knife bootstrap {{IP}} --ssh-user centos --ssh-password '' \
--sudo --use-sudo-password --node-name node1 \
--run-list 'recipe[learn_chef_httpd]'
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
ERROR: Net::SSH::AuthenticationFailed: Authentication failed for user centos@{{IP}}@{{IP}}
Run Code Online (Sandbox Code Playgroud)
我正在尝试连接到没有密码的 centos 用户,因为我想使用 SSH-Key Auth。
我试过传递一些排列:
knife bootstrap {{IP}} -x centos -i .chef/james-chef-validator.pem --sudo --run-list 'recipe[learn_chef_httpd]'
Run Code Online (Sandbox Code Playgroud)
都没有成功...
如果使用 -VV 运行:
...
DEBUG: allowed methods: publickey,gssapi-keyex,gssapi-with-mic
DEBUG: none failed
DEBUG: trying publickey
DEBUG: connecting to ssh-agent
ERROR: could not connect to ssh-agent
ERROR: all authorization methods failed (tried none, publickey)
ERROR: Net::SSH::AuthenticationFailed: Authentication failed for user centos@{{IP}}@{{IP}} …Run Code Online (Sandbox Code Playgroud) 我的任务是为基础架构设计和实施配置管理 (Chef),在该基础架构中,生产服务器完全分段并隔离在一个跳转盒后面。
---------------------------------
| Production | Staging, Test, Dev |
---------------------------------
Run Code Online (Sandbox Code Playgroud)
将文件投入生产的唯一方法是使用 sftp 连接。只有两个人有能力直接跳入生产。可以例外地允许严格控制的自动化系统(如 jenkins)将文件复制到生产中。
通常,我会建议在云中设置单个厨师服务器,但是生产服务器不能具有外部访问权限。(没有很多说服一些非常不情愿的人)。
我看到的一种解决方案是使用两个 Chef 服务器
---------------------------------------
| chef-production | chef-local |
| Production | Staging, Test, Dev |
---------------------------------------
Run Code Online (Sandbox Code Playgroud)
使用两个厨师服务器有一些我不知道如何克服的问题。
我愿意接受其他建议。我正在考虑不使用厨师服务器,而是使用chef-zeroor chef-solo。我的理解是,在使用多个环境时,这不是最佳解决方案。
我工作的公司正在迁移到 AWS,因此我有机会开始调查他们提供的各种服务。OpsWorks 看起来非常适合推出大规模架构更改,但是“自定义”层包括 13 个无法删除的配方。
他们似乎做各种不同的事情,包括安装驱动器 /var/www/html
有谁知道我在哪里可以找到一些关于默认 OptsWorks 脚本正在做什么的文档,更重要的是他们为什么这样做?
我显然可以通读厨师脚本,但对他们来说是新手,就像阅读胡言乱语一样。
我总是在他们曾经定期运行 Puppet 的地方工作。因此,分发更改很容易且即时。在新团队中,他们不赞成定期运行 Chef 代理。他们只用它来引导操作系统,然后杀死它。我不明白为什么有人会使用像 Chef 这样的配置管理工具而不必定期运行它。无论我们在做什么引导,都可以通过基本的 shell 脚本来完成 - 安装 xyz 软件,复制配置文件,重新启动服务。
他们说在生产中定期运行它太危险了,因为他们不确定代码是否是幂等的。
我的查询是:
我有 3 种不同的方法来安装所述软件包,我最喜欢选项 #1,但我想看看是否有理由使用选项 #2 或 3 或任何其他选项?(我对这个问题的目标是获得不同方法的反馈;如果可能,不要在编译时安装......在这种情况下)
第一。
p = package "snmp" do
package_name value_for_platform(
[ "centos", "redhat", "suse" ] => { "default" => "net-snmp" },
"default" => "snmpd"
)
action :install
end
Run Code Online (Sandbox Code Playgroud)
第二。
packages = case node[:platform]
when "centos","redhat","fedora"
%w{net-snmp}
else
%w{snmpd}
end
packages.each do |pkg|
package pkg
end
Run Code Online (Sandbox Code Playgroud)
第三。
package "snmpd" do
action :install
only_if do platform?("ubuntu", "debian") end
end
Run Code Online (Sandbox Code Playgroud) 基本上我写了几本食谱,目前它们都复制了相同的定义文件。显然,这是一个糟糕的情况,因为它使添加新说明书变得更加困难,并且更改该定义文件需要更改三个或四个其他文件以使其完全相同。
有没有办法,如果我有一个单独的食谱,目的是基本上只包含该定义,我可以将该定义文件导入到需要它的食谱中?