Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
5years-history-of-heteml
Search
Shinya Tsunematsu
November 12, 2013
Technology
2
620
5years-history-of-heteml
運用しているヘテムルでのサービス改善の歴史
Shinya Tsunematsu
November 12, 2013
Tweet
Share
More Decks by Shinya Tsunematsu
See All by Shinya Tsunematsu
GMOペパボでのSREの実践 / SRE Practices of GMO Pepabo, Inc.
tnmt
3
4.4k
ペパボサービスインフラの今までこれから / pepabo infra past and future
tnmt
3
640
知らなかった、時に困るWebサービスのセキュリティ対策 / Where Do We Start With Information Security?
tnmt
19
9.2k
IaaSをいじっている人が PaaSについて考えたこと / Should We Prepare Own PaaS?
tnmt
5
2.1k
成長を支援する “ふりかえり”の技術 / How to lockback using "furik"
tnmt
7
1.5k
こんにちわ福岡 / hello-fukuoka
tnmt
0
1.2k
Inside Nyah & Future - A case of "Private Cloud" using OpenStack -
tnmt
0
240
OpenStackクラスタ間マイグレーション事例 Havana to Mitaka / OpenStack Migration Case (Shift from Havana to Mitaka)
tnmt
1
1.1k
ペパボのプライベートクラウド "Nyah" その後 / Pepabo's PrivateCloud "Nyah" After That
tnmt
8
13k
Other Decks in Technology
See All in Technology
SSMRunbook作成の勘所_20241120
koichiotomo
2
120
Python(PYNQ)がテーマのAMD主催のFPGAコンテストに参加してきた
iotengineer22
0
470
New Relicを活用したSREの最初のステップ / NRUG OKINAWA VOL.3
isaoshimizu
2
580
ノーコードデータ分析ツールで体験する時系列データ分析超入門
negi111111
0
410
インフラとバックエンドとフロントエンドをくまなく調べて遅いアプリを早くした件
tubone24
1
430
誰も全体を知らない ~ ロールの垣根を超えて引き上げる開発生産性 / Boosting Development Productivity Across Roles
kakehashi
1
220
Amazon Personalizeのレコメンドシステム構築、実際何するの?〜大体10分で具体的なイメージをつかむ〜
kniino
1
100
TypeScript、上達の瞬間
sadnessojisan
46
13k
10XにおけるData Contractの導入について: Data Contract事例共有会
10xinc
5
570
強いチームと開発生産性
onk
PRO
33
11k
AWS Lambda のトラブルシュートをしていて思うこと
kazzpapa3
2
170
OCI Security サービス 概要
oracle4engineer
PRO
0
6.5k
Featured
See All Featured
Gamification - CAS2011
davidbonilla
80
5k
Put a Button on it: Removing Barriers to Going Fast.
kastner
59
3.5k
Performance Is Good for Brains [We Love Speed 2024]
tammyeverts
6
410
How to Create Impact in a Changing Tech Landscape [PerfNow 2023]
tammyeverts
47
2.1k
Templates, Plugins, & Blocks: Oh My! Creating the theme that thinks of everything
marktimemedia
26
2.1k
ピンチをチャンスに:未来をつくるプロダクトロードマップ #pmconf2020
aki_iinuma
109
49k
Facilitating Awesome Meetings
lara
50
6.1k
Distributed Sagas: A Protocol for Coordinating Microservices
caitiem20
329
21k
個人開発の失敗を避けるイケてる考え方 / tips for indie hackers
panda_program
93
16k
How to train your dragon (web standard)
notwaldorf
88
5.7k
Ruby is Unlike a Banana
tanoku
97
11k
Designing for humans not robots
tammielis
250
25k
Transcript
2013/11/9 Shinya Tsunematsu @tnmt ͱαʔϏεͷ5ͷาΈ Πϯϑϥվળͷྺ࢙
5ଓ͘αʔϏεͷӡ༻ͬͯ
͘ଓ͘αʔϏεʹ͖ͭ·ͱ͏ ✤ ࢁ͋ΔαʔόؒͰͷඍົͳ༷ࠩ! ✤ ن͕େ͖͍߹ͷมߋͷखؒ! ✤ ΦϯϓϨϛεͷ߹ͷεϖοΫΞοϓʹ͍͍͚ͭͯͳ͍ॊೈੑͷແ ͞! ✤ ϧʔνϯԽ͞Εͨ࡞ۀ͕লྗ͞Ε͍ͯͳ͍͜ͱʹΑΔӡ༻ίετ૿!
✤ Կ͕ى͖͍ͯΔ͔Ѳग़དྷ͍ͯͳ͍αʔϏεϔϧενΣοΫ࣭ͷ ྼԽ
paperboy&co. ϔςϜϧνʔϜ
None
heteml (ϔςϜϧ) ✤ ϩϦϙοϓʂͱฒͿϨϯλϧαʔόͷϥΠϯφοϓ! ✤ 2005ϦϦʔε! ✤ 201310݄ݱࡏαʔό400ऑ! ✤ ৗদ2009͔ΒδϣΠϯ
ٕज़తෛ࠴
ෛ࠴ͱ͍͏ͱωΨςΟϒͳҹʁ ✤ ͔͠͠ඞͣਵ͢ΔͰࣗવͳͷ! ✤ ະવʹ͙ɺൃੜͨ͠߹ʹରॲ͍ͯ͘͠ͷΛ͓Ζ ͔ͦʹ͢ΔͱޙʑࣗͱपΓʹৼΓ͔͔Δ
ΞδΣϯμ ✤ ఏڙ͍ͯ͠ΔαʔϏεͯ͢όʔδϣϯཧԽͰཧ͢Δ! ✤ σϓϩΠαʔόʹର͢ΔมߋπʔϧΛඋɺଐਓԽࡶ͞ Λഉআ! ✤ OSηοτΞοϓΛলྗԽ! ✤ γεςϜߏཧπʔϧΛ༻͍ͯαʔόߏஙͷলྗԽɾ༷Խ
Λߦ͏! ✤ ࢹγεςϜઃఆͷϨϏϡʔɺࢹઃఆͷࣗಈੜ
ͯ͢ΛόʔδϣϯཧԼʹ
ԿΛόʔδϣϯཧ͢Δ͔ ✤ جຊతʹʮͯ͢ʯ
ͱ͍͍͖͑ͳΓશ෦ແཧ ✤ ༏ઌΛ͚ͭΔ! ✤ OSϨΠϠɺηΩϡϦςΟपΓ! ✤ ϛυϧΣΞઃఆ! ✤ cron, ӡ༻εΫϦϓτ!
✤ ࢹιϑτΣΞઃఆ
ΑΓԼͷϨΠϠ͔Βཧ͢Δ ✤ ҙຯͷॏෳΛආ͚ΒΕΔͨΊͦͷ͋ͱͷϝϯςφϯε ੑߴ͘ͳΔ! ✤ ϛυϧΣΞͷηΩϡΞͳઃఆΛܾఆ͢Δ͜ͱ͕༰қ ʹͳΔ! ✤ ҙ֎ͱ͜Ε͕͞Εͯͳ͍έʔε͕ଟ͍
࠷ॳશવཧग़དྷͯͳ͔ͬͨ… ✤ ߏங࣌ظʹΑͬͯઃఆ͕ҧ͏! ✤ ͋Γ·ͤΜ͔ʁ! ✤ iptablesͱtcp_wrapperͰಉ͡ϧʔϧॻ͍ͯΔ! ✤ ϦϓϨΠεΛܦͯɺଘࡏ͍ͯ͠ͳ͍ϗετ͔ ΒͷڐՄઃఆ
όʔδϣϯཧԽʹೖΕ༷Խ ✤ Ұ୴ݱߦಈ͍͍ͯΔαʔόϕʔεͰͱΓ͋͑ͣϦϙ δτϦʹಥͬࠐΉ! ✤ ·͍͠ઃఆͷݟͦ͠ͷޙཧ͢Δ! ✤ มߋτϨʔεՄೳʹͳΔͨΊޙͰݟฦͤΔ
ΦϖϨʔγϣϯπʔϧͷݟ͠
ෳαʔόʹมߋΛՃ͑Δखஈ ✤ όʔδϣϯཧ͕ग़དྷͨΒͦΕΛల։͢Δज़͕ཁΔ! ✤ ͕૿͑Δͱมߋͷख͕ؒେม! ✤ ख͕ؒ૿͑Δͱαʔόؒͷဃ͕૿͑Δѱ॥
sshϧʔϓظ ✤ ຖճଧͭͷ໘ɺઈରϛε͢Δ! ✤ 1ຖ࣮ߦͰγʔέϯγϟϧɺ͕͔͔࣌ؒΔ for host in web{1..100}.heteml.lan;! do!
echo ${host}! ssh ${host} ‘perl -pi -e “s/foo/var/g” /path/to/file’! done
Archerظ ✤ PerlͷσϓϩΠπʔϧ! ✤ YAMLͰఆٛ͞Εͨઃఆʹͱ͖ͮγΣϧίϚϯυ ϑΝΠϧͷσϓϩΠ͕ߦ͑Δ
Archerظ ✤ Pluggable! ✤ Archer::Plugin::RoleLoader! ✤ roles.yaml! ✤ ࢦఆͨ͠ϩʔϧʹ! ✤
ίϚϯυ࣮ߦ! ✤ ϑΝΠϧσϓϩΠ …! ! web:! - web001.heteml.lan! - web002.heteml.lan! mail:! - mail001.heteml.lan! - mail002.heteml.lan! - mail003.heteml.lan! ! …
Archerظ ✤ େྔϗετʹͳΔͱίϚϯυ࣮ߦ݁Ռͷ֬ೝ͕͠ΜͲ ͍! ✤ جຊతʹઃఆϑΝΠϧʹॻ͍ͨ༰Λ࣮ߦ͢ΔͨΊɺ ࡉ͔ͳಈత࡞ۀͷ༻్ʹ͙ͦΘͳ͔ͬͨ! ✤ ಛʹ2ͭΊͷཧ༝͕େมɺಥൃ͢ΔλεΫʹରԠ͖͠ Εͳ͍
ࣗ࡞πʔϧheteloyظ ✤ ༻్ಛԽʢίϚϯυ࣮ߦɺϑΝΠϧσϓϩΠʣ! ✤ ࣗͷPerlπʔϧ! ✤ ʮϔςϜϧʯʹʮσϓϩΠʯ! ✤ σϓϩΠपΓޙड़͢ΔPuppetͱͷੑΛߴΊͨ! ✤
PuppetͷϦϙδτϦͰཧ͞Ε͍ͯΔϑΝΠϧΛ͠ ͘͢ͳ͍ͬͯΔ
ࣗ࡞πʔϧheteloyظ ✤ /var/lib/puppet/data/ ͕ PuppetϦϙδτϦͱͯ͋͠Δ! ✤ /var/lib/puppet/data/modules/web/files/etc/httpd/httpd.conf Λ! ✤ webϩʔϧʢલड़ͷroles.yaml)
ͷϗετʹ͠! ✤ Apache ͷ configtest ͯ͠ OK ͳ߹͚ͩ restart ɺNG ͳ߹ϑΝΠϧϩʔϧόο Ϋ sudo heteloy.pl --role web \! --dist /etc/httpd/httpd.conf \! --mode 644 \! --exec ‘service httpd configtest’ \! --exec ‘service httpd restart’!
ࣗ࡞πʔϧheteloyظ ✤ Α࣮͘ߦ͢ΔλεΫλεΫΛyamlܗࣜʹdump! ✤ Ҏ߱ͦͷyamlΛࢦఆͯ͠ಉ͡ॲཧΛ࣮ߦՄೳ sudo heteloy.pl --role web \!
! --dist /etc/httpd/httpd.conf \! --mode 644 \! --exec ‘service httpd configtest’ \! --exec ‘service httpd restart’ \! --configdump > httpd_task.yaml! sudo heteloy.pl --configloada httpd_task.yaml!
ࣗ࡞πʔϧheteloyظ ✤ ڥґଘΛڐ༰͠൚༻ੑΛࣺͯͨ! ✤ ͷͰެ։ͯ͠ͳ͍Ͱ͢…! ✤ ʑͷӡ༻ͷதͰߦ͏ཻখ͍͕͞εϐʔυΛٻΊ ΒΕΔ࡞ۀʹ͍͍ͯΔ! ✤ PuppetͰͷߏཧ࣠ʹͦΕΛαϙʔτ͢Δҝͷ
πʔϧ͕͋Δͱศར
OSηοτΞοϓࣗಈԽ
৽͍͠ϕϯμͷαʔόΛߪೖ ✤ εϖοΫΞοϓ͕ओ؟! ✤ औΓճ͕͍͢͠͠Α͏IPMIΛࡌ͠ɺԕִʢΦ ϑΟεʣ͔Βͷ࡞ۀ͕ߦ͑ΔΑ͏ʹͨ͠
OSͷΠϯετʔϧDCͤͩͬͨ ✤ IPMI͕͑ΔΑ͏ʹͳΓɺࣗͨͪͰΦϖϨʔγϣϯ Մೳʹ! ✤ ͱ͍͑ɺҰͣͭΠϯετʔϧ͢Δͷେมख͕ؒ ͔͔Δ
Cobbler ✤ http://cobbler.github.com! ✤ ωοτϫʔΫϒʔτͰOSΛΠϯετʔϧ͢Δࡍʹඞཁ ͳίϯϙʔωϯτ͕ͦΖ͍ͬͯΔ! ✤ ݸผͷαʔόͷઃఆใΛதԝͰूதཧՄೳ! ✤ RedHat
Enterprise Linux͓ΑͼͦͷΫϩʔϯOSͰར ༻Մೳ
Cobbler ✤ ૉͷPXEϒʔτͰؤுΕͳ͘ͳ͍͕! ✤ Cobblerdhcpd, pxe, tftp, httpdͳͲΛݸผʹηοτ Ξοϓ͢Δख͕ؒେল͚Δ! ✤
ूதཧ͕༏लɺαʔόઃఆใ (system) ͰIPॏෳ͕ ͋ΔͱΤϥʔʹͳΔͳͲ
CobblerͱPuppetͷॅΈ͚ ✤ CobblerςϯϓϨʔτεχϖοτ͕͑Δ! ✤ ͜ΕΒΛར༻ͯ͠ɺෳϩʔϧ͋ΔαʔόΛΠϯετʔ ϧྃޙଈαʔϏεೖͱ͍ͬͨ͜ͱՄೳͩΖ͏! ✤ kickstartϑΝΠϧϝϯς͠ʹ͍͘! ✤ OSΠϯετʔϧ͑͞ग़དྷΕޙPuppetʹͤΔ
Cobbler ✤ ϗετՃ࣌ɺ͜ͷॲཧޙαʔόΛىಈ͢ΔͱOS ͕Πϯετʔϧ͞ΕΔ ʢωοτϫʔΫ෦ׂѪʣ cobbler system add \! --name
web001.heteml.lan \! --hostname web001.heteml.lan \! --profile CentOS6.4-x86_64 \! --kopts “ksdevide=XX:XX:XX:XX:XX syslog=192.168.X.X” \! --kickstart /var/lib/cobbler/kickstarts/CentOS6-base.ks! ! cobbler sync
γεςϜߏཧπʔϧͷಋೖ
ಋೖͷඞཁੑ ✤ αʔόಋೖϖʔε͕Ճ! ✤ ߏஙͷख͕ؒϘτϧωοΫʹ
طଘαʔϏεͷPuppetಋೖ ✤ खॱॻΛಡΈղ͘! ✤ ඞཁͳ߹खॱॻͷཧ! ✤ ͖ͪΜͱඥղ͖ɺߏཧπʔϧͷઃఆϑΝΠϧʹམͱ ͨ࣌͠ʹͦΕ͕αʔόͷ”༷”ͱͳΔ! ✤ Ұ࣌ظΛࢧ͑ͨൿͷλϨܾͯ͠ѱͷΈͰͳ͍!
✤ ݱ࣮ੈքͷͦΕͱҟͳΔͷ֧፩ʢ͔͘Μʣ͠ͳ͍ҝ
ݕূ͢Δڥ ✤ ࢼͯ͠ഁغͯ͠Γ͕͠ग़དྷΔVMϕʔεͰߦ͏ͷ ͕ΓΓ͍͢! ✤ ϔςϜϧͰϖύϘࣾڥͷKVMཧπʔϧ MaglicaΛͬͯखܰʹVM࡞ɺഁغΛߦͳͬͨ! ✤ ݱࡏͳΒVagrantͳͲ͕͋ΔͨΊͦΕΛར༻͢Δͱ༗ ༻ͦ͏
·ͣ৽نՃϗετ͔Βಋೖ ✤ ৽نϗετطଘαʔόͱͷ͕͠ΒΈ͕ͳ͍! ✤ Ѳ͍ͯ͠ͳ͍༷࿙ΕͳͲ͕͋ΔՄೳੑ͋Γطଘ αʔό৻ॏʹߦ͏ඞཁ͕͋Δ! ✤ طଘϗετͷద༻noop(dry-run)࣮ߦ͠ɺࠩ֬ ೝɺඞཁ͕͋Εमਖ਼ͳͲߦ͍ͭͭॱ࣍ಋೖΛਐΊ ͍ͯΔ
ಋೖ͕ྃͨ͠ޙଓ͘ ✤ ߏཧπʔϧͷهड़ํࣜɺϕετϓϥΫςΟε͕ม ΘΔ͜ͱɺӡ༻͍ͯ͘͠தͰෆཁͳهࡌͳͲग़ͯ ͘Δ! ✤ ࣺͯΔ༐ؾ! ✤ ఆظతʹݟ͠Λ͢Δඞཁ͕͋Δ
ಋೖ͕ྃͨ͠ޙଓ͘ ✤ ඞཁͳઃఆόʔδϣϯཧ͞Ε͍ͯΔ! ✤ ༷ͷมߋݟ͠ઃఆϑΝΠϧϕʔεͰٞ͢Δ! ✤ ϖύϘͰGH:EΛར༻͍ͯ͠ΔͨΊɺPull Requestϕʔ εͰ্هΛߦͳ͍ͬͯΔ! ✤
ϨϏϡʔͯ͠Β͑Δͱਫ਼͕͕͋Δ! ✤ ͋ͱ҆৺͢Δ
ࢹγεςϜͷӡ༻վળ
ࢹ͕ἧͬͯͳ͍ ✤ ࢹ߲͕ࡏΔͷͱແ͍ͷ͕͋Δ! ✤ ϗετΛՃ͢Δ͝ͱʹखՃ! ✤ ͦͦࢹ͞Ε͍ͯͳ͍ϗετ…ʁ
αʔόͷҰཡ࣋ͬͯΔ ✤ લड़ͷroles.yaml! ✤ ͜͜ʹཧ͍ͯ͠Δαʔόཏ͞Ε͍ͯΔ
ࢹઃఆͷࣗಈੜ ✤ Nagios! ✤ munin! ✤ roles.yaml Λͱʹ conf Λࣗಈੜ͢Δ!
✤ શαʔόڞ௨ͷࢹ (σΟεΫI/O, L/A)! ✤ ϩʔϧݻ༗ͷࢹ (webͩͬͨΒHTTPૄ௨)! ✤ ϗετݻ༗ͷઃఆ (ಛఆαʔόαʔό্Ͱύϥϝʔλ্ॻ͖ʣ
มߋ࣌ ✤ طଘͷࢹγεςϜʢखಈՃʣͱ৽ࢹγεςϜʢઃ ఆࣗಈੜʣΛฒߦͯ͠Քಇͤ͞Δ! ✤ Nagios৽ࢹγεςϜΞϥʔτඈ͞ͳ͍! ✤ ेʹ֬ೝ͔ͯ͠Β͍͑ͰΓସ͑
ৼΓฦͬͯ
ྺ࢙͕͍ͷͰτϨϯυมΘΔ ✤ Puppetmaster agentܕͰͬͯΔ͚Ͳɺ࠷ۙελ ϯυΞϩϯܕ͕ྲྀߦͬͯΔʢςετۦಈΠϯϑϥߏஙʣ ✤ SerfͳͲʹΑΔࣗతʢಈతʣͳϊʔυՃɾઃఆ ՃͳͲ! ✤ ͳͲͳͲ
Δ͔͠ͳ͍ ✤ WebͷαʔϏεͳݶΓ͕ͳ͍ɺӡ༻ʹऴΘΓ͕ ͳ͍! ✤ ͚Ͳޮతʹɺָ͘͢͠Δ͜ͱग़དྷΔ! ✤ Ұ൪ϘτϧωοΫʢࡶɺ͕͔͔࣌ؒΔʣ࡞ۀ͔Βૣ ΊʹऔΓΉ! ✤
ಓʹΔ
ྫ ✤ ࠷ۙϝϯς͕ଟ͍! ✤ ରϗετ͕ҧ͏͚ͩͰखॱ͍ಓ͕ฉ͘! ✤ खॱॻੜʢςϯϓϨʔτԽʣ͠Α͏ʂ
खॱΛςϯϓϨʔτԽ export OLDHOST=<%= @config['src1_hostname'] %>! export NEWHOST=<%= @config['dst_lan_ip'] %>! rsync
-rlptDv /data/backup/heteml/$OLDHOST/path/from/ $NEWHOST::data_to/ src1_hostname : web001! src1_lan_ip : 192.168.1.10! ! dst_hostname : web002! dst_lan_ip : 192.168.1.11!
खॱΛςϯϓϨʔτԽ genecon -t README.md -c config.yaml > web001maintenance.md export OLDHOST=web001!
export NEWHOST=192.168.1.11! rsync -rlptDv /data/backup/heteml/$OLDHOST/path/from/ $NEWHOST::data_to/ ✤ genecon https://github.com/glidenote/genecon
͋Δఔͷڳඞཁ ✤ ৽͍͠ͷͷಋೖԿ͔ͷ৽༐ؾ͕ཁΔ! ✤ ͰΔ࣌ʹΒͳ͍ͱ͍͚ͳ͍! ✤ ཪ͚Ͱ͋Δ֬ೝςετͳͲͰཪ͚Λͯ҆͠৺ ͢Δ
ࠓճͷ༰ɺ͞Βʹৄ͍͠༰ ✤ WEB+DB PRESS Vol.75! ✤ ʙෳࡶੑͷ૿େͱڥͷมԽʹରԠ͢Δʙ ܧଓతWebαʔϏεվ ળΨΠυ! ✤
ΞϓϦɺνʔϜϏϧσΟϯάͷվળͳͲଞͷτϐοΫ߹Θͤͯࡌͬ ͯ·͢
Ұॹʹಇ͘ϝϯόʔΛืू͍ͯ͠· ͢ ✤ http://www.paperboy.co.jp/recruit/engineer_career/! ✤ ϔςϜϧνʔϜͷΠϯϑϥΤϯδχΞืूதͰ͢
͝੩ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠