とあるインフラエンジニアの開発環境

 とあるインフラエンジニアの開発環境

kanazawa.rb #21 #kzrb / twitter: @libero_18 / github: libero18 / github-pages: http://libero18.github.io/slide/data/01/index.html#/

F597f18969e6f2578c1a151d0fe92004?s=128

Ryuichi Nakajima

May 17, 2014
Tweet

Transcript

  1. A Web Infrastructure Engineer's Development Environment - kanazawa.rb meetup #21

    #kzrb -
  2. (; ・`д・´)  誰だお前!?

  3. twitter github Web 系のインフラエンジニア 最近、 やってること の環境構築をansible で自動化 + などを利用して運用系ドキュ

    メント作成 @libero_18 libero18 対サイバー 攻撃アラー トサー ビス:SiteVisor ( サイトバ イザー) jqGrid izawa/rackplan.js
  4. 最近、 興味あるもの Docker & Packer & Vagrant Ansible / Chef

    Serverspec & Specinfra sensu 自働化 Infrastructure as Code Continuous Integration Continuous Delivery Go その他 ( 達人出版会) " 第11 章 Agile への取り組みから生まれた不思議な 「 縁」" を書きました rebuildfm 電子書籍 「 サムライ・ エピソー ド」
  5. 本日、 お話したいと思っていること 普段使っているツー ルを紹介 anyenv Ansible

  6. anyenv

  7. **env 系の簡易マネー ジャ 開発者は さん 以下をまとめて管理することができる (2014/05 現在) denv (

    dlang / D ) goenv ( golang / Go ) jenv ( Java ) luaenv ( Lua ) ndenv ( node.js ) phpenv ( PHP ) plenv ( Perl ) pyenv ( Python ) rbenv ( Ruby ) @riywo
  8. **shenv の設定 export PATH="$HOME/.rbenv/bin:$PATH" eval "$(rbenv init -)" export PATH="$HOME/.goenv/bin:$PATH"

    eval "$(goenv init -)" export PATH="$HOME/.pyenv/bin:$PATH" eval "$(pyenv init -)" ↓ export PATH="$HOME/.anyenv/bin:$PATH" eval "$(anyenv init -)" 設定がひとつに 新たな設定追加が不要で、 簡単に別の言語環境を導入する ことができます
  9. インストー ル **env のインストー ル **env で任意のものをインストー ル ❯❯❯ anyenv

    install rbenv ❯❯❯ anyenv install goenv ❯❯❯ anyenv install pyenv ❯❯❯ rbenv install 2.1.2
  10. 実際にバー ジョン確認をしてみると? ❯❯❯ anyenv version goenv: couldn't find any version

    specified for use goenv: pyenv: system (set by /Users/nakajima/.anyenv/envs/pyenv/version) rbenv: 2.1.2 (set by /Users/nakajima/.anyenv/envs/rbenv/version) ❯❯❯ anyenv versions goenv: pyenv: * system (set by /Users/nakajima/.anyenv/envs/pyenv/version) rbenv: system 2.1.0 2.1.1 * 2.1.2 (set by /Users/nakajima/.anyenv/envs/rbenv/version) Go はインストー ルされていない Python は System 標準のものを利用している Ruby は rbenv で 2.1.2 がインストー ルされている
  11. znz/anyenv-update でアップデー ト ❯❯❯ anyenv update Updating 'anyenv'... Already up-to-date.

    Updating 'goenv'... Already up-to-date. Updating 'pyenv'... remote: Counting objects: 19, done. remote: Compressing objects: 100% (17/17), done. ... 長すぎるので省略 ... Updating 'rbenv'... Already up-to-date. Updating 'rbenv-binstubs'... Already up-to-date. コマンドひとつで簡単にアップデー トができます anyenv & anyenv のプラグイン **env & **env のプラグイン
  12. znz/anyenv-update でgit コマンド ❯❯❯ anyenv git gc Run git in

    'anyenv'... Counting objects: 114, done. Delta compression using up to 4 threads. Compressing objects: 100% (101/101), done. Writing objects: 100% (114/114), done. Total 114 (delta 40), reused 0 (delta 0) Run git in 'anyenv-git'... Counting objects: 29, done. Delta compression using up to 4 threads. Compressing objects: 100% (26/26), done. Writing objects: 100% (29/29), done. Total 29 (delta 8), reused 0 (delta 0) Run git in 'anyenv-update'... ... 長すぎるので省略 ... コマンドひとつで各リポジトリ内にある不要なオブジェクト を削除したりできます anyenv リポジトリ & 各 anyenv プラグインのリポジトリ **env リポジトリ & 各 **env プラグインのリポジトリ
  13. aereal/anyenv-exec でサブコマンド ❯❯❯ anyenv exec --version goenv 0.0.4 pyenv 0.4.0-20140404-28-g8851acd

    rbenv 0.4.0-97-gfe0b243 ❯❯❯ anyenv exec rehash **env rehash のようなサブコマンドをまとめて実行できます
  14. それが anyenv まとめ 様々 な言語の環境をひとつの方法で簡単に構築でき、 各種プラグインなどもまとめて簡単にアップデー トできる

  15. 参考 riywo/anyenv znz/anyenv-update anyenv-git anyenv-exec anyenv という**env 系の簡易マネー ジャを作った anyenv

    で開発環境を整える https://github.com/riywo/anyenv https://github.com/znz/anyenv-update https://github.com/znz/anyenv-git https://github.com/aereal/anyenv-exec http://blog.riywo.com/2013/06/22/155804 http://qiita.com/luckypool/items/f1e756e9d3e9786ad9ea
  16. Ansible

  17. Ansible とは サー バ構成管理ツー ル ≒ 便利で汎用的なシェルスクリプト OS の初期設定やミドルウェアのインストー ル/

    設定を動く 手順書として記述することができます 最近だと Ansible を利用して OS X を管理する っての もあります インストー ル用のスクリプトで Ansible を pip install し て準備された Playbook から Homebrew などを利用し ている Homebrew + Homebrew-cask よりも自由度が高く、 Boxen よりも簡単に使えそう osxc
  18. ロー カルホストからリモー トホストに Push して実行するの で、 リモー トホストにエー ジェントは不要です Python

    と ssh が利用できる環境であれば簡単に使えます 複数ホストに対して同時に実行することもできます Python 製のツー ルだけど、 実際に利用するためには yaml を 書けてコマンドラインでサー バの作業ができれば大丈夫 外部 DSL だけど自作の module を利用する機能があるので、 自由度は高い プログラムならこんな感じで書けるのに、 テンプレー トエ ンジン(jinja2) だとどうすりゃいいの? とか困ったことはあ ったw つまり、 複雑な処理をしたければ module を書けよって話
  19. できないこと OS のインストー ル 自動化するにはクラウドとか利用してAPI 経由でインス タンスを作成し、 そのインスタンスに向けて Ansible を

    実行するような Vagrantfile とかを書く必要がある
  20. やらないほうが良いこと プログラムのデプロイ ≒ 便利で汎用的なシェルスクリプトなので、 デプロイ の手順も書けるが素直にデプロイツー ルを利用する方 が良い 当然、 DB

    はマイグレー ションツー ルを利用する方が良 い 実際には Ansible からデプロイツー ルやマイグレー シ ョンツー ルを動かすコマンドを実行する cap development deploy とか alembic upgrade head など
  21. module module が処理していること 標準入力でオプションを受け取る 標準出力で実行結果を返す 入出力に JSON フォー マットなどを利用しているの で、

    他の言語でも作れます 要するにテキスト処理なので、 シェルスクリプトでも module を作れるんですよねー
  22. 標準で用意された module はこんな感じで使えます ❯❯❯ ansible -i hosts 192.168.100.20 -m ping

    192.168.100.20 | success >> { "changed": false, "ping": "pong" } ❯❯❯ ansible -i hosts 192.168.100.21 -m raw -a "uname -a" 192.168.100.21 | success | rc=0 >> 2.6.32-431.el6.x86_64 ❯❯❯ ansible -i hosts 192.168.100.22 -m raw -a "sudo yum install -y python-simplejson"
  23. シェルスクリプトで書いていた処理に、 実行に必要な引数を 渡して処理結果が画面出力されてるものと考えればわかりや すいかも ❯❯❯ ansible -i hosts 192.168.100.21 -m

    raw -a "uname -a" ↓ ❯❯❯ ansible -m raw -a "uname -a" -i hosts 192.168.100.21 ≒ ❯❯❯ sh ./remote_host_uname.sh 192.168.100.21 ↓ 処理結果が出力される 2.6.32-431.el6.x86_64 ansible → sh -m raw -a "uname -a" -i hosts → ./remote_host_uname.sh
  24. Playbook module などを利用する手順をまとめて yaml で書いたもの ansible-playbook ファイル名 で実行する 設定ファイルを配置や置換したり、 サー

    ビスの再起動などサ ー バを構築するうえで必要な手順を記載する yum module を利用して指定パッケー ジをインストー ルする 場合、 こんな感じで書けます - hosts: myserver user: vagrant sudo: yes tasks: - name: install apache action: yum pkg=httpd state=installed - name: install mysql action: yum pkg=mysql state=installed
  25. 一部抜粋した部分をサー バ構築の手順書として書いたものと 比較するとわかりやすいかも - hosts: myserver user: vagrant sudo: yes

    tasks: - name: install apache action: yum pkg=httpd state=installed - name: install mysql action: yum pkg=mysql state=installed ↓ sudo: yes tasks: - name: install apache action: yum pkg=httpd state=installed - name: install mysql action: yum pkg=mysql state=installed ≒ 手順1. Apache をインストールする sudo yum install httpd 手順2. MySQL をインストールする sudo yum install mysql
  26. それが Ansible まとめ シェルスクリプトを動く手順書として作成するのは大変だが それを容易かつ汎用的な文書に変換し、 再利用も可能にする

  27. 参考 Ansible Tutorial 不思議の国のAnsible 入門Ansible Qiita (tag:Ansible) http://yteraoka.github.io/ansible-tutorial/ http://demand-side-science.jp/blog/2014/ansible-in- wonderland-01/

    http://www.slideshare.net/takushimizu/ansible-26200860 http://qiita.com/search? q=tag%3AAnsible&sort=&utf8=%E2%9C%93
  28. Todo: Serverspec

  29. 書きたかったけど間に合わんかったw 簡単に説明すると、 ssh 経由でサー バのコマンドを実行し て、 ファイルの存在や設定値、 サー ビスの起動状態などを確 認するためのツー

  30. 本日、 お伝えしたかったこと

  31. anyenv 様々 な環境で同じ方法を使って管理できるものをプラット フォー ムに選択しておくと、◦◦ を使って×× をする場合の ノウハウがそこに集約されるので、 開発環境と本番環境と の差異で新たな学習コストなどが発生しにくくなり便利

  32. Ansible 再利用可能なツー ルを日常的な習慣に取り入れてあると、 同じものをインスタントに複製ができ、 自働化の恩恵で容 易に成果を得ることができるので便利

  33. Serverspec ( 資料は間に合いませんでしたが・・・) 再利用可能なツー ルをインスタントに複製したあとの確認作業も自働化して おくと、 本来の目的であるコー ドを書くことに集中がで き、 確認作業に人の判断が入らないので既知の観点による

    確認漏れが発生しないので仕事の精度が高くなって便利
  34. ありがとうございました