按照用途分类的厨师安装说明索引

希望能够提供更方便的逆向检索,针对自己编写代码时希望安装某个包或从源代码进行安装等目的。这里只讨论自己编写的情况,不涉及使用第三方的厨房手册。

我主要只使用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版本的連結。

广告
将在 10 秒后关闭
bannerAds