$30 off During Our Annual Pro Sale. View Details »

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

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

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. A Web Infrastructure Engineer's
    Development Environment
    - kanazawa.rb meetup #21 #kzrb -

    View Slide

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

    View Slide

  3. twitter
    github
    Web
    系のインフラエンジニア
    最近、
    やってること
    の環境構築をansible
    で自動化
    +
    などを利用して運用系ドキュ
    メント作成
    @libero_18
    libero18
    対サイバー
    攻撃アラー
    トサー
    ビス:SiteVisor (
    サイトバ
    イザー)
    jqGrid izawa/rackplan.js

    View Slide

  4. 最近、
    興味あるもの
    Docker & Packer & Vagrant
    Ansible / Chef
    Serverspec & Specinfra
    sensu
    自働化
    Infrastructure as Code
    Continuous Integration
    Continuous Delivery
    Go
    その他
    (
    達人出版会)
    "
    第11
    章 Agile
    への取り組みから生まれた不思議な

    縁」"
    を書きました
    rebuildfm
    電子書籍 「
    サムライ・
    エピソー
    ド」

    View Slide

  5. 本日、
    お話したいと思っていること
    普段使っているツー
    ルを紹介
    anyenv
    Ansible

    View Slide

  6. anyenv

    View Slide

  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

    View Slide

  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 -)"
    設定がひとつに
    新たな設定追加が不要で、
    簡単に別の言語環境を導入する
    ことができます

    View Slide

  9. インストー

    **env
    のインストー

    **env
    で任意のものをインストー

    ❯❯❯ anyenv install rbenv
    ❯❯❯ anyenv install goenv
    ❯❯❯ anyenv install pyenv
    ❯❯❯ rbenv install 2.1.2

    View Slide

  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
    がインストー
    ルされている

    View Slide

  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
    のプラグイン

    View Slide

  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
    プラグインのリポジトリ

    View Slide

  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
    のようなサブコマンドをまとめて実行できます

    View Slide

  14. それが anyenv
    まとめ
    様々
    な言語の環境をひとつの方法で簡単に構築でき、
    各種プラグインなどもまとめて簡単にアップデー
    トできる

    View Slide

  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

    View Slide

  16. Ansible

    View Slide

  17. Ansible
    とは
    サー
    バ構成管理ツー


    便利で汎用的なシェルスクリプト
    OS
    の初期設定やミドルウェアのインストー
    ル/
    設定を動く
    手順書として記述することができます
    最近だと Ansible
    を利用して OS X
    を管理する っての
    もあります
    インストー
    ル用のスクリプトで Ansible
    を pip install

    て準備された Playbook
    から Homebrew
    などを利用し
    ている
    Homebrew + Homebrew-cask
    よりも自由度が高く、
    Boxen
    よりも簡単に使えそう
    osxc

    View Slide

  18. ロー
    カルホストからリモー
    トホストに Push
    して実行するの
    で、
    リモー
    トホストにエー
    ジェントは不要です
    Python
    と ssh
    が利用できる環境であれば簡単に使えます
    複数ホストに対して同時に実行することもできます
    Python
    製のツー
    ルだけど、
    実際に利用するためには yaml

    書けてコマンドラインでサー
    バの作業ができれば大丈夫
    外部 DSL
    だけど自作の module
    を利用する機能があるので、
    自由度は高い
    プログラムならこんな感じで書けるのに、
    テンプレー
    トエ
    ンジン(jinja2)
    だとどうすりゃいいの?
    とか困ったことはあ
    ったw
    つまり、
    複雑な処理をしたければ module
    を書けよって話

    View Slide

  19. できないこと
    OS
    のインストー

    自動化するにはクラウドとか利用してAPI
    経由でインス
    タンスを作成し、
    そのインスタンスに向けて Ansible

    実行するような Vagrantfile
    とかを書く必要がある

    View Slide

  20. やらないほうが良いこと
    プログラムのデプロイ

    便利で汎用的なシェルスクリプトなので、
    デプロイ
    の手順も書けるが素直にデプロイツー
    ルを利用する方
    が良い
    当然、 DB
    はマイグレー
    ションツー
    ルを利用する方が良

    実際には Ansible
    からデプロイツー
    ルやマイグレー

    ョンツー
    ルを動かすコマンドを実行する
    cap development deploy
    とか
    alembic upgrade head
    など

    View Slide

  21. module
    module
    が処理していること
    標準入力でオプションを受け取る
    標準出力で実行結果を返す
    入出力に JSON
    フォー
    マットなどを利用しているの
    で、
    他の言語でも作れます
    要するにテキスト処理なので、
    シェルスクリプトでも
    module
    を作れるんですよねー

    View Slide

  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"

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  26. それが Ansible
    まとめ
    シェルスクリプトを動く手順書として作成するのは大変だが
    それを容易かつ汎用的な文書に変換し、
    再利用も可能にする

    View Slide

  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

    View Slide

  28. Todo: Serverspec

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  34. ありがとうございました

    View Slide