DevOps関連のコードと構成をコードリポジトリに構築する方法は?


10

私たちは会社として成長しており、製品が拡大し、DevOps関連の活動と取り組みも成長しています-展開パイプラインやその他のプラグインを使用して、Bambooからより柔軟で構成可能なJenkinsに切り替えました。Ansibleに切り替え、Dockerを社内のあちこちで使い始めました。

これらすべてのものには、ある程度のコーディングまたは構成が必要です-Ansibleスクリプトと構成、Jenkinsグルーヴィーなスクリプト、Dockerfiles、YAML構成。

今のところ、我々はのためのハイレベルのディレクトリに別の「OPS」リポジトリを作成したjenkinsansibledocker及びother(ひどい名前であるが、現在はすべて「その他」DevOpsチームのためのオートメーションのものがあります)。

私たちのアプローチは正しく感じられず、拡張できない場合がありますが、DevOps関連のコードをコードリポジトリに保持するためのベストプラクティスと推奨事項は何ですか?


6
私は「各部分はアプリであり、アプリごとに1つのレポ」メソッドを使用します。つまり、料理本ごとに1つのレポを意味します。
Tensibai 2017

@Tensibaiそうです、単一の「ops」レポがすぐに実用的でなくなるのではないかと心配でした。ありがとう。
alecxe 2017

1
これは、シェフのレガシー形式のクックブック管理であり、すべてのクックブックを含む1つのレポであり、ほとんどの場合、フットガンが証明されたため、変更されましたが、Jenkinsパイプライン(v2の場合)およびdockerファイルは、IMOを処理するプロジェクトと共存する必要があります。私はあなたが他のプロジェクトの下に何を置いているのかわからないので、ここでアドバイスをすることはできません
Tensibai

@Tensibaiはそれを手に入れました!その他は、主にbashおよびpythonユーティリティ、または複数の内部ツール用の定期的に実行されるスクリプトで構成されています。これらは実際にはどこにも適合せず、「その他」よりも良い場所は考えられませんでした。コンテンツを投稿できるかどうか確認します質問へのディレクトリの同様に。ありがとう。
alecxe 2017

1
作業の「アフィニティ」によってスクリプトを複数のリポジトリに分割します。スクリプトはアプリXで一緒に機能します。2つのアプリでスクリプトを使用している可能性がありますが、アプリAが変更された場合、スクリプトは、通信先のアプリを処理する必要があります。 、2つの個別のバージョンを用意することをお勧めします。ATEOTD関連するアプリケーションと一緒に保存するか、タスクごとに特定のリポジトリ内の複数のアプリケーションにまたがる場合は、常にデプロイされたアプリケーションと同じバージョンを使用します。無関係なスクリプトに同時にタグを付ける必要はありません。
Tensibai 2017

回答:


3

説明するコードと構成の現在の構成は、関連する技術的ソリューションによって構成されています。これは悪い設計で、メンテナンスアクティビティに多くのオーバーヘッドが追加され、多くのトラップが追加されます。代わりに、その組織は、展開しているアーティファクトを中心に構築する必要があります。

この理由は、アーティファクト(例: Dockerイメージまたはソフトウェアパッケージ)を以下の動詞のオブジェクトと見なしたいためです。

  • 建てる
  • テスト
  • 展開する

実行したい自動化されたタスクの最小限のセットを検討します。テスト動詞の実装方法について何かを変更したい場合は、適切なリポジトリー内のアーティファクトに対応するフォルダーにアクセスして、更新が必要なjenkins固有の自動化項目を見つけるのは簡単です。代わりに、自動化レシピが技術的ソリューションを中心に構成されている場合、ジェンキンスがテスト手順に関与していることをすぐに理解し、アーティファクト関連の自動化アイテムを見つける必要があります。複雑な状況では、技術的なソリューションを中心とした組織が更新を非常に困難にします。これは、サービスに関連するすべての技術的なソリューションをアプリオリに知って、それに応じて更新する必要があるためです。

たとえば、ウェブサイトのコードとマイクロサービス「a」を含むリポジトリには、操作専用の次のサブディレクトリを含めることができます。

./ops/website
./ops/micro-service-a

それぞれにとと呼ばれる3つのスクリプトbuildtestありdeployます。自動化アイテムの構成がなんとかして明確になったので、構成に注目しましょう。

構成編成に関する主な条件と要件deployは、サービスのようなアーティファクトに適用されるときに動詞によって設定されます。deploy動詞は、次のパラメータを持っている必要があります。

  • デプロイするアーティファクトのバージョン、
  • アーティファクトのデプロイメントターゲット。デプロイされたアーティファクトが実行される具体的な環境を示します(例:クラスターと通信するエンドポイント)
  • それは他のエンドポイントへの接続に使用する資格情報(たとえば、データベース)
  • のランタイム構成(キャッシュエントリの存続期間など)

運用の観点から見ると、このパラメータ化の内訳は、ランタイム構成にバンドルできる資格情報は別として、展開の問題の自然な自由度と一致しますが、不用意に広がらないように分離することをお勧めします。


5

私はbock dockerに答えることができます。dockerを使用するためのベストプラクティスの1つは、プロジェクトの同じリポジトリにdockerファイルと構成ファイルを保持することです。そのため、プロジェクトのクローンを作成するときはいつでも、dockerイメージをビルドできます。たとえば、複数のバージョンのdocker composeファイル(prod、staging、dev)を保持して、イメージをビルドし、各環境の特定のオプションを使用してコンテナーを実行できます。たとえば、開発マシンでは、特定のネットワークを使用して、より多くの依存関係コンテナーを実行できます。


4

各ツールのコードは、独自のリポジトリに配置されます。例えば

  1. JenkinsリポジトリへのJenkins Groovyテンプレート
  2. 独自のリポジトリ内のAnsible YAMLプレイブック(役割、タスク、インベントリサブディレクトリを含む)
  3. 独自のリポジトリ内のCloudformation / Terrformテンプレート
  4. 独自のDockerファイル5.など

これにより、プロセスのオーケストレーションと各環境のさまざまなブランチの維持に関して、より適切にスケーリングできます。

これにより、よりきめ細かい制御が可能になり、バージョン管理のオーバーヘッドをすべてバージョン管理システムにオフロードできます。また、環境ごとに個別のブランチを作成し、すべての製品リリースのコードにタグを付けます(アプリケーションコードベースの場合と同様)。インフラを考え、コードの観点から処理します。(プロセスの変更はすべてコード化し、QA、SIT、UAT、次にPRODに送信する必要があります)アプリケーションと同様。

たとえば、本番環境(マスターブランチ)で実行されているAnsibleのV2.1が、製品(マスターブランチ)で実行されているV2.0のDockerコンテナーがあるとします。

同様に、DBスクリプト/ bashスクリプトを独自のリポジトリに保存します。追跡および自動化の目的で、デプロイされた各URLのすべてのツール/パーツのバージョンを表示するように構成されたヘルスチェックファイル(JSON / YAML)を持つことができます。(WebフックがURLを読み取ってデプロイメントを自動化するため)


2
このアプローチの落とし穴は、v2.1がqaにあり、検証されていないため、緊急に製品にパッチを適用する必要がある場合、v2.0を変更することはできません。このパッチ用にv2.2を作成すると、高いリスクがあります。 v2.1が本番環境に移行すると、失われるか上書きされ、リポジトリ内の個別のコードの量を掛けると、すぐにバックポートの悪夢が見られます(動作しますが、この免責事項を追加する必要がありました:))
Tensibai

3
ブランチを使用して環境/デプロイメント固有の情報を追跡することは、私にとってアリパターンのように見えます。20の環境がある場合、同期を保つために20のブランチがあることを意味します。エラーと混乱の原因となる可能性があります。環境/デプロイメント固有の情報を追跡するために構成ファイルを使用しない理由と、これらのブランチを使用するワークフローは何ですか?これらはささいな問題ではありません!
Michael Le BarbierGrünewald2017

3

Ops、Dev、DevOpsを区別することで、分離が促進され、「壁を越えて投げる」という考え方が適用されます。チーム間の連携を強化するには、プロジェクトのビルドとデプロイに必要なすべてをリポジトリに配置する必要があります。

そうは言っても、質問への答え:

DevOps関連のコードと構成をコードリポジトリに構築する方法は?

プロジェクトの実行にconfigが必要な場合は、同じディレクトリに配置する必要があります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.