Ansible + TestKitchen(Serverspec)用于Docker的初级使用者

Ansible与TestKitchen用于基于Docker的公司内部实践。

目标:面向初次使用Ansible的人。

本次,在公司内部进行了使用Ansible + TestKitchen进行基础设施测试驱动开发的实操课程。现将该内容公开发布。

手把手编码实践
简要说明文档

Ansible是什么意思?


这是一个与Chef/Puppet/Itamae等各种配置管理工具齐名的不需要代理,方便使用的工具。

TestKitchen是什么?


这是一个工具,主要用于检查配置的供应和配置管理是否正确地实施到测试环境中。它可以与各种供应商进行协作,以适用于配置管理目标,如vagrant / docker,因此我们选择使用它。

这次的实践中做的事情。

使用Ansible和Testkitchen来进行基础架构的代码化和TDD实践。测试执行环境在Docker中进行,而生产环境则在预先在OpenStack上创建的Ubuntu 14.04服务器上执行。

安锁 + 测试厨房(基础设施TDD目标)

インフラTDDゴール

Mac 环境搭建需要事先准备。

$ bundler -v
Bundler version 1.12.5
$ ruby -v
ruby 2.1.5
$ docker -v
Docker version 1.12.0-rc2
または
Docker version 1.11.2

建议您在继续之前先安装以下内容以确保能在 ruby 2.1.1 及以上版本上进行操作(Mac)
※由于 gem 的关系,ansible_playbook 在 provisioner 中可能无法识别的问题存在。

$ brew update
$ brew install rbenv ruby-build
$ brew update
$ brew install rbenv ruby-build (もしくは、brew update rbenv ruby-build)

$ rbenv install 2.1.5
$ rbenv global 2.1.5
$ rbenv rehash

# PATH に追加
$ echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile

# .bash_profile に追加
$ echo 'eval "$(rbenv init -)"' >> ~/.bash_profile

# 上記設定の再読み込み
$ exec $SHELL -l

$ ruby -v
ruby 2.1.5p273 (2014-11-13 revision 48405) [x86_64-darwin14.0]

$ rbenv exec gem install bundler
Bundler version 1.12.5

安装Docker

$ brew cask install virtualbox
$ brew install docker
$ brew install docker-machine
$ docker -v
Docker version 1.11.2, build b9f10c9

# 初期設定
$ docker-machine create -d virtualbox ansible-hands-on
$ eval $(docker-machine env ansible-hands-on)
# VPNソフトを起動しているとエラーが出る場合があるよ!FAQ参照

安装ansible!

$ brew install ansible
$ git clone https://github.com/vSakumoto/ansible_hands_on.git ~/ansible
$ cd ~/ansible
$ bundle install

进行实践操作的流程

在我们公司中,我们按照以下步骤来执行。

1. 概要資料の説明
2. gitからcloneしていただいたplaybookを実行して、DockerでのTDD及びstaging環境へのプロビジョニング実施
3. git clone ファイルを編集し、実際にtasksを書き換え パッケージの追加・テスト及びstaging環境へのプロビジョニングを実施する

作为“虎的捲”,以下进行展开。

ansible任务主要.yml

--- #<- マジックメソッド!! 記述の際には必ず記述する
- name: HOGEHOGE INSTALL #<-- 1タスクを記述するディレクティブ設定
  apt: pkg=nginx state=present update_cache=yes #<-- apt-get install -y nginx を実施
  sudo: yes # sudoをつけて実行するかを選択記載なければssh接続設定となっているユーザーで実行
  tags: nginx # ansbile-playbook -i hoge -t nginxとすることで対象のタグのみを実行させることが可能 別用途としてはprd | stgなど切って本番|stgのプロビジョニングを変更するなど
  when: ansible_os_family == 'Ubuntu' # Ubuntu のみの場合に実施

- name: HOGEHOGE INSTALL
  yum: pkg=nginx state=present update_cache=yes
  sudo: yes
  when: ansible_os_family == 'RedHat' # RedHat系(CentOS)
  tags: nginx

# リポジトリ追加
- name: add php repo
  apt_repository: repo="ppa:ondrej/php5-5.6"
  tags: repo
  when: ansible_os_family == 'Ubuntu'
  sudo: yes

- name: Add repository
  yum_repository:
    name: epel
    description: EPEL YUM repo
    baseurl: http://download.fedoraproject.org/pub/epel/$releasever/$basearch/
   when: ansible_os_family == 'RedHat'

# ファイルコピー
- name: Upload Test File
  copy: src="bash_profile" dest="/home/vSakumoto/.bash_profile" owner=vSakumoto group=vSakumoto mode=0644
  tags: home_set
  sudo: yes

# ディレクトリ作成
- name: private directory
  file: path="/home/vSakumoto/foo" state=directory owner=vSakumoto group=vSakumoto mode=0700
  tags: home_set
  sudo: yes

serverspec规范

require 'spec_helper'

describe package('nginx'), :if => os[:family] == 'ubuntu' do # os[:family]の環境変数からubuntu判定をし実行
  it { should be_installed } # package nginxがインストールされているか
end 

describe service('nginx'), :if => os[:family] == 'ubuntu' do
  it { should be_enabled } # 自動起動がONになっているか
  it { should be_running } # nginxが動作しているか
end

describe port(80) do
  it { should be_listening } # 指定ポートが空いているかどうか
end

# kitchen groupがあるか
describe group('kitchen') do
  it { should exist }
end

# kitchen userがいるか
describe user('kitchen') do
  it { should belong_to_group 'kitchen' }
end

# 配列でチェック
%w{vSakumoto xshsaku kitchen}.each do |users|
  describe user(users) do
    it { should belong_to_group users }
  end
end

# ファイル有無
describe file('/home/vSakumoto/.bash_profile') do
  it { should be_file }
end

# ディレクトリ有無
describe file("/home/vSakumoto/public_html") do
  it { should be_directory }
end

我们大约花了2个小时的实践时间,顺利完成了。

通过亲身实践……

可能是一个很好的机会,不仅对基础设施工人,而且对程序员,可以通过代码来传达能够“管理和构建”基础设施的好处。

参考网站:总结使用Serverspec常见测试的方法。

使用test-kitchen、Serverspec和docker来执行Ansible测试。

广告
将在 10 秒后关闭
bannerAds