PR TIMESデザイナー&エンジニアブログ BREAK TIMES

PR TIMES Developer Blog(デザイナー&エンジニアによる開発者ブログ)

PR TIMES Developer Blog

当ブログは下記URLに移転しました。
https://developers.prtimes.jp/

開発環境構築にansibleを使用する

こんにちは、エンジニアのアカイです。

vmやコンテナを複数作成する場合、各環境に様々なものをインストールすることになりますが、同じようなコマンドをそれぞれに対して実行するのも面倒なので、いわゆる構成管理ツールを使用するのはもはや常識になっている感があります。

これをもう少し噛み砕いて言うと、
よくブログ記事などで「~のインストール手順」等として紹介されている内容を、
自動化するプログラム、ということになるでしょう。

今回は、とてもシンプルで学習コストも低そうなansibleを使用して、
単純なパッケージのインストールよりは少し複雑なもの(主にソースからビルドするもの)の例を紹介します。

想定しているのは開発環境として使用するものです。
本番環境作成時には、詳細について慎重に検証する必要があると思いますのでご了承ください。

環境はubuntu 15.04です。
CentOS等のrpmディストリビューションの場合は適宜読み替えてください。

また、ユーザー名は'username'としていますので、実際は存在するユーザー名に変更する必要があります。

[準備1] ansibleインストール

$ sudo aptitude install ansible

まずはansibleを使用できるようにします。

今回の内容では複雑な機能はほとんど使用しませんが、ansibleの基本的な使用方法は以下を参照してください。

ansible


ansibleはpython2系で動作しますので、python3を使用している人は注意が必要です。

具体的にはFAQを参照してください。


実行内容はYAMLファイルに記述します(playbook)。

playbookの実行は以下のように行います。

$ ansible-playbook -i hostname, xxx.yml
$ ansible-playbook -c local -i localhost, xxx.yml # localhostの場合

通常はhost設定ファイルに対象を記述するのが一般的なようです。

[準備2] 依存パッケージ群のインストール等

---
- hosts: all
  sudo: true
  user: username
  vars:
    install_packages:
      - build-essential
      - bison
      - curl
      - zlib1g-dev
      - libssl-dev
      - libyaml-dev
      - libsqlite3-dev
      - sqlite3
      - libxml2-dev
      - libxslt1-dev
      - autoconf
      - libncurses5-dev
      - libmysqlclient-dev
      - wget
      - gcc
      - make
      - automake
      - vim
      - xzip
      - gettext
      - tclsh
      - tcl8.6-dev
      - libcurl4-gnutls-dev
  tasks:
    - name: install aptitude
      command: apt-get -y install aptitude
    - name: update packages
      command: aptitude -y update
    - name: install packages
      command: aptitude -y install {{ item }}
      with_items: install_packages
    - name: locale settings
      shell: locale-gen en_US.UTF-8 ; locale-gen ja_JP.UTF-8 ; update-locale LANG=en_US.UTF-8


主にビルドする環境を整えるため、依存するパッケージのインストールを行っています。

ついでにlocaleの設定も行っています。

共通系の設定はこのようなymlを準備しておいて、そこに追加するようにすれば効率が良いです。

ただし、様々な種類の環境に対応していると、パッケージ数がかなりのものになると思いますので、場合によっては種類別に分割したほうがよいかもしれません。

rpm系の場合はパッケージ名が違っていることが多いので、注意が必要です。

emacs

---
- hosts: all
  sudo: true
  user: username
  vars:
    src: /usr/src
    emacs_ver: 24.5
  tasks:
    - stat: path={{ src }}/emacs-{{ emacs_ver }}.tar.xz
      register: emacs_src
    - stat: path={{ src }}/emacs-{{ emacs_ver }}
      register: emacs_dir
    - name: get emacs src
      get_url: url=http://ftp.jaist.ac.jp/pub/GNU/emacs/emacs-{{ emacs_ver }}.tar.xz dest={{ src }}/emacs-{{ emacs_ver }}.tar.xz
      when: not emacs_src.stat.exists
    - name: extract emacs src
      command: tar xJf emacs-{{ emacs_ver }}.tar.xz chdir={{ src }} creates={{ src }}/emacs-{{ emacs_ver }}
      when: not emacs_dir.stat.exists
    - name: configure emacs
      command: >
        ./configure
        --without-toolkit-scroll-bars
        --without-xaw3d
        --without-sound
        --without-pop
        --without-xpm
        --without-tiff
        --without-rsvg
        --without-gconf
        --without-gsettings
        --without-selinux
        --without-gpm
        --without-makeinfo
        --without-imagemagick
        --without-x
        chdir={{ src }}/emacs-{{ emacs_ver }}
    - name: make emacs
      command: make chdir={{ src }}/emacs-{{ emacs_ver }}
    - name: make install emacs
      command: make install chdir={{ src }}/emacs-{{ emacs_ver }}

このパターンは、ソースからビルド・インストールする場合では比較的一般的な形式だと思います。

実際に使用する際にはインストール後の設定ファイル設置等も行っています。

特筆することはあまりありませんが、強いて言うと、configureで複数オプションを設定する際、
'command: >' に続けてコマンドラインを記述することで、複数行に書くことができます。

git

---
- hosts: all
  sudo: true
  user: username
  vars:
    src: /usr/src
    git_version: 2.7.0
  tasks:
    - stat: path={{ src }}/git-{{ git_version }}.tar.xz
      register: git_src
    - stat: path={{ src }}/git-{{ git_version }}
      register: git_dir
    - name: remove package
      command: aptitude -y purge git-core git
    - name: get src
      get_url: url=https://www.kernel.org/pub/software/scm/git/git-{{ git_version }}.tar.xz dest={{ src }}/git-{{ git_version }}.tar.xz
      when: not git_src.stat.exists
    - name: extract src
      command: tar xJf git-{{ git_version }}.tar.xz chdir={{ src }}
      when: not git_dir.stat.exists
    - name: configure
      command: ./configure chdir={{ src }}/git-{{ git_version }}
    - name: make install
      command: make install chdir={{ src }}/git-{{ git_version }}
    - name: clone git-flow
      command: git clone --recursive git://github.com/nvie/gitflow.git chdir={{ src }}
    - name: install git-flow
      command: make install chdir={{ src }}/gitflow

gitの最新版とgit-flowを続けてインストールするymlです。

このパターンもemacsの場合と大差ないですが、少し違うところと言えば、git-flowのソースをgit cloneで取得しているあたりでしょうか。

また、重複を避けるためaptでgitを削除しています。

gitのコード自体もgithubからzipファイルをダウンロードする等して取得できますが、

何かと都合がよさそうなのでversion別に用意されたものを指定しています。

rbenv

事前にfiles/rbenv/rbenv.sh を準備します。
内容は以下の通りです。

export RBENV_ROOT=/usr/local/rbenv
export PATH=$RBENV_ROOT/bin:$PATH
eval "$(rbenv init -)"
---
- hosts: all
  user: username
  sudo: true
  vars:
    ruby_ver: 2.3.0
    target: /usr/local/rbenv
    rbenv_path: /usr/local/rbenv/bin/rbenv
  tasks:
    - stat: path={{ target }}
      register: rbenv
    - name: clone rbenv
      command: git clone https://github.com/sstephenson/rbenv.git {{ target }}
      when: not rbenv.stat.exists
    - stat: path={{ target }}/plugins/ruby-build
      register: ruby_build
    - name: clone ruby-build
      command: git clone https://github.com/sstephenson/ruby-build.git {{ target }}/plugins/ruby-build
      when: not ruby_build.stat.exists
    - name: add rbenv.sh
      copy: src=files/rbenv/rbenv.sh dest=/etc/profile.d/rbenv.sh
    - name: install ruby
      shell: . /etc/profile ; rbenv install -s {{ ruby_ver }}
    - name: set ruby version
      shell: . /etc/profile ; rbenv global {{ ruby_ver }}

rbenvのインストールと指定バージョンのrubyをビルド・インストールを行っています。

公式のインストール手順はホームディレクトリが対象になっていますが、
/usr/local/rbenvへインストールするパターンにしています。

環境変数の設定等は、インストール実行時には参照されません。

これは、/etc/profileがログインシェルでロードされるからでしょう。

そのため、コマンド実行前に毎回ロードする方法で解決しています( . /etc/profile)。




この類のツールは、場合によっては一度設定した内容を変更せずに長く使い続ける可能性もあります。

同種のツールに puppet / chef 等ありますが、
ansibleはおそらく最もシンプルに使用する限り、すぐに使い始めることができると思いますので、
この分野にまだあまり手を出していない人には、特におすすめいたします。