试着使用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
广告
将在 10 秒后关闭
bannerAds