Upgrade to Pro — share decks privately, control downloads, hide ads and more …

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

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

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

Ryuichi Nakajima

May 17, 2014
Tweet

More Decks by Ryuichi Nakajima

Other Decks in Technology

Transcript

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

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

    Serverspec & Specinfra sensu 自働化 Infrastructure as Code Continuous Integration Continuous Delivery Go その他 ( 達人出版会) " 第11 章 Agile への取り組みから生まれた不思議な 「 縁」" を書きました rebuildfm 電子書籍 「 サムライ・ エピソー ド」
  3. **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
  4. **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 -)" 設定がひとつに 新たな設定追加が不要で、 簡単に別の言語環境を導入する ことができます
  5. インストー ル **env のインストー ル **env で任意のものをインストー ル ❯❯❯ anyenv

    install rbenv ❯❯❯ anyenv install goenv ❯❯❯ anyenv install pyenv ❯❯❯ rbenv install 2.1.2
  6. 実際にバー ジョン確認をしてみると? ❯❯❯ 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 がインストー ルされている
  7. 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 のプラグイン
  8. 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 プラグインのリポジトリ
  9. 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 のようなサブコマンドをまとめて実行できます
  10. 参考 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
  11. Ansible とは サー バ構成管理ツー ル ≒ 便利で汎用的なシェルスクリプト OS の初期設定やミドルウェアのインストー ル/

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

    と ssh が利用できる環境であれば簡単に使えます 複数ホストに対して同時に実行することもできます Python 製のツー ルだけど、 実際に利用するためには yaml を 書けてコマンドラインでサー バの作業ができれば大丈夫 外部 DSL だけど自作の module を利用する機能があるので、 自由度は高い プログラムならこんな感じで書けるのに、 テンプレー トエ ンジン(jinja2) だとどうすりゃいいの? とか困ったことはあ ったw つまり、 複雑な処理をしたければ module を書けよって話
  13. やらないほうが良いこと プログラムのデプロイ ≒ 便利で汎用的なシェルスクリプトなので、 デプロイ の手順も書けるが素直にデプロイツー ルを利用する方 が良い 当然、 DB

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

    他の言語でも作れます 要するにテキスト処理なので、 シェルスクリプトでも module を作れるんですよねー
  15. 標準で用意された 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"
  16. シェルスクリプトで書いていた処理に、 実行に必要な引数を 渡して処理結果が画面出力されてるものと考えればわかりや すいかも ❯❯❯ 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
  17. 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
  18. 一部抜粋した部分をサー バ構築の手順書として書いたものと 比較するとわかりやすいかも - 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