试着使用itamae来构建开发环境
首先
新成员加入团队时,我认为首先要做的是搭建开发环境。刚开始产品的代码量并不多,使用的中间件也较少,因此环境搭建并不是很困难。但随着时间的推移,代码量增加,使用的中间件也变得更多,这样搭建新环境就变得更加困难。
在这种情况下,我认为Chef、Ansible以及今天介绍的itamae会很有帮助。
我也曾经使用过Chef(确切地说是Chef Solo)。但是Chef Solo停止了,要转用Chef Zero。所以我尝试使用Chef Zero,但是转换过程相当困难,于是我决定在这个机会上考虑使用其他工具,最终决定使用itamae。
从以下几个方面来看,理由如下:
* 可用于搭建服务器
* 需要记忆的内容较少
* 可使用ssh(与Chef有很大区别)
我打算在这篇文章中介绍使用itamae进行环境配置的例子。
环境
-
- ruby2.2
-
- github
-
- elasticsearch2
-
- redis
-
- java 1.8
-
- itamae 1.9
- vagrant
食谱
这次要做的事情是进行以下项目:
1.安装ruby、java
2.安装elasticsearch、redis等中间件
3.从github获取目标代码库
食谱的组成
由于之前举办了itamae meet up,那时我们也谈到了文件夹的结构。本次我们没有及时改变为当时介绍的那种结构,可能会有一点点的不满意,但希望您能理解。简单来说,我们将文件夹分为以下几个部分。
- recipes
- elasticsearch
- redis
app.rb
- nodes
- templates
节点配置
节点的配置可以用 YAML 格式编写,但是本次将采用 JSON 格式编写。
{
"rbenv": {
"user": "vagrant",
"versions": ["2.2.1", "2.2.2"],
"global": "2.2.2",
"gems": ["bundler", "rails"]
},
"elasticsearch": {
"cluster_name": "nakamura-elasticsearch",
"version": "2.1.0",
"index_shards_num": "5",
"index_replicas_num": "1"
},
"redis": {
"version": "3.0.4"
},
"git": {
"git_user": "#{ENV['git_user']}",
"git_password": "#{ENV['git_password']}",
"repository": "hoge/fuga_repo",
"app_path": "rails_app"
}
}
安装Ruby和Java
这次安装Ruby将使用已经公开的插件。至于Java,则决定使用提供的软件包。由于以后还会使用到Git等其他工具,所以在这里一并安装了。
gem 'itamae-plugin-recipe-rbenv'
%w( yum wget java-1.8.0-openjdk git ).each do |pkg|
package pkg do
action :install
end
end
# rubyをinstall
include_recipe "rbenv::user"
安装elasticsearch、redis等中间件。
接下来,我们将安装中间件。
mysql、elasticsearch和redis的配置将写在不同的文件中,并在cookbooks/app.rb文件中通过include_recipe引入它们。
elasticsearch的配置如下所示。
if /\A1.*/ =~ node[:elasticsearch][:version]
include_recipe 'version/1_x.rb'
else
include_recipe 'version/2_x.rb'
end
我按照版本将食谱分开。
%w( yum java-1.8.0-openjdk wget ).each do |pkg|
package pkg do
action :install
end
end
execute 'rm elasticsearch.tar.gz' do
only_if "test -e ~/elaticsearch.tar.gz"
end
execute 'elasticsearch file get' do
command "wget https://download.elastic.co/elasticsearch/elasticsearch/elasticsearch-#{node[:elasticsearch][:version]}.tar.gz -O elasticsearch.tar.gz"
end
execute 'file unzip' do
command 'tar -zxf elasticsearch.tar.gz'
end
execute 'sudo rm -R /usr/local/share/elasticsearch' do
only_if 'ls /usr/local/share/elasticsearch'
end
execute 'sudo mv elasticsearch-* /usr/local/share/elasticsearch' do
not_if 'ls /usr/local/share/elasticsearch'
end
execute 'sudo chmod -R 755 /usr/local/share/elasticsearch' do
only_if 'ls /usr/local/share/elasticsearch'
end
execute 'mkdir /usr/local/share/elasticsearch/plugins' do
not_if 'ls /usr/local/share/elasticsearch/plugins'
end
# elasticsearch.ymlをコピー
template "/usr/local/share/elasticsearch/config/elasticsearch.yml" do
path "/usr/local/share/elasticsearch/config/elasticsearch.yml"
source "../../../templates/elasticsearch/config/elasticsearch_yml.erb"
variables({cluster_name: 'nakamura-elasticsearch', index_shards_num: "5", index_replicas_num: "1"})
end
# プラグイン
execute 'bin/plugin --remove mobz/elasticsearch-head' do
only_if 'cd /usr/local/share/elasticsearch/plugins/head'
cwd '/usr/local/share/elasticsearch'
end
execute 'bin/plugin -install mobz/elasticsearch-head' do
cwd '/usr/local/share/elasticsearch'
end
execute 'bin/plugin --remove elasticsearch/marvel/latest' do
only_if 'cd /usr/local/share/elasticsearch/plugins/mavel'
cwd '/usr/local/share/elasticsearch'
end
execute 'bin/plugin -install elasticsearch/marvel/latest' do
cwd '/usr/local/share/elasticsearch'
end
execute "bin/plugin --remove elasticsearch/elasticsearch-analysis-kuromoji/#{node['elasticsearch']['plugin']['kuromoji']['version']}" do
only_if 'cd /usr/local/share/elasticsearch/plugins/analysis-kuromoji'
cwd '/usr/local/share/elasticsearch'
end
execute "bin/plugin -install elasticsearch/elasticsearch-analysis-kuromoji/#{node['elasticsearch']['plugin']['kuromoji']['version']}" do
cwd '/usr/local/share/elasticsearch'
end
如果使用Version 2的情况下
%w( yum java-1.8.0-openjdk wget ).each do |pkg|
package pkg do
action :install
end
end
execute 'rm elasticsearch.tar.gz' do
only_if "test -e ~/elaticsearch.tar.gz"
end
execute 'elasticsearch file get' do
command "wget https://download.elasticsearch.org/elasticsearch/release/org/elasticsearch/distribution/tar/elasticsearch/#{node[:elasticsearch][:version]}/elasticsearch-#{node[:elasticsearch][:version]}.tar.gz -O elasticsearch.tar.gz"
end
execute 'file unzip' do
command 'tar -zxf elasticsearch.tar.gz'
end
execute 'sudo rm -R /usr/local/share/elasticsearch' do
only_if 'ls /usr/local/share/elasticsearch'
end
execute 'sudo mv elasticsearch-* /usr/local/share/elasticsearch' do
not_if 'ls /usr/local/share/elasticsearch'
end
execute 'sudo chmod -R 755 /usr/local/share/elasticsearch' do
only_if 'ls /usr/local/share/elasticsearch'
end
execute 'mkdir /usr/local/share/elasticsearch/plugins' do
not_if 'ls /usr/local/share/elasticsearch/plugins'
end
# プラグイン
## HEAD
execute 'bin/plugin remove mobz/elasticsearch-head' do
only_if 'cd /usr/local/share/elasticsearch/plugins/head'
cwd '/usr/local/share/elasticsearch'
end
execute 'bin/plugin install mobz/elasticsearch-head' do
cwd '/usr/local/share/elasticsearch'
end
## kuromoji
execute "bin/plugin remove analysis-kuromoji" do
only_if 'cd /usr/local/share/elasticsearch/plugins/analysis-kuromoji'
cwd '/usr/local/share/elasticsearch'
end
execute "bin/plugin install analysis-kuromoji" do
cwd '/usr/local/share/elasticsearch'
end
# elasticsearch.yml
template "/usr/local/share/elasticsearch/config/elasticsearch.yml" do
path "/usr/local/share/elasticsearch/config/elasticsearch.yml"
source "../../../templates/elasticsearch/config/elasticsearch2_yml.erb"
variables({cluster_name: 'nakamura-elasticsearch', index_shards_num: "5", index_replicas_num: "1"})
end
execute "bin/elasticsearch -d" do
cwd '/usr/local/share/elasticsearch'
end
由于Elasticsearch在版本1.x和2.x之间有所变化,因此此次的教程也将分开编写。使用哪个版本将根据节点中的值进行更改。
接下来是Redis。
%w( yum wget ).each do |pkg|
package pkg do
action :install
end
end
execute "rm redis-#{node['redis']['version']}.tar.gz" do
only_if "test -e redis-#{node['redis']['version']}.tar.gz"
end
execute 'redis file get' do
command "wget http://download.redis.io/releases/redis-#{node['redis']['version']}.tar.gz"
end
execute 'unzip' do
command "tar -zxf redis-#{node['redis']['version']}.tar.gz"
end
execute 'make' do
cwd "redis-#{node['redis']['version']}"
end
如果有有效的插件,我打算转到那个插件上。相比Chef,itamae的插件还不够充足。虽然有点费力,但就暂且先这样吧。
从GitHub获取目标存储库
接下来,从GitHub获得的食谱如下所示。
# アプリケーションの配置場所を作成
directory "#{node[:git][:app_path]}" do
mode "755"
end
git "#{node[:git][:app_path]}" do
repository "https://#{node[:git][:git_user]}:#{node[:git][:git_password]}@github.com/#{node[:git][:repository]}.git"
end
如果是在本地执行的话,可以按照以下方式进行。
bundle exec itamae local -j [nodeファイルを指定] -h [ホストを指定] [レシピファイルを指定]
如果通过SSH连接构建到其他机器的情况下
bundle exec itamae ssh -j [nodeファイルを指定] -h [ホストを指定] [レシピファイルを指定]
如果使用Vagrant在虚拟机上进行构建的情况下
bundle exec itamae ssh -j [nodeファイルを指定] -h [ホストを指定] --vagrant [レシピファイルを指定]
我已经尝试使用itamae对所需的中间件进行自动化安装。只要itamae能够正常运行,环境配置就会变得轻松!
补充
在最近的Itamae Meetup1上进行了一个分享,关于如何共享在执行食谱时想要知道”在哪里花了多少时间”的问题。如果使用的Itamae是最新版本的话,可以在执行时使用”–profile profile.json”和”profile”选项来输出以json格式呈现的性能分析结果。如果发现执行过程太慢,想知道原因的话,尝试一下这个选项是个不错的主意。
如果想要针对多台机器按照它们的角色应用不同的配方的话。
使用 rundock 这个 gem,可以很轻松地完成这个任务。您可以将要应用于哪台机器的哪些设置记录在一个 yml 格式的文件中,并在执行时指定该文件,以便为每台机器添加所需的配置。您可以按角色编写食谱,并在 rundock 中指定它们。
安装rundock
在Gemfile中加入并通过bundle install进行安装。
# rundocによる複数ホストの実行
gem 'rundock'
gem 'rundock-plugin-operation-itamae'
运行船坞.yml
以下是 rundock 配置的例子。在 dev-el2 和 dev-el4 两个虚拟机上创建了两个本地环境,分别使用 itamae 的配方指定安装中间件。通过这种方式,可以为每个环境创建 yaml 文件,并在其中指定所需的配方,这样就可以清楚地了解每个环境中有哪些版本的内容。
- target: dev-el2
itamae:
- cookbooks/redis_elasticsearch.rb
- node_json: nodes/redis_elasticsearch.json
- log_level: info
- sudo: true
- target: dev-el4
itamae:
- recipes/redis/redis.rb
- node_json: nodes/redis.json
- log_level: info
- sudo: true
---
dev-el2:
host: 127.0.0.1
ssh_opts:
port: 2200
user: vagrant
key: /usr/local/project/itamae_recipe/.vagrant/machines/el4/virtualbox/private_key
dev-el4:
host: 127.0.0.1
ssh_opts:
port: 2222
user: vagrant
key: /usr/local/project/itamae_recipe/.vagrant/machines/el2/virtualbox/private_key
---
我认为仍然有许多需要重新检查的方面,比如食谱的编写方式和文件夹结构等等,但如果能对其他人有所帮助,我将感到幸运。
请参阅
- itamae meetup