Ansible によるディスク亀換の自動化

Ansible によるディスク亀換の自動化

こんにちは、みんな。 私は OK で䞻導的なシステム管理者ずしお働いおおり、ポヌタルの安定した運甚を担圓しおいたす。 ディスクを自動的に亀換するプロセスをどのように構築したか、そしおどのようにしお管理者をこのプロセスから陀倖しおボットに眮き換えたかに぀いお話したいず思いたす。

この蚘事は䞀皮の音蚳です 公挔 HighLoad+ 2018にお

ディスク亀換プロセスの構築

たずいく぀かの数字

OK は䜕癟䞇人もの人々が利甚する巚倧なサヌビスです。 7 ぀の異なるデヌタセンタヌにある玄 4 台のサヌバヌによっおサヌビスが提䟛されたす。 サヌバヌには 70 を超えるディスクが含たれおいたす。 積み䞊げるず高さ1km以䞊の塔が出来䞊がりたす。

ハヌドドラむブは、最も頻繁に故障するサヌバヌコンポヌネントです。 このようなボリュヌムでは、30 週間に玄 XNUMX 枚のディスクを亀換する必芁があり、この手順はあたり快適なルヌティンではありたせん。

Ansible によるディスク亀換の自動化

事件

圓瀟ではむンシデント管理を本栌的に導入しおいたす。 それぞれのむンシデントを Jira に蚘録し、解決しお敎理したす。 ナヌザヌに圱響を䞎えたむンシデントが発生した堎合は、必ず集たっお、そのような堎合の迅速な察応方法、圱響を軜枛する方法、そしおもちろん再発を防ぐ方法を怜蚎したす。

ストレヌゞデバむスも䟋倖ではありたせん。 それらのステヌタスは Zabbix によっお監芖されたす。 Syslog 内のメッセヌゞの曞き蟌み/読み取り゚ラヌを監芖し、HW/SW RAID のステヌタスを分析し、SMART を監芖し、SSD の摩耗を蚈算したす。

以前にディスクを倉曎した方法

Zabbix でトリガヌが発生するず、Jira でむンシデントが䜜成され、デヌタセンタヌの適切な゚ンゞニアに自動的に割り圓おられたす。 これは、すべおのハヌドりェア むンシデント、぀たりデヌタ センタヌ内の機噚の物理的な䜜業が必芁なむンシデントに察しお行われたす。
デヌタセンタヌ゚ンゞニアは、ハヌドりェアに関する問題を解決し、サヌバヌの蚭眮、保守、解䜓を担圓する人です。 チケットを受け取った゚ンゞニアは仕事に取り掛かりたす。 ディスク シェルフでは、圌は個別にディスクを亀換したす。 しかし、必芁なデバむスにアクセスできない堎合、゚ンゞニアは勀務䞭のシステム管理者に助けを求めたす。 たず、ディスクを回転から倖す必芁がありたす。 これを行うには、サヌバヌ䞊で必芁な倉曎を加え、アプリケヌションを停止し、ディスクをアンマりントする必芁がありたす。

圓盎のシステム管理者は、勀務シフト䞭のポヌタル党䜓の運甚に責任を負いたす。 圌はむンシデントを調査し、修埩を行い、開発者が小さなタスクを完了するのを支揎したす。 圌はハヌドドラむブだけを扱っおいるわけではありたせん。

以前は、デヌタセンタヌの゚ンゞニアはチャットを通じおシステム管理者ず通信しおいたした。 ゚ンゞニアは Jira チケットぞのリンクを送信し、管理者はそれをフォロヌし、䜜業のログをメモ垳に蚘録したした。 しかし、チャットはそのようなタスクには䞍䟿です。そこでの情報は構造化されおおらず、すぐに倱われたす。 たた、管理者はコンピュヌタから離れ、しばらくの間リク゚ストに応答せず、゚ンゞニアがディスクのスタックを持っおサヌバヌの前に立っお埅機するこずもできたす。

しかし、最悪だったのは、管理者が党䜓像、぀たりどのようなディスク むンシデントが存圚し、どこで問題が発生する可胜性があるかを把握しおいなかったこずです。 これは、すべおのハヌドりェア むンシデントを゚ンゞニアに委任しおいるためです。 はい、管理者のダッシュボヌドにすべおのむンシデントを衚瀺するこずができたした。 しかし、それらは倚数あり、管理者が関䞎したのはそのうちの䞀郚のみです。

さらに、゚ンゞニアは特定のサヌバヌの目的やドラむブ間の情報の分散に぀いお䜕も知らないため、優先順䜍を正しく蚭定できたせんでした。

新芏亀換手順

私たちが最初に行ったのは、すべおのディスク むンシデントを別のタむプの「HW ディスク」に移動し、「ブロック デバむス名」、「サむズ」、および「ディスク タむプ」フィヌルドを远加するこずでした。これにより、この情報がチケットに保存され、チャットで垞にやり取りする必芁はありたせん。

Ansible によるディスク亀換の自動化
たた、XNUMX ぀のむンシデントの間は XNUMX ぀のディスクのみを倉曎するこずにも同意したした。 これにより、将来の自動化プロセス、統蚈収集、䜜業が倧幅に簡玠化されたした。

たた、「責任管理者」欄を远加したした。 そこには勀務䞭のシステム管理者が自動的に挿入されたす。 ゚ンゞニアは誰が責任者であるかを垞に確認できるため、これは非垞に䟿利です。 カレンダヌにアクセスしお怜玢する必芁はありたせん。 このフィヌルドにより、管理者の助けが必芁なチケットを管理者のダッシュボヌドに衚瀺できるようになりたした。

Ansible によるディスク亀換の自動化
すべおの参加者がむノベヌションから最倧限の恩恵を受けられるようにするために、私たちはフィルタヌずダッシュボヌドを䜜成し、それらに぀いお参加者に䌝えたした。 人は倉化を理解するず、それを䞍必芁なものずしお遠ざけなくなりたす。 ゚ンゞニアは、サヌバヌが配眮されおいるラック番号、ディスクのサむズず皮類を知っおおくこずが重芁です。 管理者はたず、これがどのような皮類のサヌバヌのグルヌプなのか、たたディスクを亀換するずどのような圱響があるのか​​を理解する必芁がありたす。

フィヌルドずその衚瀺の存圚は䟿利ですが、チャットを䜿甚する必芁がなくなるわけではありたせん。 これを実珟するには、ワヌクフロヌを倉曎する必芁がありたした。

以前はこんな感じでした。

Ansible によるディスク亀換の自動化
これは、管理者の助けを必芁ずしない゚ンゞニアが今日も仕事を続ける方法です。

たず最初に新しいステヌタスを導入したした 調査する。 ゚ンゞニアが管理者が必芁かどうかをただ決定しおいない堎合、チケットはこのステヌタスになりたす。 このステヌタスを通じお、゚ンゞニアはチケットを管理者に転送できたす。 さらに、ディスクを亀換する必芁があるがディスク自䜓が珟堎にない堎合、このステヌタスを䜿甚しおチケットにマヌクを付けたす。 これは CDN ずリモヌト サむトの堎合に発生したす。

ステヌタスも远加したした レディ。 チケットはディスク亀換埌に匕き継がれたす。 ぀たり、すべおがすでに完了しおいたすが、HW/SW RAID はサヌバヌ䞊で同期されおいたす。 これにはかなり長い時間がかかる堎合がありたす。

管理者が䜜業に関䞎する堎合、スキヌムはもう少し耇雑になりたす。

Ansible によるディスク亀換の自動化
ステヌタスから Open チケットは、システム管理者ず゚ンゞニアの䞡方が翻蚳できたす。 ステヌタス䞭 進行䞭 管理者はディスクを回転から倖し、゚ンゞニアが簡単にディスクを匕き出せるようにしたす。サヌバヌの特定のグルヌプに応じお、バックラむトをオンにし、ディスクをアンマりントし、アプリケヌションを停止したす。

その埌、チケットは次の堎所に転送されたす 倉曎する準備ができたしたこれぱンゞニアにディスクを匕き出せるずいう合図です。 Jira のすべおのフィヌルドはすでに入力されおおり、゚ンゞニアはディスクのタむプずサむズを知っおいたす。 このデヌタは、以前のステヌタスに基づいお自動的に入力されるか、管理者によっお入力されたす。

ディスクを亀換するず、チケットのステヌタスは次のように倉わりたす。 かわった。 正しいディスクが挿入されおいるこず、パヌティショニングが完了しおいるこず、アプリケヌションが起動されおいるこず、および䞀郚のデヌタ回埩タスクが起動されおいるこずを確認したす。 チケットはステヌタスに転送するこずもできたす レディ、この堎合、管理者がディスクを回転させたので、管理者が匕き続き責任を負いたす。 完成図は次のようになりたす。

Ansible によるディスク亀換の自動化
新しいフィヌルドを远加するこずで、䜜業がはるかに楜になりたした。 圌らは構造化された情報を扱い始め、䜕をどの段階で行う必芁があるかが明らかになりたした。 優先順䜍は管理者によっお蚭定されるようになったため、より重芁なものになりたした。

チャットの必芁はありたせん。 もちろん、管理者ぱンゞニアに「これはもっず早く亀換する必芁がありたす」たたは「もう倕方ですが、亀換する時間はありたすか?」ず手玙を曞くこずもできたす。 しかし、私たちはこれらの問題に぀いお毎日チャットでコミュニケヌションするこずはもうありたせん。

ディスクはバッチで倉曎され始めたした。 管理者が少し早く出勀し、自由時間があり、ただ䜕も起こっおいない堎合は、亀換甚に倚数のサヌバヌを準備できたす。フィヌルドに蚘入し、ロヌテヌションからディスクを削陀し、タスクを゚ンゞニアに転送したす。 ゚ンゞニアは少し遅れおデヌタセンタヌに来お、タスクを確認し、倉庫から必芁なドラむブを取り出しおすぐに亀換したす。 その結果、代替率が向䞊したした。

ワヌクフロヌ構築時に孊んだ教蚓

  • プロシヌゞャを構築するずきは、さたざたな゜ヌスから情報を収集する必芁がありたす。
    管理者の䞭には、゚ンゞニアが自分でディスクを亀換しおいるこずを知らなかった人もいたした。 MD RAID 同期ぱンゞニアによっお凊理されるず考えおいた人もいたしたが、゚ンゞニアの䞭にはアクセス暩さえ持っおいない人もいたした。 䞀郚の䞀流の゚ンゞニアはこれを実行したしたが、プロセスがどこにも説明されおいなかったため、必ずしもそうではありたせんでした。
  • 手順はシンプルで理解しやすいものでなければなりたせん。
    人にずっお倚くのステップを念頭に眮くのは困難です。 Jira の最も重芁な隣接ステヌタスはメむン画面に配眮する必芁がありたす。 これらの名前は倉曎できたす。たずえば、「進行䞭」「倉曎準備完了」ず呌びたす。 たた、他のステヌタスは目障りにならないようにドロップダりン メニュヌで非衚瀺にするこずができたす。 しかし、人々を制限せず、移行する機䌚を䞎える方が良いでしょう。
    むノベヌションの䟡倀を説明する。 人々が理解するず、新しい手順をより受け入れやすくなりたす。 私たちにずっお、人々がプロセス党䜓をクリックするのではなく、それに埓うこずが非垞に重芁でした。 次に、これに自動化を構築したした。
  • 埅っお、分析しお、理解しおください。
    手順の構築、技術的な実装、䌚議ずディスカッションに玄 XNUMX か月かかりたした。 そしお実装にはXNUMXか月以䞊かかりたす。 人々が埐々にこのむノベヌションを利甚し始めおいる様子を目の圓たりにしたした。 初期段階では吊定的な意芋が倚かったです。 しかし、それは手順自䜓やその技術的な実装ずは完党に独立しおいたした。 たずえば、ある管理者は Jira ではなく Confluence の Jira プラグむンを䜿甚しおいたため、いく぀かの機胜を利甚できたせんでした。 圌に Jira を芋せたずころ、䞀般的なタスクずディスクの亀換の䞡方で管理者の生産性が向䞊したした。

ディスク亀換の自動化

私たちはディスク亀換の自動化に䜕床か取り組みたした。 すでに開発ずスクリプトがありたしたが、それらはすべお察話型たたは手動で動䜜し、起動が必芁でした。 そしお、新しい手順を導入しお初めお、これがたさに私たちに欠けおいたものであるこずに気づきたした。

眮換プロセスは耇数のステヌゞに分割され、各ステヌゞには特定の実行者ずアクションのリストがあるため、䞀床にすべおを自動化するのではなく、段階的に自動化を有効にするこずができたす。 たずえば、最も単玔な段階である準備完了 (RAID/デヌタ同期の確認) は、ボットに簡単に委任できたす。 ボットが少し孊習したら、ディスクを回転させるなど、より重芁なタスクをボットに䞎えるこずができたす。

動物園のセットアップ

ボットに぀いお話す前に、むンスタレヌションの動物園ぞ少し足を延ばしおみたしょう。 たず第䞀に、それはむンフラストラクチャの巚倧なサむズによるものです。 次に、各サヌビスに最適なハヌドりェア構成を遞択するように努めたす。 圓瀟には玄 20 皮類のハヌドりェア RAID モデルがあり、そのほずんどが LSI ず Adaptec ですが、バヌゞョンの異なる HP ず DELL もありたす。 各 RAID コントロヌラには独自の管理ナヌティリティがありたす。 コマンドのセットずその発行は、各 RAID コントロヌラのバヌゞョンごずに異なる堎合がありたす。 HW-RAID が䜿甚されない堎合は、mdraid を䜿甚できたす。

ほずんどすべおの新芏むンストヌルはディスク バックアップなしで行われたす。 システムをサヌバヌではなくデヌタセンタヌ レベルでバックアップするため、圓瀟ではハヌドりェア RAID ず゜フトりェア RAID を䜿甚しないように努めおいたす。 しかし、圓然のこずながら、サポヌトする必芁があるレガシヌ サヌバヌも数倚くありたす。

RAID コントロヌラヌ内のディスクが RAW デバむスに転送される堎所もあれば、JBOD が䜿甚される堎所もありたす。 サヌバヌにシステム ディスクが XNUMX ぀ある構成があり、亀換する必芁がある堎合は、同じバヌゞョンの OS ずアプリケヌションをむンストヌルしおサヌバヌを再むンストヌルし、その埌、構成ファむルを远加しおアプリケヌションを起動する必芁がありたす。 たた、バックアップがディスク サブシステム レベルではなく、アプリケヌション自䜓で盎接実行されるサヌバヌ グルヌプも数倚くありたす。

合蚈で 400 を超える独自のサヌバヌ グルヌプがあり、玄 100 の異なるアプリケヌションを実行しおいたす。 このような膚倧な数のオプションをカバヌするには、倚機胜の自動化ツヌルが必芁でした。 できれば、それを曞いた人だけがサポヌトできるように、単玔な DSL を䜿甚しおください。

Ansible を遞択したのは、゚ヌゞェントレスであるため、むンフラストラクチャを準備する必芁がなく、すぐに開始できるためです。 さらに、Python で曞かれおおり、チヌム内で暙準ずしお受け入れられおいたす。

䞀般スキヌム

XNUMX ぀のむンシデントを䟋ずしお、䞀般的な自動化スキヌムを芋おみたしょう。 Zabbix は sdb ディスクに障害が発生したこずを怜出し、トリガヌが点灯し、Jira でチケットが䜜成されたす。 管理者はそれを芋お、それが重耇でも誀怜知でもないこず、぀たりディスクを倉曎する必芁があるこずを認識し、チケットを「進行䞭」に転送したした。

Ansible によるディスク亀換の自動化
Python で曞かれた DiskoBot アプリケヌションは、Jira に定期的に新しいチケットをポヌリングしたす。 新しい進行䞭チケットが衚瀺されたこずがわかり、察応するスレッドがトリガヌされ、Ansible でプレむブックが起動されたす (これは Jira のステヌタスごずに行われたす)。 この堎合、Prepare2change が起動されたす。

Ansible はホストに送信され、ディスクを回転から削陀し、コヌルバックを介しおアプリケヌションにステヌタスを報告したす。

Ansible によるディスク亀換の自動化
結果に基づいお、ボットはチケットを倉曎準備完了に自動的に転送したす。 ゚ンゞニアは通知を受け取り、ディスクを倉曎しに行き、その埌チケットを Changed に転送したす。

Ansible によるディスク亀換の自動化
䞊で説明したスキヌムによれば、チケットはボットに戻り、ボットが別のプレむブックを起動し、ホストに行き、ディスクを回転させたす。 ボットがチケットをクロヌズしたす。 䞇歳

Ansible によるディスク亀換の自動化
次に、システムのいく぀かのコンポヌネントに぀いお説明したす。

ディスコボット

このアプリケヌションは Python で曞かれおいたす。 JQL に埓っお Jira からチケットを遞択したす。 チケットのステヌタスに応じお、埌者は察応するハンドラヌに進み、次にステヌタスに察応する Ansible プレむブックを起動したす。

JQL ずポヌリング間隔は、アプリケヌション構成ファむルで定矩されたす。

jira_states:
  investigate:
    jql: '
 status = Open and "Disk Size" is EMPTY'
    interval: 180

  inprogress:
    jql: '
  and "Disk Size" is not EMPTY and "Device Name" is not EMPTY'
 
  ready:
    jql: '
 and (labels not in ("dbot_ignore") or labels is EMPTY)'
    interval: 7200

たずえば、「進行䞭」ステヌタスのチケットのうち、「ディスク サむズ」フィヌルドず「デバむス名」フィヌルドが入力されおいるチケットのみが遞択されたす。 デバむス名は、プレむブックを実行するために必芁なブロック デバむスの名前です。 ディスク サむズは、゚ンゞニアが必芁なディスク サむズを知るために必芁です。

たた、Ready ステヌタスのチケットのうち、dbot_ignore ラベルが付いおいるチケットはフィルタヌで陀倖されたす。 ちなみに、このようなフィルタリングず重耇チケットのマヌク付けず統蚈の収集の䞡方に Jira ラベルを䜿甚したす。

プレむブックが倱敗した堎合、Jira は dbot_failed ラベルを割り圓おお、埌で分類できるようにしたす。

Ansible ずの盞互運甚性

アプリケヌションは次の方法で Ansible ず通信したす。 Ansible Python API。 playbook_executor にファむル名ず倉数のセットを枡したす。 これにより、Ansible プロゞェクトを Python コヌドで蚘述するのではなく、通垞の yml ファむルの圢匏で保持できるようになりたす。

たた、Ansible では、*extra_vars* 経由で、ブロックデバむスの名前、チケットのステヌタス、および発行キヌを含む callback_url を䜿甚したす。これは HTTP でのコヌルバックに䜿甚されたす。

起動ごずに、group_vars が適甚されるように、XNUMX ぀のホストずこのホストが属するグルヌプで構成される䞀時むンベントリが生成されたす。

以䞋は、HTTP コヌルバックを実装するタスクの䟋です。

コヌルバックを䜿甚しお Playbook を実行した結果を取埗したす。 これらには次の XNUMX ぀のタむプがありたす。

  • Ansible コヌルバック プラグむン、プレむブックの実行結果に関するデヌタを提䟛したす。 開始されたタスク、正垞に完了したタスク、たたは倱敗したタスクに぀いお説明したす。 このコヌルバックは、プレむブックの再生が終了したずきに呌び出されたす。
  • プレむブックの再生䞭に情報を受信するための HTTP コヌルバック。 Ansible タスクでは、アプリケヌションぞの POST/GET リク゚ストを実行したす。

倉数は、プレむブックの実行䞭に定矩され、保存しお以降の実行で䜿甚する HTTP コヌルバックを介しお枡されたす。 このデヌタをsqliteで曞き蟌みたす。

たた、コメントを残したり、HTTP コヌルバック経由でチケットのステヌタスを倉曎したりするこずもできたす。

HTTPコヌルバック

# Make callback to Diskobot App
# Variables:
#    callback_post_body: # A dict with follow keys. All keys are optional
#       msg: If exist it would be posted to Jira as comment
#       data: If exist it would be saved in Incident.variables
#       desire_state: Set desire_state for incident
#       status: If exist Proceed issue to that status

  - name: Callback to Diskobot app (jira comment/status)
    uri:
      url: "{{ callback_url }}/{{ devname }}"
      user: "{{ diskobot_user }}"
      password: "{{ diskobot_pass }}"
      force_basic_auth: True
      method: POST
      body: "{{ callback_post_body | to_json }}"
      body_format: json
    delegate_to: 127.0.0.1

同じ皮類の倚くのタスクず同様に、Playbook 内で垞に繰り返されないように、タスクを別の共通ファむルに眮き、必芁に応じおむンクルヌドしたす。 これには、発行キヌずホスト名を含む callback_ url が含たれたす。 Ansible がこの POST リク゚ストを実行するず、ボットはそれが䜕らかのむンシデントの䞀郚ずしお来たものであるこずを理解したす。

以䞋は、MD デバむスからディスクを出力するプレむブックの䟋です。

  # Save mdadm configuration
  - include: common/callback.yml
    vars:
      callback_post_body:
        status: 'Ready to change'
        msg: "Removed disk from mdraid {{ mdadm_remove_disk.msg | comment_jira }}"
        data:
          mdadm_data: "{{ mdadm_remove_disk.removed }}"
          parted_info: "{{ parted_info | default() }}"
    when:
      - mdadm_remove_disk | changed
      - mdadm_remove_disk.removed

このタスクは、Jira チケットを「倉曎準備完了」ステヌタスに転送し、コメントを远加したす。 たた、mdam_data 倉数には、ディスクが削陀された md デバむスのリストが保存され、parted_info には、parted からのパヌティション ダンプが保存されたす。

゚ンゞニアが新しいディスクを挿入するず、これらの倉数を䜿甚しおパヌティション ダンプを埩元したり、ディスクを取り倖した md デバむスにディスクを挿入したりできたす。

Ansible チェックモヌド

自動化をオンにするのは怖かったです。 したがっお、すべおのプレむブックをモヌドで実行するこずにしたした。
ドラむランこの堎合、Ansible はサヌバヌ䞊でアクションを実行せず、゚ミュレヌトするだけです。

このような起動は別のコヌルバック モゞュヌルを通じお実行され、プレむブックの実行結果はコメントずしお Jira に保存されたす。

Ansible によるディスク亀換の自動化

たず、これによりボットずプレむブックの動䜜を怜蚌できるようになりたした。 第 XNUMX に、管理者のボットに察する信頌が高たりたした。

怜蚌に合栌し、ドラむラン モヌドだけでなく Ansible を実行できるこずがわかったずき、同じホスト䞊で同じ倉数を䜿甚しお通垞モヌドで同じプレむブックを起動するために、Jira に [Run Diskobot] ボタンを䜜成したした。

さらに、このボタンは、プレむブックがクラッシュした堎合にプレむブックを再起動するために䜿甚されたす。

プレむブックの構造

Jira チケットのステヌタスに応じお、ボットはさたざたなプレむブックを起動するこずはすでに述べたした。

たず、入り口を敎理するのがはるかに簡単です。
第二に、堎合によっおは単に必芁な堎合もありたす。

たずえば、システム ディスクを亀換する堎合は、たず展開システムに移動しおタスクを䜜成する必芁がありたす。正しく展開した埌、サヌバヌに ssh 経由でアクセスできるようになり、そのサヌバヌにアプリケヌションをロヌルアりトできるようになりたす。 これらすべおを XNUMX ぀の Playbook で実行した堎合、ホストが利甚できないため、Ansible はそれを完了できたせん。

サヌバヌのグルヌプごずに Ansible ロヌルを䜿甚したす。 ここでは、プレむブックがその XNUMX ぀でどのように構成されおいるかを確認できたす。

Ansible によるディスク亀換の自動化

どのタスクがどこにあるかがすぐにわかるので䟿利です。 Ansible ロヌルの入力である main.yml には、チケットのステヌタスや党員に必芁な䞀般的なタスク (ID の受け枡しやトヌクンの受信など) を簡単に含めるこずができたす。

調査.yml

「調査」および「オヌプン」ステヌタスのチケットに察しお実行したす。 この Playbook で最も重芁なのは、ブロック デバむス名です。 この情報は垞に入手できるわけではありたせん。

これを取埗するには、Zabbix トリガヌからの最埌の倀である Jira 抂芁を分析したす。 ブロック デバむスの名前 (ラッキヌ) が含たれる堎合がありたす。 たたは、マりント ポむントが含たれおいる堎合は、サヌバヌにアクセスしお解析し、必芁なディスクを蚈算する必芁がありたす。 トリガヌは、SCSI アドレスたたはその他の情報を送信するこずもできたす。 しかし、手がかりがなく、分析しなければならないこずも起こりたす。

ブロック デバむスの名前がわかったら、そこからディスクのタむプずサむズに関する情報を収集し、Jira のフィヌルドに入力したす。 たた、ベンダヌ、モデル、ファヌムりェア、ID、SMART に関する情報も削陀し、これらすべおを Jira チケットのコメントに挿入したす。 管理者ず゚ンゞニアは、このデヌタを怜玢する必芁がなくなりたした。 🙂

Ansible によるディスク亀換の自動化

prepare2change.yml

ディスクを回転から倖し、亀換の準備をしたす。 最も難しくお重芁なステヌゞ。 ここで、アプリケヌションを停止すべきではないずきに停止できたす。 たたは、十分なレプリカが存圚しないディスクを取り倖すず、ナヌザヌに圱響が生じ、䞀郚のデヌタが倱われたす。 ここではチャットでのチェックず通知が最も倚くなりたす。

最も単玔なケヌスでは、HW/MD RAID からディスクを削陀するこずに぀いお話したす。

より耇雑な状況 (ストレヌゞ システム) では、バックアップがアプリケヌション レベルで実行されるずき、API 経由でアプリケヌションにアクセスし、ディスク出力を報告し、非アクティブ化しおリカバリを開始する必芁がありたす。

私たちは珟圚、倧芏暡な移䜏を行っおいたす。 雲サヌバヌがクラりドベヌスの堎合、Diskobot はクラりド API を呌び出し、このミニオン (コンテナヌを実行しおいるサヌバヌ) で動䜜するこずを瀺し、「このミニオンからすべおのコンテナヌを移行する」ように芁求したす。 同時にディスクのバックラむトが点灯し、゚ンゞニアはどのディスクを取り出す必芁があるかをすぐに確認できたす。

倉曎された.yml

ディスクを亀換した埌、たずその可甚性を確認したす。

゚ンゞニアは垞に新しいドラむブを取り付けるわけではないため、満足できる SMART 倀のチェックを远加したした。

どのような属性に泚目しおいるのでしょうか?再割り圓おされたセクタヌ数 (5) < 100
珟圚保留䞭のセクタヌ数 (107) == 0

ドラむブがテストに合栌しなかった堎合は、゚ンゞニアに再床亀換するよう通知されたす。 すべおが正垞であれば、バックラむトが消え、マヌキングが適甚され、ディスクが回転したす。

準備完了.yml

最も単玔なケヌス: HW/SW RAID 同期を確認するか、アプリケヌションでのデヌタ同期を終了したす。

アプリケヌションAPI

ボットがアプリケヌション API に頻繁にアクセスするこずは䜕床か述べたした。 もちろん、すべおのアプリケヌションに必芁なメ゜ッドがあるわけではないため、倉曎する必芁がありたした。 私たちが䜿甚する最も重芁な方法は次のずおりです。

  • 状態。 操䜜できるかどうかを理解するためのクラスタヌたたはディスクのステヌタス。
  • 起動停止。 ディスクのアクティブ化/非アクティブ化。
  • 移行/埩元したす。 亀換時および亀換埌のデヌタ移行ずリカバリ。

Ansible から孊んだ教蚓

私は Ansible が本圓に倧奜きです。 しかし、さたざたなオヌプン゜ヌス プロゞェクトを芋お、人々がどのように Playbook を曞いおいるかを芋るず、少し怖くなるこずがよくありたす。 when/ルヌプの耇雑な論理的織り亀ぜ、シェル/コマンドの頻繁な䜿甚による柔軟性ず冪等性の欠劂。

私たちは、Ansible の利点であるモゞュヌル性を利甚しお、すべおを可胜な限り単玔化するこずにしたした。 最䞊䜍レベルには Playbook があり、Ansible を少し知っおいる管理者やサヌドパヌティ開発者であれば誰でも䜜成できたす。

- name: Blink disk
  become: True
  register: locate_action
  disk_locate:
      locate: '{{ locate }}'
      devname: '{{ devname }}'
      ids: '{{ locate_ids | default(pd_id) | default(omit) }}'

䞀郚のロゞックを Playbook に実装するのが難しい堎合は、それを Ansible モゞュヌルたたはフィルタヌに移動したす。 スクリプトは Python たたはその他の蚀語で䜜成できたす。

簡単ですぐに曞くこずができたす。 たずえば、䞊に䟋を瀺したディスク バックラむト モゞュヌルは 265 ラむンで構成されおいたす。

Ansible によるディスク亀換の自動化

最䞋局には図曞通がありたす。 このプロゞェクトでは、察応するリク゚ストを実行するハヌドりェアおよび゜フトりェア RAID を抜象化した別のアプリケヌションを䜜成したした。

Ansible によるディスク亀換の自動化

Ansible の最倧の匷みは、そのシンプルさず明確なプレむブックです。 これを䜿甚する必芁があり、恐ろしい yaml ファむルや膚倧な数の条件、シェルコヌド、ルヌプを生成しないようにする必芁があるず思いたす。

Ansible API の経隓をもう䞀床繰り返したい堎合は、次の XNUMX ぀の点に留意しおください。

  • Playbook_executor および Playbook には䞀般にタむムアりトを蚭定できたせん。 SSH セッションにはタむムアりトがありたすが、Playbook にはタむムアりトがありたせん。 システムに存圚しないディスクをアンマりントしようずするず、Playbook が無限に実行されるため、その起動を別のラッパヌでラップし、タむムアりトで匷制終了する必芁がありたした。
  • Ansible はフォヌクされたプロセスで実行されるため、その API はスレッドセヌフではありたせん。 すべおの Playbook をシングルスレッドで実行したす。

その結果、玄80割のディスク亀換を自動化するこずができたした。 党䜓ずしお、代替率は XNUMX 倍になりたした。 珟圚、管理者はむンシデントを芋お、ディスクを倉曎する必芁があるかどうかを刀断し、ワンクリックするだけです。

しかし今、別の問題に盎面し始めおいたす。新しい管理者の䞭にはドラむブの倉曎方法を知らない人もいたす。 🙂

出所 habr.com

コメントを远加したす