開発環境構築にansibleを使用する
こんにちは、エンジニアのアカイです。
vmやコンテナを複数作成する場合、各環境に様々なものをインストールすることになりますが、同じようなコマンドをそれぞれに対して実行するのも面倒なので、いわゆる構成管理ツールを使用するのはもはや常識になっている感があります。
これをもう少し噛み砕いて言うと、
よくブログ記事などで「~のインストール手順」等として紹介されている内容を、
自動化するプログラム、ということになるでしょう。
今回は、とてもシンプルで学習コストも低そうなansibleを使用して、
単純なパッケージのインストールよりは少し複雑なもの(主にソースからビルドするもの)の例を紹介します。
想定しているのは開発環境として使用するものです。
本番環境作成時には、詳細について慎重に検証する必要があると思いますのでご了承ください。
環境はubuntu 15.04です。
CentOS等のrpm系ディストリビューションの場合は適宜読み替えてください。
また、ユーザー名は'username'としていますので、実際は存在するユーザー名に変更する必要があります。
[準備1] ansibleインストール
$ sudo aptitude install 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はおそらく最もシンプルに使用する限り、すぐに使い始めることができると思いますので、
この分野にまだあまり手を出していない人には、特におすすめいたします。