More Related Content
Similar to July Tech Festa 2014発表資料 (20)
More from Kenta Hattori (20)
July Tech Festa 2014発表資料
- 7. 運用自動化の段階
• コマンド実行も含めて全て手作業Level 0: 原始状態
• 1サーバに閉じた作業がスクリプト化されてい
る
Level 1: スクリプ
ト化
• ファイル転送やメール送信、複数のサーバにま
たがる作業もスクリプト化されているLevel 2: 半自動化
• 業務依頼を受けるとワンクリック(ワンコマン
ド)で実行できるLevel 3: 全自動化
• 業務自体がシステムに組み込まれ、人が介在す
ることなく実行される
Level 4: システム
化
2014/6/22JTF2014
7
難易度高
- 8. 完全自動化の壁と対応方法
2014/6/22JTF2014
8
複数のサーバにまたがる作業
⇒ Fabricを使う
設定ファイルを書き換える必要がある
⇒ sedを駆使するか設定ファイルのテンプレートを用意する
実行するコマンドが対話形式でコンソールからの入力待ちになる
⇒ バッチ実行可能なオプションを探す
⇒ expectスクリプトと組み合わせる
ブラウザにアクセスして外部ツールを操作する必要がある
⇒ 外部ツールがAPIを提供していれば、それを利用する
⇒ ブラウザアクセス時のHTTPリクエストを解析し、スクリプトから適切なPOST
リクエストを投げる
作業依頼ごとに微妙に内容が異なる
⇒ バリエーションを整理し設定やオプションを整理し、YAMLなどで設定できる
ようにする
スクリプトが複雑になったり、数が増えたりする
⇒ GitやSVNなどのリポジトリでバージョン管理する
⇒ スクリプトは必要に応じて、実行対象サーバに転送する
- 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. 題材: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
- 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
- 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
- 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設
定
- 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. 全部をまとめる
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"
- 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]