
1 年半前から取り組んでいるシステムの導入について、サポートが必要です。私の懸念を理解していただくために、当社のインフラストラクチャについて少し説明します。
私たちには、システム用のさまざまなテスト環境を備えたサーバー(TESTING_SERVER と呼ぶことにします)があります。これらの環境はすべて docker で実行されています。テスト環境の各インスタンスは、次のもので構成されています。1. プロキシとして機能する nginx を備えた Docker コンテナ 2. Django Web を備えた Docker コンテナ 3. mysql を備えた Docker コンテナ
テスト目的で新しい環境を構築する必要があるたびに (例: QA が新しい機能をテストしたい場合)、TESTING_SERVER で次のタスクを実行する Ansible プレイブックを使用します。
- Dockerネットワークを作成する
- データベースコンテナを作成する
- TESTING_SERVER のどこかに django git リポジトリをクローンまたは更新します。
- Djangoコンテナを作成する
- Djangoコンテナ内でdjango collectstaticコマンドを実行する
- Djangoコンテナ内でdjango migrateコマンドを実行する
- nginxコンテナを作成する
私たちの本番環境には、mysql、django、nginx を実行する単純な Ubuntu サーバー (PRODUCTION_SERVER) があります。本番環境にデプロイする必要があるたびに、上記の手順を (ほぼ) 繰り返す Ansible プレイブックを実行します。
- MySQL 接続を確認します (DB は別のサーバーにあります)
- PRODUCTION_SERVER のどこかに Django Git リポジトリをクローンまたは更新します。
- gunicorn を確認して再起動します (django コンテナを作成するのと同等です)
- django collectstatic を実行する
- django migrateを実行する
- nginxの設定を確認する
これら 2 つのプレイブックは、共通点が多いものの、それぞれ異なります。各ステップを Ansible タスクに変換し、条件を使用してどのタスク (dockerized または direct) を実行する必要があるかを判断することを考えていました。ただし、各ステップには異なるタスクがまだあります (同じプレイブックですが、少し扱いにくいようです)。
私の質問は、これらのプレイブックを「マージ」して、繰り返しを行わずに 1 つにする方法があるかどうかです。
答え1
ベスト プラクティス ドキュメントに記載されているのと同様に、「タスク」ごとにロールを作成し、それをプレイブックで使用します。
http://docs.ansible.com/ansible/latest/playbooks_best_practices.html#ディレクトリレイアウト
例えば
roles/
create_a_docker_network/
tasks/
main.yml
create_database_container/...
...
Create_nginx_container/
そしてプレイブックで役割を呼び出します
テスト.yml
- hosts: testserver
roles:
- create_a_docker_network
- create_database_container
- ...