按照用途分类的厨师安装说明索引
希望能够提供更方便的逆向检索,针对自己编写代码时希望安装某个包或从源代码进行安装等目的。这里只讨论自己编写的情况,不涉及使用第三方的厨房手册。
我主要只使用CentOS,所以请按照这个来吧。
主要使用的资源包括package和bash等。以下是资源的手册链接:
https://docs.chef.io/chef/resources.html
http://matome.naver.jp/odai/2136687268845478601
我想用 yum 安装。
可以使用package资源。
package "ntp" do
action [ :install, :upgrade ]
end
如果想插入多个元素,可以使用Ruby的each方法。
%W{ openssl openssl-devel }.each do |pkg|
package "#{pkg}" do
action [ :install, :upgrade ]
end
end
描述Ruby的each方法时,
在%W{}中使用空格分隔的目标包。
在.each之前,将数组变量放在前面。
所以呢,即使在.each之前直接写node[‘base_setting’][‘ssl_packages’]等属性也可以调用。
然后,do和end之间是一个块,
|pkg|是一个变量,使用#{pkg}来调用和使用变量。
在上述示例中,由于在数组中指定了多个动作,如果不存在则安装,如果已经存在则升级。
以下是一篇简单易懂的介绍了Ruby方法的文章,链接如下:
http://dev.classmethod.jp/server-side/chef-vagrant-ruby/
我想要把独立的Yum存储库中的软件包分发并安装。
可以进行调整,以防止从options、base、updates、epel等渠道进入。
package "bash" do
action :upgrade
options "--disablerepo=base,updates"
end
要安装从独立仓库中定制构建的软件包时,可以按照以下方法操作。
从远程下载后,我想使用rpm来安装软件包,而不是使用yum来明确指定安装。
version = data_bag_item('pkg_versions','innotop')['version']
innotop="innotop-#{version}.noarch.rpm"
baseurl = data_bag_item('pkg_versions','innotop')['url']
remote_file "/usr/local/src/#{innotop}" do
not_if "ls /usr/local/src/#{innotop}"
source "#{baseurl}/#{innotop}"
end
package "innotop" do
action :install
source "/usr/local/src/#{innotop}"
provider Chef::Provider::Package::Rpm
not_if 'rpm -qa|grep innotop'
end
我想指定版本,可以通过选项来指定或排除存储库。
使用rpm -qi命令可以查询已安装的软件包信息。
$ rpm -qi jdk
Name : jdk Relocations: /usr/java
Version : 1.7.0_55 Vendor: Oracle Corporation
Release : fcs Build Date: 2014年03月18日 03時07分21秒
Install Date: 2014年05月02日 05時39分59秒 Build Host: sc11137388.us.oracle.com
Group : Development/Tools Source RPM: jdk-1.7.0_55-fcs.src.rpm
Size : 202038066 License: http://java.com/license
Signature : (none)
Packager : Java Software <jre-comments@java.sun.com>
URL : URL_REF
Summary : Java Platform Standard Edition Development Kit
Description :
~略~
在上述内容中,”Name”是指包名,”Version”对应于版本信息。
如果您无法尝试安装因为已经安装了该软件包,则可以输入”yum install”命令,
真正确认包和版本的方法如下,不实际安装。
# yum install openssl
===============================================================================================
パッケージ アーキテクチャ バージョン リポジトリー 容量
===============================================================================================
更新:
openssl x86_64 1.0.1e-30.el6.11 updates 1.5 M
依存性関連での更新をします。:
openssl-devel x86_64 1.0.1e-30.el6.11 updates 1.2 M
トランザクションの要約
===============================================================================================
アップグレード 2 パッケージ
総ダウンロード容量: 2.7 M
これでいいですか? [y/N]n
如果你不知道包的名称并且没有被安装在任何地方,可以尝试使用yum search openssl来搜索。
如果想知道某个已安装命令所属的包,可以使用rpm -qf /path_to_command 命令。
版本和选项的指定方式如下。
jdk_version = node['cassandra']['jdk_version']
package 'jdk' do
version "#{jdk_version}"
options "--disablerepo=epel,base,updates"
action :install
end
只需下载和授予执行权限的情况。
bash "install jq" do
not_if "ls /usr/bin/jq"
code <<-EOC
curl -o /usr/bin/jq http://stedolan.github.io/jq/download/linux64/jq
chmod +x /usr/bin/jq
EOC
end
我想从tar存档中解压并安装。
cookbook_file "/usr/local/src/#{tarfile}" do
not_if "ls /usr/local/src/#{tarfile}"
source "usr/local/src/#{tarfile}"
end
bash "tar-open" do
not_if "ls /usr/local/src/#{server}"
code <<-EOC
cd /usr/local/src
wget #{tarurl} -O #{tarfile}
tar xf #{tarfile}
EOC
end
package "MySQL-client" do
action :install
source "/usr/local/src/#{client}"
provider Chef::Provider::Package::Rpm
not_if 'rpm -qa|grep MySQL-client'
end
如果想要从不在cookbook内的其他位置获取tar归档文件,可以使用remote_file资源。
我想要执行”make install”。
如果事先没有安装开发工具(yum groupinstall ‘Development tools’),可能无法安装。
bash "bash-install-git" do
not_if "ls -d /usr/local/src/git-1.9.0"
code <<-EOC
wget https://git-core.googlecode.com/files/git-1.9.0.tar.gz -P /usr/local/src
cd /usr/local/src/
tar zxf git-1.9.0.tar.gz
cd /usr/local/src/git-1.9.0
./configure --prefix=/usr/local/git
make all
make install
ln -sf /usr/local/git/bin/git* /usr/local/bin/
EOC
end
※在bash或execute资源内调用的环境变量无法在资源内传递和继承。
需要每次都指定。(类似于局部变量而不是全局变量。)
http://qiita.com/taiaraky/items/a3f747fc6528ed6d874e
我想把宝石放进去。
或许没有必要加上”not_if”,因为它可能会花费很长时间。
passenger_version = node['apache']['passenger_version']
gem_package 'passenger' do
not_if "/usr/local/rbenv/shims/gem list|grep passenger|grep #{passenger_version}"
version "#{passenger_version}"
gem_binary '/usr/local/rbenv/shims/gem'
options "--no-rdoc --no-ri"
end
因为我在安装 Gem 时需要进行 make 等操作,所以非常耗时。最好可以将其打包成一个包。如果没有安装开发工具(yum groupinstall ‘Development tools’),我认为可能无法成功安装。
我想要从git安装。
将从Git中获取的ruby-build安装程序放置在/tmp目录中,并使用bash启动安装程序。
git "/tmp/ruby-build" do
user node['user']['name']
repository "git://github.com/sstephenson/ruby-build.git"
reference "master"
action :checkout
end
bash "install-rubybuild" do
not_if 'which ruby-build'
code <<-EOC
cd /tmp/ruby-build
./install.sh
EOC
end
我想在刚刚输入后立即读取环境变量并进行一些操作。
有关执行顺序的话题。
http://memo-off.blogspot.jp/2013/06/chefrecipe.html
最后,按照在notifies中指定的资源执行的顺序进行执行。
在Ruby的方法中,所有的操作都在编译阶段(compiling)完成,而ohai获取到的值也是一样。
因此,在converging阶段(2)不会使用中途变化的值。
因此,在某些情况下,需要重新加载ohai或在ruby_block中重新指定变量。
(如果在notifies中指定:immediately,则会立即执行converging阶段(2)的操作。)
总的来说,由于Ruby方法在应用配方之前执行,因此如果要执行基于应用配方处理结果的操作,就必须将其写在ruby_block中,这就是这个话题的要点。
ruby_block "initialize_rbenv" do
block do
ENV['RBENV_ROOT'] = node[:rbenv][:root]
ENV['PATH'] = "#{node[:rbenv][:root]}/bin:#{node[:rbenv][:root]}/shims:#{node[:ruby_build][:bin_path]}:#{ENV['PATH']}"
end
action :run
end
rbenv_ruby_version = node[:rbenv][:ruby_version]
bash "set_global_version" do
not_if "/usr/local/rbenv/shims/ruby -v|grep #{rbenv_ruby_version}"
code <<-EOC
rbenv rehash
rbenv global "#{rbenv_ruby_version}"
EOC
end
如果你想在ruby_block中调用资源,你需要定义一个方法,请参考以下链接:
http://qiita.com/sonots/items/8ac33ce011bbfb210edd
我想立即启动服务。
在目标资源中,以以下方式编写通知。
notifies :reload, "ohai[reload]", :immediately
notifies :restart, "service[rsyslog]", :immediately
如果没有指定`immediately`,默认情况下会先应用所有的配方,然后执行`notifies`中指定的操作。主要用于通过模板资源分发并重新加载配置文件,或在安装后立即启动服务等情况下调用服务资源。
在进行集群配置时,如果服务在更新时自动重新启动,导致主节点崩溃并资源转移到待机节点的情况下,最好不要使用通知功能,而应该手动进行操作。
我想要分发设置文件和软件包文件等。
如果你想要直接分发,可以使用前面提到的cookbook_file。
如果想要在文件中嵌入变量并分发,可以使用template资源。
以下是一个示例,从data_bags加载数据并将其作为变量嵌入到template资源的variables中进行替换。
slappasswd = Chef::EncryptedDataBagItem.load("ldap","slappasswd")
ldappw2 = slappasswd["bindpw"]
template '/etc/phpldapadmin/config.php' do
source 'config.php.erb'
owner 'root'
group 'apache'
mode 0640
variables ({
:bindpw => ldappw2
})
end
顺便提一下,如果在配方中变量需要被替换,你可以在指定的源文件中使用@符号嵌入变量,像下面这样:
$servers->setValue(‘login’,’bind_pass’,'<%= @bindpw %>’);
如果要从某个属性进行更换的话,可以在<%= %>内嵌入属性,如下所示:
<%= node[‘ldap’][‘basedndc1’] %>
・其中包括使用attribute的差异以及从何处获取数据的讨论
在该代码库中,建议使用data_bags来管理共享的唯一数据和加密数据,例如用户数据或证书。
对于每个环境特定的变量,可以使用environments,对于不同角色(如web或db)的变量,可以使用roles,
对于每个节点特定的变量,可以使用nodes进行管理。如果存在默认值,并且是多个环境或角色共享的非特定参数,
可以将其写入cookbooks/attributes/default.rb中,即使它们包含在了cookbook中也没有问题。
所有这些都可以使用json来编写。jsonlint在检查json数据的语法时非常有用。
此外,还可以通过chef附带的ohai机制嵌入主机数据,例如主机名、IP、CPU核心数、内存容量等。
如果想要调用ohai的数据,只需要在template文件中写入<%= node[‘ipaddress’] %>就可以了,不需要在recipe或其他attribute写任何东西。
如果要在“cookbook”中的“attributes/default.rb”文件中编写的话,
可以写成 default[‘apache’][‘version’] = ‘2.xxx’。
如果您想要将其以本地的中文重新表达就可以写成:如果要在“cookbook”内部的“attributes/default.rb”文件中进行编写的话,可以将其写为 default[‘apache’][‘version’] = ‘2.xxx’。
数组也可以。
default['fluentd']['plugins'] = %w(
fluent-plugin-file-alternative
fluent-plugin-forest
fluent-plugin-rewrite-tag-filter
fluent-plugin-tail-ex
fluent-mixin-config-placeholders
fluent-plugin-parser
fluent-plugin-record-reformer
fluent-plugin-statsd
fluent-plugin-datacounter
fluent-plugin-mackerel
statsd-ruby
jsonpath
)
在environments、roles和nodes下面放置JSON,就像下面这样的感觉。有”default_attributes”和”override_attributes”,它们有优先级,并且相同的值如果是数组会被合并到同一个位置。
参考链接:http://dev.classmethod.jp/server-side/chef/attribute-overrides-pattern/
"base_setting": {
"swappiness": "30",
"tcp_tw_reuse": "0",
"tcp_tw_recycle": "0",
"tcp_fin_timeout": "10",
"tcp_max_syn_backlog": "8192",
"somaxconn": "8192",
"ntp_role": "server",
"logrotate_types": ["ldap"],
"rsyslog_type": "ldap"
},
在配列中,用方括号 [] 括起来,并用逗号进行分隔。
"nic_devices":[
"eth0","eth1"
],
data_bags只能创建一个目录,所以要注意。
目录像是一个袋子或容器。
想要加密的数据之类的东西可以放在这里。详细内容请看以下的URL。
http://devlab.isao.co.jp/data_bags_exsample/
http://qiita.com/smallpalace/items/2ada68c2dbbc9065dcc1
暫時到這裡結束。以下是Ansible版本的連結。