Upload
yahoo
View
499
Download
3
Embed Size (px)
Citation preview
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.
OpenStack関連セッション
1
OpenStack Summit Barcelona 2016 参加報告
神尾皓 立見祐介
Ansibleによるおっちょこちょいの運用自動化
高橋拓也
4年間、OpenStackをデプロイしてみた
北田駿也
OpenStack on Kubernetes
木下裕太
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.
2017年1月30日
2
高橋拓也(24)
サイトオペレーション本部 インフラ技術1部 クラウドイノベーション
Ansibleによる
おっちょこちょいの運用自動化
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.
自己紹介
4
• 高橋拓也
• インフラ技術1部 クラウドイノベーション所属• プライベートクラウド(OpenStack)の運用・開発を担当
• 2016年度新卒入社
• インフラの基礎技術について、目下勉強中です
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.
つらかったこと
6
• はじめての既存システム運用• しかもものすごく大規模システム
• 一つのミスが複数のサービスに大影響を
• しかし、そんな自覚が足りなかった新人1ヶ月目
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.
つらかったこと
8
• (^o^)。。( 本番環境にアクセスっと
• (^o^)。。(Haproxyあがってないな、 $ sudo service haproxy start
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.
つらかったこと
9
• (^o^)。。( 本番環境にアクセスっと
• (^o^)。。(Haproxyあがってないな、 $ sudo service haproxy start
• (´・ω・`) < 高橋くん、それheartbeatだよ。。。
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.
つらかったこと
10
• (^o^)。。( 本番環境にアクセスっと
• (^o^)。。(Haproxyあがってないな、 $ sudo service haproxy start
• (´・ω・`) < 高橋くん、それheartbeatだよ。。。
• (´・ω・`) < もうちょっと確認してから sudoは打とうね。。。
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.
つらかったこと
11
• (^o^)。。( 本番環境にアクセスっと
• (^o^)。。(Haproxyあがってないな、 $ sudo service haproxy start
• (´・ω・`) < 高橋くん、それheartbeatだよ。。。
• (´・ω・`) < もうちょっと確認してから sudoは打とうね。。。
はじめてのオペミス (運用業務開始2日目
本番環境こわい
対策: 本番環境では気を引き締めよう
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.
つらかったこと
13
• (^o^)。( 今度は慎重にやるぞー
• (^o^)。( だんだん疲れてきたな。。
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.
つらかったこと
14
• (^o^)。( 今度は慎重にやるぞー
• (^o^)。( だんだん疲れてきたな。。
• (^o^)。( VMのnicを削除するぞ!
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.
つらかったこと
15
• (^o^)。( 今度は慎重にやるぞー
• (^o^)。( だんだん疲れてきたな。。
• (^o^)。( VMのnicを削除するぞ!
• (^o^) < あ!削除するnicを間違えた!!
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.
つらかったこと
16
• (^o^)。( 今度は慎重にやるぞー
• (^o^)。( だんだん疲れてきたな。。
• (^o^)。( VMのnicを削除するぞ!
• (^o^) < あ!削除するnicを間違えた!!
• (´・ω・`) < 事故
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.
つらかったこと
17
• (^o^)。( 今度は慎重にやるぞー
• (^o^)。( だんだん疲れてきたな。。
• (^o^)。( VMのnicを削除するぞ!
• (^o^) < あ!削除するnicを間違えた!!
• (´・ω・`) < 事故
• 必要ないポートだったため事故とはならず
• 対策: 目grepはやめてマシンにgrepさせる
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.
つらかったこと
18
• (^o^)。( このDB書き込みオペはミスできないな。。
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.
つらかったこと
19
• (^o^)。( このDB書き込みオペはミスできないな。。
• (^o^)。( 手順書からしっかりコピペして、2回チェックして
• (^o^)。( 出力結果も残したし、完璧だ!!
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.
つらかったこと
20
• (^o^)。( このDB書き込みオペはミスできないな。。
• (^o^)。( 手順書からしっかりコピペして、2回チェックして
• (^o^)。( 出力結果も残したし、完璧だ!!
• (´・ω・`) < 高橋くん、それslaveだよ。。。
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.
つらかったこと
21
• (^o^)。( このDB書き込みオペはミスできないな。。
• (^o^)。( 手順書からしっかりコピペして、2回チェックして
• (^o^)。( 出力結果も残したし、完璧だ!!
• (´・ω・`) < 高橋くん、それslaveだよ。。。
• 先輩社員の神業オペレーションにより、影響を残さず処理できた
• 対策: hostnameをターミナルに出力し続ける
• もしhostnameを見逃したら。。。 → あまり対策になってない
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.
気づいたこと
22
• オペミスする確率はエンターを押す回数と比例する
• 「対策: 気をつける」 は、必ず失敗する
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.
気づいたこと
23
• オペミスする確率はエンターを押す回数と比例する
• 「対策: 気をつける」 は、必ず失敗する
オペミスが起きないインターフェースを使おう!
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.
オペミスが起きないIFとは?
• オペミスが起きないIFとは• 実行のたびに状態が変化しない
• 冪等性を保つ or 保つ仕組みがある• 作業内容が見える
• 第三者によりチェックされた作業しか実行できないようにする
• 入力が少ない• 固定の設定値はツールで保持する
• 人力作業が少ない• 単純作業は自動化させる
25
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.
Ansibleによる運用自動化
28
• なぜAnsible?• 実行のたびに状態が変化しない
• 冪等性を保つ仕組みを持つ• →作業実行に迷わない
• 作業内容が見える• 作業内容をコード化して管理できる• タスク実行が逐次処理となる• →やり方のわからない作業がなくなる
• 入力が少ない• 変数として値をplaybookに保持できる• →どの変数を利用するかを入力として与えれば良い
• 人力作業が少ない• 単純作業は自動化させる• →エンターの叩かれる回数は確実に減る
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.
活用例
30
• OpenStackを操作してFlavorを追加する• Flavor … インスタンスのスペック情報
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.31
実行手順手順
1. クラスタのユーザー情報を読み込む
2. Clientをロードする
3. nova flavor-create を実行し、flavoを作成する
4. nova flavor-key を実行し、flavorのextra_spec(quotaなど) を追加する
実行コマンド
1. $ source cluster/adminrc
2. $ source /os/liberty/activate
3. $ nova flavor-create 2v-1024M-40G auto 1024 40 2
4. $ nova flavor-key set drive_type=ssd
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.32
実行手順手順
1. クラスタのユーザー情報を読み込む
2. Clientをロードする
3. nova flavor-create を実行し、flavoを作成する
4. nova flavor-key を実行し、flavorのextra_spec(quotaなど) を追加する
実行コマンド
1. $ source cluster/adminrc
2. $ source /os/liberty/activate
3. $ nova flavor-create 2v-1024M-40G auto 1024 40 2
4. $ nova flavor-key set drive_type=ssd
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.
活用例
33
• OpenStackを操作してFlavorを追加する• Flavor … インスタンスのスペック情報
• OpenStackのクラスタ毎に追加するスペックが異なる• SSD機のクラスタはdisk quotaをゆるめたりとか
• 想定されるオペミス• 同名のフレーバーを作ろうとしてしまう
• extra_specの値を間違えて設定してしまう
Ansibleでワークフロー化
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.
活用例
35
add_flavor.yaml
- hosts: work
user: takutaka
roles:
- nova/flavor-create
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.
活用例
36
vars/flavor-create.json
{
"flavor_name": "2v-1024M-30G",
"cluster_name": “cluster1"
}
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.
活用例
37
vars/flavor-create.json
{
"flavor_name": "2v-1024M-30G",
"cluster_name": “cluster1"
}
add_flavor.yaml
- hosts: work
user: takutaka
roles:
- nova/flavor-create
$ ansible-playbook add_flavor.yaml –i hosts ¥–-extra-vars “@vars/flavor-create.json”
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.
活用例
38
flavor-create/tasks/main.yaml
- name: parse flavor name to machine spec
flavor2spec:
flavor: '{{flavor_name}}'
register: spec
- name: check flavor name
shell: |
nova flavor-list |grep {{flavor-name}}
register: result
failed_when: result not in [0, 1]
- name: create flavor
shell: |
nova flavor-create "{{flavor_name}}" auto ¥
{{spec.mem}} {{spec.disk}} {{spec.vcpu}}
when: result.rc == 1
- name: set extra_spec to flavor
shell: |
nova flavor-key "{{flavor_name}}" set ¥
"{{item.key}}"="{{item.value}}"
with_dict: "{{vars[cluster_name]}}"
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.
活用例
39
Library/flavor2spec.sh
#!/bin/bash
name=`cat $1|awk -F'flavor=' '{print $2}'|awk -F' ' '{print $1}' `
vcpu=`echo $name|awk -F'-' '{print $1}'`
mem=`echo $name|awk -F'-' '{print $2}'`
disk=`echo $name|awk -F'-' '{print $3}'`
echo -n
{"name":"${name}","vcpu":"${vcpu}","mem":"${mem}","disk":"${disk}"
}
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.
活用例
40
flavor-create/tasks/main.yaml
- name: parse flavor name to machine spec
flavor2spec:
flavor: '{{flavor_name}}'
register: spec
- name: check flavor name
shell: |
nova flavor-list |grep {{flavor-name}}
register: result
failed_when: result not in [0, 1]
- name: create flavor
shell: |
nova flavor-create "{{flavor_name}}" auto ¥
{{spec.mem}} {{spec.disk}} {{spec.vcpu}}
when: result.rc == 1
- name: set extra_spec to flavor
shell: |
nova flavor-key "{{flavor_name}}" set ¥
"{{item.key}}"="{{item.value}}"
with_dict: "{{vars[cluster_name]}}"
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.
活用例
41
flavor-create/tasks/main.yaml
- name: parse flavor name to machine spec
flavor2spec:
flavor: '{{flavor_name}}'
register: spec
- name: check flavor name
shell: |
nova flavor-list |grep {{flavor-name}}
register: result
failed_when: result not in [0, 1]
- name: create flavor
shell: |
nova flavor-create "{{flavor_name}}" auto ¥
{{spec.mem}} {{spec.disk}} {{spec.vcpu}}
when: result.rc == 1
- name: set extra_spec to flavor
shell: |
nova flavor-key "{{flavor_name}}" set ¥
"{{item.key}}"="{{item.value}}"
with_dict: "{{vars[cluster_name]}}"
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.
活用例
42
Flavor-create/vars/main.yaml
cluster1:
'quota:disk_write_bytes_sec': 1536000000
'quota:disk_read_bytes_sec': 1536000000
'quota:vif_outbound_average': 64000
'quota:vif_inbound_peak': 64000
'quota:vif_inbound_average': 64000
'quota:vif_outbound_peak': 64000
'drive_type': ssd
cluster2:
'quota:disk_write_bytes_sec': 153600000
'quota:disk_read_bytes_sec': 153600000
'quota:vif_outbound_average': 64000
'quota:vif_inbound_peak': 64000
'quota:vif_inbound_average': 64000
'quota:vif_outbound_peak': 64000
'drive_type': sas
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.
確認項目が減少
43
自動化前確認項目(11項目) 自動化後確認項目(2項目)
フレーバー名 フレーバー名
vcpu クラスタ名
Memory
Disk
quota:disk_write_bytes_sec
quota:vif_outbound_average
quota:vif_inbound_peak
quota:vif_inbound_average
quota:disk_read_bytes_sec
quota:vif_outbound_peak
drive_type
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.44
運用手順も減少1. クラスタadminrcを読み込む
2. Clientをロードする
3. 手順書を元にコマンドを作成する
4. コマンドを実行する
5. 追加するextra_spec分コマンド実行する (7回)
計 11手順
1. フレーバー名とクラスタ名をjsonに書き込む
2. Playbookを実行する
計 2手順
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.45
運用手順も減少1. クラスタadminrcを読み込む
2. Clientをロードする
3. 手順書を元にコマンドを作成する
4. コマンドを実行する
5. 追加するextra_spec分コマンド実行する (7回)
計 11手順
1. フレーバー名とクラスタ名をjsonに書き込む
2. Playbookを実行する
計 2手順
脱オペミス完了!
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.
自動化の懸念
46
• Playbookの信憑性は誰が担保する?• 冪等性の保たれたPlaybookを書く• ベテラン運用者に確認してもらう• 検証環境で試す
• 運用のための知識が身につかないのでは?• 運用の知識を伴わないとそもそもPlaybookが書けない• 空いたリソースで他の問題が解決できたらそれが一番
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.
運用フロー
47
Push & PR
おねがい
Merge
Webhook
pullexecute
cluster
cluster
Playbook開発者
Playbook開発者
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.
自動化の懸念
48
• Playbookの信憑性は誰が担保する?• 冪等性の保たれたPlaybookを書く• ベテラン運用者に確認してもらう• 検証環境で試す
• 運用のための知識が身につかないのでは?• 運用の知識を伴わないとそもそもPlaybookが書けない• Playbookを見れば、「正しいやり方」を身につけられる• 空いたリソースで他の問題が解決できたらそれが一番
Copyright © 2017 Yahoo Japan Corporation. All Rights Reserved.
まとめ
49
• 手動の運用はつらいよ
• 自動化すると改善できることがあるよ
• Ansibleなら、始めやすいしシンプルでおすすめだよ
• 自動化に振り回されないように気をつけよう