July Tech Festa 2014発表資料

867 views

Published on

某ベンチャー企業に勤めるフルスタックエンジニアA氏は、本業のシステム開発や運用の傍ら、総務部技術課の一員として様々な技術的雑用を頼まれます。各種アカウントの追加や削除、ウェブサイトのコンテンツ更新、ファイルシステムのバックアップ、などなど。もちろんOSSのツールや自作スクリプトを用いて部分的に自動化は行っていますが、手作業の部分も残っているため雑用から解放されず、なかなか集中して本業に取り組むことができません。
 今回は、エンジニアに降りかかってくる様々な業務を完全に自動化するための課題や手段について検討し、各種スクリプト、Fabric、Git などのツールを組み合わせて、一連の作業を一気通貫に自動化する方法を示します。また、運用自動化プラットフォーム Kompira を紹介し、これを用いて様々な業務を素早く簡単に自動化する方法を説明します。

Published in: Engineering

July Tech Festa 2014発表資料

  1. 1. 総務部技術課!? エンジニアのための 業務完全自動化へのアプロー チ 株式会社フィックスポイント 服部健太
  2. 2. フィックスポイント社について 2014/6/22JTF2014 2  事業内容  システム運用自動化プラットフォーム「Kompira」 の開発  運用自動化導入サービス  業務コンサルティングサービス  所在:東京都渋谷区  設立:2013年4月  社員数:8名  http://www.fixpoint.co.jp 要するにKompiraを作っ て売っているベンチャー 企業
  3. 3. エンジニアに降りかかる雑用の 数々  Webコンテンツ更新  SSLサーバ証明書更 新  FW設定変更  DNS設定変更  データバックアップ  アカウント追加・削 除  サーバ構築  脆弱性対応  ソフトウェア更新作  アプリセットアップ  不要ファイルの削除  ビルメンテ停電対応  障害対応  ログファイル分析  問い合わせ対応  ・・・ 2014/6/22 3 JTF2014
  4. 4. いちいち専用ツールを導入する と・・・ 2014/6/22JTF2014 4
  5. 5. 中途半端な自動化の風景 2014/6/22JTF2014 5
  6. 6. 中途半端な自動化の課題 2014/6/22JTF2014 6  自作スクリプトの問題  自作スクリプトがいろんなサーバに散らばっていて、どこ に何があるのか把握しきれていない  設定変更のためスクリプトを直接修正する必要がある  作った人でないと、そのスクリプトを修正できない  昔作ったスクリプトとかだと使い方を忘れる  複数のサーバや管理ツールにわたる作業なため、各 サーバにログインしてスクリプトやコマンドを実行し ている  作業依頼や通知メールを受け取るたびに、自分の業務 が中断されてしまう 完全自動化しないとエンジニアの負荷はなかなか減らな い
  7. 7. 運用自動化の段階 • コマンド実行も含めて全て手作業Level 0: 原始状態 • 1サーバに閉じた作業がスクリプト化されてい る Level 1: スクリプ ト化 • ファイル転送やメール送信、複数のサーバにま たがる作業もスクリプト化されているLevel 2: 半自動化 • 業務依頼を受けるとワンクリック(ワンコマン ド)で実行できるLevel 3: 全自動化 • 業務自体がシステムに組み込まれ、人が介在す ることなく実行される Level 4: システム 化 2014/6/22JTF2014 7 難易度高
  8. 8. 完全自動化の壁と対応方法 2014/6/22JTF2014 8  複数のサーバにまたがる作業 ⇒ Fabricを使う  設定ファイルを書き換える必要がある ⇒ sedを駆使するか設定ファイルのテンプレートを用意する  実行するコマンドが対話形式でコンソールからの入力待ちになる ⇒ バッチ実行可能なオプションを探す ⇒ expectスクリプトと組み合わせる  ブラウザにアクセスして外部ツールを操作する必要がある ⇒ 外部ツールがAPIを提供していれば、それを利用する ⇒ ブラウザアクセス時のHTTPリクエストを解析し、スクリプトから適切なPOST リクエストを投げる  作業依頼ごとに微妙に内容が異なる ⇒ バリエーションを整理し設定やオプションを整理し、YAMLなどで設定できる ようにする  スクリプトが複雑になったり、数が増えたりする ⇒ GitやSVNなどのリポジトリでバージョン管理する ⇒ スクリプトは必要に応じて、実行対象サーバに転送する
  9. 9. 基本的なシステム構成 2014/6/22JTF2014 9
  10. 10. Fabricとは 2014/6/22JTF2014 10  アプリケーションのデプロイやシステム管理といった 仕事を自動化するためのツール  Pythonライブラリ、CUIツールから構成される  SSHを使ってリモートコマンドを自動実行する  特徴:  Pythonで書ける  ローカルからリモートへSSH接続してできる作業なら、な んでも自動化可能  リモートサーバを複数定義しておくと、自動化した作業を 一括で適用可能  Cf. Capistrano  Rubyで書かれている  Rake風のDSL(Domain Specific Language)で記述
  11. 11. Fabricによるタスク記述例 2014/6/22JTF2014 11  fabfile.py  タスクの実行方法: $ fab install_python -H <host> -u <user> -p <passwd> from fabric.api import cd, run, sudo def install_python(ver='3.3.3'): run('wget http://www.python.org/ftp/python/{0}/Python{0}.tgz'.format (ver)) run('tar zxvf Python-{0}.tgz'.format(ver)) with cd('Python-{0}'.format(ver)): run('./configure --prefix=/opt/local') sudo('make & make install')
  12. 12. 題材:Wordpressサーバの新規構 築  AWSインスタンスを新規作成@ローカル 1. インスタンス生成 2. Public IPアドレスを取得 3. SSHログイン可能になるまで待つ  Wordpressサーバをインストール@インスタンス 1. 最新のWordpressパッケージを取得 2. 必要なパッケージをインストールする 3. MySQL データベースを作成する 4. WordPress の設定を行い /var/www/html に配置する 5. install.php にアクセスして WordPress を初期化す る 2014/6/22JTF2014 12
  13. 13. Fabricで実装する場合 2014/6/22JTF2014 13  リモートコマンドの実行はrunを使って簡単に書 けるが・・・  YAML設定ファイルの読み込み  ファイルオープンしてPyYAMLでパース  インスタンスのログインチェック  ログイン可能になるまでsleepしながらリトライ処理  install.phpにアクセスしての初期化  requestsライブラリでPOSTリクエスト生成  タスクファイルを分割して管理  Pythonのモジュール機構を利用 Pythonプログラムをゴリゴリ書いていく必要あり
  14. 14. Kimpiraを作ってみた 2014/6/22JTF2014 14  http://github.com/khattori/kimpira  Fabricのラッパーツール  タスク(作業手順)をYAMLで記述できる  hello.yml  タスクの実行: TASK: echo-hello-world PARAMS: message='hello world' DO: - COMMAND: echo $message - PRINT: $RESULT $ kimpira hello.yml Ansibleもどきでは!? というツッコミはこの際 無視
  15. 15. リモートコマンド実行 2014/6/22JTF2014 15  実行対象のホストやアカウント情報が記述さ れたYAMLファイルパスを制御変数で指定  test-account.yml TASK: execute-remote-command DO: - SET: HOST=test-server ACCOUNT=@./test-account.yml - COMMAND: whoami - COMMAND: hostname user: test-user password: test-password keyfile: ./test-user.pem
  16. 16. スクリプト実行 2014/6/22JTF2014 16  任意のスクリプトをリモートサーバ上で実行 可能  スクリプトファイルは実行時に対象サーバに転送 され、実行完了後は自動で削除される TASK: execute-script PARAMS: NODE=@./test-server.yml DO: - SCRIPT: @./shell-script.sh - SCRIPT: @./perl-script.pl - SCRIPT: @./ruby-script.rb - SCRIPT: @./python-script.py
  17. 17. タスク制御機構 2014/6/22JTF2014 17  別タスク呼び出し  条件分岐  繰り返し  REPEAT~WHILE, REPEAT~UNTIL, FOR~INもある - CALL: echo-hello-world 'hello JTF2014' IN: '@./hello.yml' - IF: '"${ $result != "root" }"' THEN: - PRINT: please run as root user! - REPEAT: 10 DO: - SLEEP: 1 - COMMAND: date
  18. 18. KimpiraでWordpressサーバ構築 2014/6/22JTF2014 18  ディレクトリ構成 samples ├── lib/ │ └── aws/ │ ├── account.yml │ ├── api.yml │ ├── conf.yml │ └── utils.yml └── wordpress/ ├── conf.yml ├── setup.yml └── wordpress.yml
  19. 19. AWSインスタンスの生成 2014/6/22JTF2014 19  AWS CLIツールを呼び出してインスタンス生成し、名前を設 定  その後、インスタンスがrunning状態になるまで待つ - TASK: create-instance-and-wait-running PARAMS: name image_id key_name security_groups= ... DO: - CALL: ec2-run-instances $image_id $key_name ... IN: "@./api.yml" RESULT: instance_id - CALL: ec2-create-tags $instance_id Name $name IN: "@./api.yml" - CALL: wait-instance-running $instance_id - RETURN: $instance_id
  20. 20. インスタンス起動待ち 2014/6/22JTF2014 20  5秒おきにインスタンス状態を取得  running状態になるまで最大で30回繰り返す - TASK: wait-instance-running PARAMS: instance_id DO: - REPEAT: 30 DO: - SLEEP: 5 - CALL: get-instance-status $instance_id RESULT: status UNTIL: ${status == "running"}
  21. 21. ログイン待ち 2014/6/22JTF2014 21  成功するまで5秒おきにidコマンドをリモー ト実行 - TASK: check-login PARAMS: host account=@./account.yml DO: - SET: HOST=$host ACCOUNT=$account - REPEAT: 30 DO: - SLEEP: 5 - COMMAND: id WARN_ONLY: - SET: status=$RESULT.return_code UNTIL: ${status == "0"} - IF: ${status!='"0"'} THEN: - ABORT: Failed to login $host コマンドが失敗してもアボート しないようにWARN_ONLY設 定
  22. 22. Wordpressインストール 2014/6/22JTF2014 22  インストール手順の各ステップを記述したサ ブタスクを順番に呼び出す - TASK: setup-wordpress PARAMS: host account DO: - WITH: HOST=$host ACCOUNT=$account DO: - CALL: package-download - CALL: start-services - CALL: create-db - CALL: configure-and-copy - CALL: initialize
  23. 23. Wordpress初期化 2014/6/22JTF2014 23 - TASK: initialize DO: - DEFAULT: conf=@./conf.yml - yaml.load: $conf RESULT: conf - http.post: http://$HOST/wordpress/wp-admin/install.php?step=2 DATA: weblog_title: $conf.wp_title user_name: admin admin_password: $conf.wp_admin_password admin_password2: $conf.wp_admin_password admin_email: $conf.wp_admin_email log_public: '1' Submit: WordPress をインストール - WITH: SUDO=True DO: - COMMAND: rm /var/www/html/wordpress/wp-admin/install.php - RETURN: http://$HOST/wordpress ブラウザからアクセスするかわ りにPOSTリクエストを投げて初 期化
  24. 24. 全部をまとめる 2014/6/22JTF2014 24 - TASK: create-wordpress-server PARAMS: name=JTF_Test image_id=ami-c9562fc8 ... DO: - CALL: create-instance-and-wait-running $name ... IN: "@../lib/aws/utils.yml" RESULT: instance_id - CALL: get-instance-public-ip $instance_id IN: "@../lib/aws/utils.yml" RESULT: server_ip - CALL: check-login $server_ip $account IN: "@../lib/aws/utils.yml" - CALL: setup-wordpress $server_ip $account IN: "@./setup.yml" RESULT: url - PRINT: "**** SETUP COMPLETED! --- $url"
  25. 25. 完全自動化まであと一歩 2014/6/22JTF2014 25  メールを受信したら、自動的にWordpress構築  定期的にメールチェックするようcrontabに登録して おく - TASK: recv-mail DO: - email.recv: $imap4_conf RESULT: mails - FOR: mail IN: $mails DO: - IF: ${$mail.Subject=='"Install Wordpress"'} THEN: - CALL: create-wordpress-server IN: '@./wordpress/wordpress.yml' RESULT: url - CALL: send-mail $mail.From $url
  26. 26. GUIで作業依頼を受け付ける 2014/6/22JTF2014 26  Googleフォームを使う  フォーム送信ボタンが押されたらメールを送信す るように設定しておく
  27. 27. デモ 2014/6/22JTF2014 27  https://docs.google.com/a/fixpoint.co.jp/forms/ d/1Iu1pmCPlcmjaUNamH4EJpPtxcZhrdrQ4Eh wAY9nioig/viewform
  28. 28. 自動化=プログラミング 2014/6/22JTF2014 28  タスクをYAMLで書いても、それはプログラム  GUIでグリグリ書いても、それはプログラ ム
  29. 29. どこまで自動化すべきか? 29  自動化に向いているもの  手順化が簡単(単純な規則にもとづく作業)  何度も繰り返し行う作業  自動化に向いていないもの  手順化できない、手間が大変(高度、複雑な判断が必要な作業)  一回ポッキリの作業 人間向きの 高度な作業 単純な 定型処理 ・・・ ・・・ オペレータ オペレータ 自動化によって削減されるコスト > 自動化にかかる コスト
  30. 30. Kompiraのご紹介 2014/6/22 30 JTF2014
  31. 31. Kompiraの概要 2014/6/22JTF2014 31  運用自動化のためのプラットフォーム  オペレータはサーバの運用手順をジョブフローとして 記述し、それをKompiraサーバ上で実行する
  32. 32. 独自DSLによるジョブフロー記 述 2014/6/22JTF2014 32  実行するリモートコマンドを「->」でつないでいく  メール受信など外部イベントをチャネル経由で取得可 能 | __node__ = ../テストサーバ | print('1. WordPressパッケージをダウンロードします') -> ['wget -q -nc http://ja.wordpress.org/latest-ja.tar.gz'] -> print('2. 必要なパッケージをインストールし、サービスを起動します ') -> [__sudo__ = true] -> ['yum install -q -y httpd mysql-server php php-mysql php-mbstring'] -> ['chkconfig mysqld on'] -> ['service mysqld start'] -> ['chkconfig httpd on'] -> ['service httpd start'] <./メール受信> -> [./Wordpressサーバ構築: $RESULT]
  33. 33. Kompiraサーバのシステム構成 33
  34. 34. デモ 2014/6/22JTF2014 34  詳細はA会場フィックスポイント社ブースに て!
  35. 35. Kompira利用事例 2014/6/22JTF2014 35  セキュリティ監視業務でのチケット自動ク ローズ  アプリケーションログの定期監視と異常検出 時のエスカレーション  監視サーバからのアラートを受けて障害復旧  Kompiraライセンスファイルの発行業務  Excel顧客名簿にもとづくダイレクトメールの 送信とバウンスメールの処理  ウェブサイトのコンテンツ更新作業  ・・・
  36. 36. まとめ 2014/6/22JTF2014 36  自動化の効果は完全自動化することで実感できる  自動化とはプログラミング(システム開発)であ る  自動化に魔法の杖(銀の弾丸)は無い  自動化プラットフォームをベースに自動化しやす いところから手をつけていくのがよい  自動化にはコストがかかるので、自動化と手作業 の見極め(割り切り)が重要

×