200 行のむンフラストラクチャ コヌドのテストから孊んだこず

200 行のむンフラストラクチャ コヌドのテストから孊んだこず

アプロヌチ IaC (コヌドずしおのむンフラストラクチャ) は、リポゞトリに保存されおいるコヌドだけでなく、このコヌドを取り巻く人々やプロセスからも構成されたす。゜フトりェア開発からむンフラ管理、蚘述たでのアプロヌチを再利甚するこずは可胜ですか?この考えを念頭に眮いお蚘事を読むず良いでしょう。

英語版

これは私の蚘録です 公挔 Ма DevopsConf 2019-05-28.

スラむドずビデオ

bash の歎史ずしおのむンフラストラクチャ

200 行のむンフラストラクチャ コヌドのテストから孊んだこず

あなたが新しいプロゞェクトに来お、圌らがあなたにこう蚀ったずしたす。 コヌドずしおのむンフラストラクチャ」。実際に刀明したのは bash の歎史ずしおのむンフラストラクチャ たたはたずえば bash 履歎ずしおのドキュメント。これは非垞に珟実的な状況であり、たずえば、同様のケヌスがデニス・リセンコ氏の講挔で説明されたした。 むンフラ党䜓を亀換しおぐっすり眠り始める方法ず圌は、bash の歎史からプロゞェクトの䞀貫したむンフラストラクチャをどのようにしお取埗したかに぀いお語った。

ある皋床の願望を蟌めお、こう蚀えたす。 bash の歎史ずしおのむンフラストラクチャ これはコヌドのようなものです:

  1. 再珟性: bash 履歎を取埗し、そこからコマンドを実行するず、出力ずしお動䜜する構成を取埗できる堎合がありたす。
  2. バヌゞョン管理: 誰が入っおきお䜕をしたかはわかりたすが、これが出口で機胜する構成に぀ながるかどうかは事実ではありたせん。
  3. ОстПрОя: 誰が䜕をしたかの物語。ただし、サヌバヌを倱った堎合は䜿甚できなくなりたす。

䜕をするか

コヌドずしおのむンフラストラクチャ

200 行のむンフラストラクチャ コヌドのテストから孊んだこず

こんな奇劙なケヌスでも、 bash の歎史ずしおのむンフラストラクチャ 耳を持っお匕っ匵るこずができたす コヌドずしおのむンフラストラクチャしかし、叀き良き LAMP サヌバヌよりも耇雑なこずを実行したい堎合は、このコヌドを䜕らかの方法で倉曎、倉曎、改善する必芁があるずいう結論に達したす。次に、これらの間の類䌌点を怜蚎したいず思いたす。 コヌドずしおのむンフラストラクチャ そしお゜フトりェア開発。

ドラむ。

200 行のむンフラストラクチャ コヌドのテストから孊んだこず

ストレヌゞ システム開発プロゞェクトにはサブタスクがありたした。 定期的にSDSを構成する: 新しいリリヌスをリリヌスしおいたす。さらなるテストのためにロヌルアりトする必芁がありたす。タスクは非垞に簡単です。

  • ここにsshでログむンしおコマンドを実行したす。
  • そこにファむルをコピヌしたす。
  • ここで蚭定を修正したす。
  • そこでサヌビスを開始したす
  • ...
  • 利益

説明したロゞックに぀いおは、特にプロゞェクトが始たったばかりの初期段階では、bash で十分です。これ bashを䜿うのは悪くないしかし、時間が経぀に぀れお、䌌たような、しかし少し異なるものを展開するずいうリク゚ストが発生したす。最初に思い浮かぶのはコピヌペヌストです。そしお今、ほが同じこずを行う非垞によく䌌た 2 ぀のスクリプトがすでに存圚しおいたす。時間が経぀に぀れお、スクリプトの数が増加し、むンストヌルを展開するには、異なるスクリプト間で同期する必芁がある特定のビゞネス ロゞックがあり、これが非垞に耇雑であるずいう事実に盎面したした。

200 行のむンフラストラクチャ コヌドのテストから孊んだこず

D.R.Y. のような習慣があるこずが刀明したした。 同じこずを繰り返さないでください。アむデアは、既存のコヌドを再利甚するこずです。簡単そうに聞こえたすが、私たちはすぐにこれにたどり着きたせんでした。私たちの堎合、それは構成をスクリプトから分離するずいう平凡なアむデアでした。それらの。むンストヌルを個別に展開し、個別に構成する方法のビゞネス ロゞック。

固䜓。 CFM甹

200 行のむンフラストラクチャ コヌドのテストから孊んだこず

時間が経぀に぀れおプロゞェクトは成長し、 自然な継続 Ansibleの登堎でした。この登堎の䞻な理由は、チヌムに専門知識があり、bash が耇雑なロゞック向けに蚭蚈されおいないこずです。 Ansible には耇雑なロゞックも含たれるようになりたした。耇雑なロゞックが混乱に陥るのを防ぐために、゜フトりェア開発でコヌドを敎理するための原則がありたす 固䜓。 たた、䟋えば、グリゎリヌ・ペトロフは、「ITスペシャリストにはなぜ個人ブランドが必芁なのか」ずいうレポヌトの䞭で、゜フトりェア開発においお、人は䜕らかの瀟䌚的゚ンティティず連携しやすくなるように蚭蚈されおいるずいう疑問を提起した。オブゞェクトです。これら 2 ぀のアむデアを組み合わせお開発を続けるず、次のこずもできるこずに気づくでしょう。 固䜓。 将来、このロゞックの保守ず倉曎を容易にするためです。

単䞀責任の原則

200 行のむンフラストラクチャ コヌドのテストから孊んだこず

各クラスは 1 ぀のタスクだけを実行したす。

コヌドを混ぜ合わせお、䞀枚岩の神聖なスパゲッティ モンスタヌを䜜成する必芁はありたせん。むンフラストラクチャは単玔なレンガで構成されおいる必芁がありたす。 Ansible プレむブックを小さな郚分に分割し、Ansible ロヌルを読み取るず、メンテナンスが容易になるこずがわかりたした。

オヌプンクロヌズの原則

200 行のむンフラストラクチャ コヌドのテストから孊んだこず

オヌプン/クロヌズの原則。

  • 拡匵にオヌプン: 新しい゚ンティティ タむプを䜜成するこずで゚ンティティの動䜜を拡匵できるこずを意味したす。
  • 倉曎は受け付けおいたせん: ゚ンティティの動䜜を拡匵した結果、それらの゚ンティティを䜿甚するコヌドに倉曎を加える必芁はありたせん。

圓初、テスト むンフラストラクチャを仮想マシンにデプロむしおいたしたが、デプロむのビゞネス ロゞックが実装ずは分離されおいたため、問題なくベアメタルぞのロヌルアりトを远加したした。

リスコフ眮換原理

200 行のむンフラストラクチャ コヌドのテストから孊んだこず

バヌバラ・リスコフの眮換原理。プログラム内のオブゞェクトは、プログラムの正しい実行を倉曎するこずなく、そのサブタむプのむンスタンスず眮き換え可胜でなければなりたせん。

もっず広く芋るず、それは特定のプロゞェクトに適甚できる機胜ではありたせん。 固䜓。、これは䞀般に CFM に関するもので、たずえば、別のプロゞェクトでは、さたざたな Java、アプリケヌション サヌバヌ、デヌタベヌス、OS などの䞊にボックス化された Java アプリケヌションをデプロむする必芁がありたす。この䟋を䜿っお、さらに原理を考えおいきたす 固䜓。

私たちの堎合、imbjava たたは oraclejava ロヌルをむンストヌルしおいれば、Java バむナリ実行可胜ファむルが存圚するずいう合意がむンフラストラクチャ チヌム内にありたす。これが必芁な理由は、䞊流の圹割はこの動䜜に䟝存しおおり、Java を期埅しおいたす。同時に、これにより、アプリケヌションのデプロむロゞックを倉曎せずに、ある Java 実装/バヌゞョンを別の実装/バヌゞョンに眮き換えるこずができたす。

ここでの問題は、これを Ansible で実装するこずが䞍可胜であるずいう事実にあり、その結果、チヌム内でいく぀かの合意が生じるこずになりたす。

むンタヌフェヌス分離の原則

200 行のむンフラストラクチャ コヌドのテストから孊んだこず

むンタヌフェむス分離の原則: 「倚くのクラむアント固有のむンタヌフェむスは、1 ぀の汎甚むンタヌフェむスよりも優れおいたす。

圓初、アプリケヌションのデプロむメントのすべおの可倉性を 443 ぀の Ansible プレむブックにたずめようずしたしたが、サポヌトするのが困難でした。たた、倖郚むンタヌフェむスを指定した堎合 (クラむアントはポヌト XNUMX を期埅したす)、むンフラストラクチャを個別のプレむブックから組み立おるこずができたす。特定の実装甚のブリック。

䟝存関係逆転の原則

200 行のむンフラストラクチャ コヌドのテストから孊んだこず

䟝存関係逆転の原理。より高いレベルのモゞュヌルは、より䜎いレベルのモゞュヌルに䟝存しないでください。どちらのタむプのモゞュヌルも抜象化に䟝存する必芁がありたす。抜象化は詳现に䟝存すべきではありたせん。詳现は抜象化に䟝存する必芁がありたす。

ここでの䟋はアンチパタヌンに基づいおいたす。

  1. 顧客の 1 人はプラむベヌト クラりドを持っおいたした。
  2. クラりド内の仮想マシンを泚文したした。
  3. ただし、クラりドの性質により、アプリケヌションのデプロむは VM がどのハむパヌバむザヌ䞊にあるかに関連付けられおいたした。

それらの。高レベルのアプリケヌション展開ロゞックは䟝存関係を䌎っおハむパヌバむザヌの䞋䜍レベルに流れたため、このロゞックを再利甚するずきに問題が発生したした。 このようにしないでください。

盞互䜜甚

200 行のむンフラストラクチャ コヌドのテストから孊んだこず

Infrastructure as Code は、コヌドだけではなく、コヌドず人々の関係、むンフラストラクチャ開発者間の察話に぀いおも意味したす。

バス係数

200 行のむンフラストラクチャ コヌドのテストから孊んだこず

プロゞェクトに Vasya が含たれおいるず仮定したしょう。 Vasya はむンフラストラクチャに぀いおすべおを知っおいたす。Vasya が突然消えたらどうなりたすか?圌はバスに蜢かれる可胜性があるので、これは非垞に珟実的な状況です。しばしばそれは起こりたす。これが発生し、コヌド、その構造、動䜜方法、倖芳、パスワヌドに関する知識がチヌム間で共有されおいない堎合、倚くの䞍愉快な状況に遭遇する可胜性がありたす。これらのリスクを最小限に抑え、チヌム内に知識を分散するには、さたざたなアプロヌチを䜿甚できたす。

ペアデボプシング

200 行のむンフラストラクチャ コヌドのテストから孊んだこず

それはそうではありたせん 冗談ずしお、管理者がビヌルを飲み、パスワヌドを倉曎し、ペアプログラミングの類䌌物をしたずいうこずです。それらの。 2 人の゚ンゞニアが 1 台のコンピュヌタヌ、1 台のキヌボヌドの前に座り、サヌバヌのセットアップ、Ansible ロヌルの䜜成など、むンフラストラクチャのセットアップを䞀緒に開始したす。聞こえはいいですが、私たちにはうたくいきたせんでした。しかし、この実践の特殊なケヌスでは機胜したした。新しい埓業員が来お、指導者が圌ず䞀緒に実際の仕事に取り組み、働き、知識を䌝えたす。

もう 1 ぀の特殊なケヌスは、むンシデント コヌルです。問題が発生するず、圓盎者ず関係者のグルヌプが集たり、リヌダヌが 1 人任呜され、画面を共有しお思考の流れを発蚀したす。他の参加者はリヌダヌの考えに埓い、コン゜ヌルからトリックを芗き芋し、ログの䞀行を芋逃しおいないか確認し、システムに぀いお新しいこずを孊びたす。このアプロヌチは倚くの堎合うたくいきたした。

コヌドレビュヌ

200 行のむンフラストラクチャ コヌドのテストから孊んだこず

䞻芳的には、コヌド レビュヌを䜿甚しおむンフラストラクチャずその仕組みに関する知識を広める方が効果的でした。

  • むンフラストラクチャはリポゞトリ内のコヌドによっお蚘述されたす。
  • 倉曎は別のブランチで発生したす。
  • マヌゞ リク゚スト䞭に、むンフラストラクチャ内の倉曎の差分を確認できたす。

ここでのハむラむトは、レビュヌ担圓者がスケゞュヌルに埓っお 1 人ず぀遞ばれたこずです。ある皋床の確率で、新しいむンフラストラクチャに䟵入するこずになりたす。

コヌドスタむル

200 行のむンフラストラクチャ コヌドのテストから孊んだこず

時間が経぀に぀れお、レビュヌ䞭に口論が起こり始めたした。レビュアヌは独自のスタむルを持っおおり、レビュアヌのロヌテヌションにより、スペヌス 2 ぀たたは 4 ぀、キャメルケヌスたたはスネヌクケヌスなど、さたざたなスタむルがスタックされたした。これをすぐに実装するこずはできたせんでした。

  • 最初のアむデアは、リンタヌの䜿甚を掚奚するこずでした。結局のずころ、誰もが゚ンゞニアであり、誰もが賢いのです。でも゚ディタやOSが違うず䞍䟿
  • これは、問題のあるコミットごずに Slack に曞き蟌み、リンタヌ出力を添付するボットに進化したした。しかし、ほずんどの堎合、もっず重芁なこずがあるため、コヌドは未修正のたたでした。

グリヌンビルドマスタヌ

200 行のむンフラストラクチャ コヌドのテストから孊んだこず

時間が経ち、特定のテストに合栌しないコミットはマスタヌに蚱可されないずいう結論に達したした。出来䞊がり私たちは、゜フトりェア開発で長幎にわたっお実践されおきた Green Build Master を発明したした。

  • 開発は別のブランチで進行䞭です。
  • このスレッドではテストが実行されおいたす。
  • テストが倱敗するず、コヌドはマスタヌに取り蟌たれたせん。

この決断を䞋すのは非垞に苊痛でした。なぜなら...倚くの論争を匕き起こしたしたが、それだけの䟡倀はありたした、なぜなら...レビュヌでは、スタむルの違いなしに合䜵のリク゚ストが届くようになり、時間が経぀に぀れお、問題のある領域の数は枛り始めたした。

IaC テスト

200 行のむンフラストラクチャ コヌドのテストから孊んだこず

スタむルのチェックに加えお、たずえば、むンフラストラクチャが実際にデプロむできるかどうかをチェックするために、他のこずを䜿甚するこずもできたす。たたは、むンフラストラクチャの倉曎によっお損倱が発生しないこずを確認したす。なぜこれが必芁なのでしょうか?この質問は耇雑で哲孊的なものです。Powershell 䞊に䜕らかの理由で境界条件をチェックしないオヌトスケヌラヌがあった => 必芁以䞊の VM が䜜成された => クラむアントが蚈画より倚くの費甚を費やした、ずいうストヌリヌで答える方が良いでしょう。これはあたり奜たしいこずではありたせんが、早い段階でこの゚ラヌを怜出する可胜性は十分にありたす。

なぜ耇雑なむンフラをさらに耇雑にするのかず疑問に思う人もいるかもしれたせん。むンフラストラクチャのテストは、コヌドの堎合ず同様、単玔化ではなく、むンフラストラクチャがどのように機胜するかを知るこずが目的です。

IaC テスト ピラミッド

200 行のむンフラストラクチャ コヌドのテストから孊んだこず

IaC テスト: 静的解析

むンフラストラクチャ党䜓を䞀床にデプロむしお動䜜を確認するず、非垞に時間がかかり、時間がかかるこずが刀明する堎合がありたす。したがっお、基本はすぐに機胜し、量が倚く、原始的な郚分を倚くカバヌするものでなければなりたせん。

バッシュは難しい

簡単な䟋を芋おみたしょう。珟圚のディレクトリ内のすべおのファむルを遞択し、別の堎所にコピヌしたす。最初に思い浮かぶのは:

for i in * ; do 
    cp $i /some/path/$i.bak
done

ファむル名にスペヌスが含たれおいる堎合はどうなりたすか?そうですね、私たちは賢いので、匕甚笊の䜿い方を知っおいたす。

for i in * ; do cp "$i" "/some/path/$i.bak" ; done

よくやったいいえディレクトリに䜕もない堎合はどうなるでしょうか。グロビングは機胜したせん。

find . -type f -exec mv -v {} dst/{}.bak ;

さお、うたくいきたしたかいいえ... ファむル名に䜕が含たれるかを忘れたした n.

touch x
mv x  "$(printf "foonbar")"
find . -type f -print0 | xargs -0 mv -t /path/to/target-dir

静的解析ツヌル

前のステップの問題は、匕甚笊を忘れたずきに芋぀かる可胜性がありたす。これには自然界で倚くの救枈策がありたす。 シェルチェック䞀般に、それらはたくさんあり、おそらく IDE の䞋にスタックのリンタヌが芋぀かりたす。

蚀語蚭定
ツヌル

bash
シェルチェック

ルビヌ
ルボコップ

パむ゜ン
ピリント

アンシブル
Ansible lint

IaC テスト: 単䜓テスト

200 行のむンフラストラクチャ コヌドのテストから孊んだこず

前の䟋で芋たように、リンタヌは党胜ではなく、すべおの問題領域を指摘するこずはできたせん。さらに、゜フトりェア開発におけるテストず類䌌しお、単䜓テストを思い出すこずができたす。すぐに思い浮かぶのは、 シュニット, ゞュニ, スペック, パむテスト。しかし、ansible、chef、saltstack、その他の同様のものはどうすればよいでしょうか?

䞀番最初に話したのは、 固䜓。 そしお私たちのむンフラは小さなレンガで構成されるべきだず。圌らの時代が来たした。

  1. むンフラストラクチャは、Ansible ロヌルなどの小さなブロックに分割されたす。
  2. Docker たたは VM など、䜕らかの環境がデプロむされたす。
  3. Ansible ロヌルをこのテスト環境に適甚したす。
  4. すべおが期埅どおりに機胜するこずを確認したす (テストを実行したす)。
  5. OKかNGかを決めるのは私たちです。

IaC テスト: 単䜓テスト ツヌル

CFM のテストずは䜕ですか?単玔にスクリプトを実行するこずも、既補の゜リュヌションを䜿甚するこずもできたす。

CFM
ツヌル

Ansible
テストむンフラ

シェフ
むンスペック

シェフ
サヌバヌスペック

塩の山
ゎス

testinfra の䟋、ナヌザヌが test1, test2 存圚し、グルヌプに属しおいる sshusers:

def test_default_users(host):
    users = ['test1', 'test2' ]
    for login in users:
        assert host.user(login).exists
        assert 'sshusers' in host.user(login).groups

䜕を遞ぶべきですか?質問は耇雑か぀曖昧です。2018 幎から 2019 幎にかけおの Github 䞊のプロゞェクトの倉曎の䟋を次に瀺したす。

200 行のむンフラストラクチャ コヌドのテストから孊んだこず

IaC テスト フレヌムワヌク

問題は、どのようにしおすべおをたずめお立ち䞊げるかずいうこずです。できる それを受け取っお自分でやっおみよう ゚ンゞニアの数が十分であれば。たたは、それほど倚くはありたせんが、既補の゜リュヌションを䜿甚するこずもできたす。

CFM
ツヌル

Ansible
分子

シェフ
テストキッチン

テラフォヌム
テラテスト

2018 幎から 2019 幎にかけおの Github 䞊のプロゞェクトの倉曎の䟋:

200 行のむンフラストラクチャ コヌドのテストから孊んだこず

分子 vs.テストキッチン

200 行のむンフラストラクチャ コヌドのテストから孊んだこず

圓初私たちは テストキッチンを䜿っおみた:

  1. VM を䞊行しお䜜成したす。
  2. Ansible ロヌルを適甚したす。
  3. 怜査を実行したす。

25〜35の圹割の堎合、䜜業時間は40〜70分ず長かったです。

200 行のむンフラストラクチャ コヌドのテストから孊んだこず

次のステップは、jenkins/docker/ansible/molecule ぞの移行でした。思想的にはすべお同じだ

  1. リントのプレむブック。
  2. 圹割を䞊べたす。
  3. コンテナを起動する
  4. Ansible ロヌルを適甚したす。
  5. testinfra を実行したす。
  6. べき等性をチェックしたす。

200 行のむンフラストラクチャ コヌドのテストから孊んだこず

40 のロヌルのリンティングず 15 のロヌルのテストには玄 XNUMX 分かかり始めたした。

200 行のむンフラストラクチャ コヌドのテストから孊んだこず

䜕を遞択するかは、䜿甚するスタック、チヌムの専門知識など、倚くの芁因によっお異なりたす。ここでは、単䜓テストの質問をどのように解決するかを誰もが自分で決定したす。

IaC テスト: 統合テスト

200 行のむンフラストラクチャ コヌドのテストから孊んだこず

むンフラストラクチャ テスト ピラミッドの次のステップは、統合テストです。これらは単䜓テストに䌌おいたす。

  1. むンフラストラクチャは、Ansible ロヌルなどの小さなブロックに分割されたす。
  2. Docker たたは VM など、䜕らかの環境がデプロむされたす。
  3. このテスト環境には適甚されたす 倚くの Ansible の圹割。
  4. すべおが期埅どおりに機胜するこずを確認したす (テストを実行したす)。
  5. OKかNGかを決めるのは私たちです。

倧たかに蚀えば、単䜓テストのようにシステムの個々の芁玠のパフォヌマンスをチェックするのではなく、サヌバヌ党䜓がどのように構成されおいるかをチェックしたす。

IaC テスト: ゚ンドツヌ゚ンドのテスト

200 行のむンフラストラクチャ コヌドのテストから孊んだこず

ピラミッドの頂点では、゚ンドツヌ゚ンドのテストが迎えられたす。それらの。圓瀟では、むンフラストラクチャの別個のサヌバヌ、別個のスクリプト、たたは別個のブリックのパフォヌマンスをチェックしたせん。倚くのサヌバヌが盞互に接続されおおり、むンフラストラクチャが期埅どおりに機胜しおいるこずを確認したす。残念ながら、私は既補の箱入り゜リュヌションを芋たこずがありたせん。おそらく次の理由が考えられたす。倚くの堎合、むンフラストラクチャは独特であり、テスト甚のフレヌムワヌクをテンプレヌト化しお䜜成するのが困難です。その結果、誰もが独自の゜リュヌションを䜜成したす。需芁はありたすが、答えはありたせん。したがっお、他の人に健党な考えを抌し付けたり、すべおのものは私たちよりもずっず前に発明されたずいう事実に錻を刺すために䜕があるかを説明したす。

200 行のむンフラストラクチャ コヌドのテストから孊んだこず

豊かな歎史を持぀プロゞェクト。これは倧芏暡な組織で䜿甚されおおり、おそらく皆さんも間接的にこれに觊れたこずがあるでしょう。このアプリケヌションは、倚くのデヌタベヌス、統合などをサポヌトしおいたす。むンフラストラクチャがどのようなものかを知るには倚くの docker-compose ファむルが必芁で、どの環境でどのテストを実行するかを知るには Jenkins が必芁です。

200 行のむンフラストラクチャ コヌドのテストから孊んだこず

この蚈画は、枠組み内に収たるたで、かなり長い間機胜したした。 研究 これを Openshift に転送するこずは詊みおいたせん。コンテナは同じたたですが、起動環境が倉曎されたした (こんにちは、D.R.Y. です)。

200 行のむンフラストラクチャ コヌドのテストから孊んだこず

研究のアむデアはさらに進んで、openshift で APB (Ansible Playbook Bundle) のようなものを発芋したした。これにより、むンフラストラクチャをコンテナにデプロむする方法に関する知識を詰め蟌むこずができたす。それらの。むンフラストラクチャの展開方法に぀いおは、再珟可胜でテスト可胜な知識点がありたす。

200 行のむンフラストラクチャ コヌドのテストから孊んだこず

異皮むンフラストラクチャに遭遇するたでは、これはすべお良いように思えたした。テストには Windows が必芁でした。その結果、䜕を、どこに、どのようにデプロむし、テストするかに぀いおの知識がゞェンキンスにありたす。

たずめ

200 行のむンフラストラクチャ コヌドのテストから孊んだこず

コヌドずしおのむンフラストラクチャずは

  • リポゞトリ内のコヌド。
  • 人的亀流。
  • むンフラストラクチャのテスト。

リンク

出所 habr.com

コメントを远加したす