この記事では、Gitlab CIおよびAnsibleを使用した大規模インフラストラクチャのローカルコマンドサーバーでグローバル設定を変更する機能/アイデア/コンセプトについて説明します。
20の開発チームと1つの管理者/ DevOpsチームがあるとします。 すべてのサーバーで管理者パスワードを変更する方法は? エンタープライズルート証明書をすべてのサーバーに追加する方法 等
どのような問題を解決しますか?
典型的な状況:
グローバル管理者/ DevOpsがいます。
グローバル設定(NTP、DNS、プロキシなど)があります
ローカル開発チームがあります:TeamA、TeamB、TeamC、TeamDなど。
チームのサーバーにしかアクセスできない開発者がいます。
グローバル管理者、グローバル設定を追加/更新する方法は?
グローバル設定がプライベートリポジトリのローカルコマンド設定とは別に保存されるという事実により、タスクは複雑になります。
会社全体にサーバーがほとんどない場合は、シンプルモードでAnsibleを起動できます。すべてのサーバーのグローバル管理者とグローバル設定の更新を一度に開始します。
大規模なインストールでは、企業は通常Puppet、Chefを使用します。
コンセプト
大規模なインフラストラクチャのローカルコマンドサーバーのグローバル設定を変更するには、gitサブモジュールメカニズムを提案します。
ローカル設定のリポジトリは、グローバル設定のgitサブモジュールを使用します。
以下は、グローバル設定を持つプライベートリポジトリをローカルコマンドリポジトリに接続する概略図です。
Puppet、Chef、Saltのインフラストラクチャでgitサブモジュールを使用してグローバル設定を更新するという概念を使用できますが、記事ではAnsibleの例を示します。
たとえば、tomcat、mysql、nginxをインストールし、teamと呼ばれるチームでグローバル設定を適用します。
gitlabには一般的な設定を含む共通グループがあります。
共通グループには、管理者、sysctl設定などを含むベースブートストラッププロジェクトがあります。
通常、会社には複数の開発部門があります-多くの場合、それらはチームと呼ばれます。
gitlabでは、チームグループを作成します(独自のチーム名があります)。
チームグループでは、アプリケーション、データベース、ロードバランサーのプロジェクトを作成します。
base-bootstrap、アプリケーション、データベース、ロードバランサーのスクリーンショット:
base-bootstrapリポジトリは、gitサブモジュールとしてアプリケーション、データベース、ロードバランサーリポジトリに含まれています。
リポジトリ内のアプリケーション、データベース、ロードバランサーがbase-bootstrapサブモジュールの更新を開始するたびに。
その後、base-bootstrapからのansible-playbookとbase-bootstrapからのansible-playbookがアプリケーション、データベース、ロードバランサーサーバーに適用されます。
つまり、base-bootstrapに新しい管理者を追加するか、base-bootstrapのシステム設定を変更すると、アプリケーション、データベース、ロードバランサーで、base-bootstrapの新しい設定がアプリケーション、データベース、ロードバランサーに適用されます。
準備する
Ansibleに関する初心者向けの記事を読む必要があります。
dockerがインストールされた状態でgitlabとgitlab-runnerをデプロイする必要があります。
ここでは、例としてdocker executorを使用します-Shell executorを使用できます。
gitlabとgitlab-runnerをデプロイする方法:
3つのサーバー(たとえば、ubuntu上)が必要です:アプリケーション、データベース、ロードバランサー。
アプリケーション、データベース、ロードバランサーは一般的な名前です。
すべての例は、他のソフトウェアで拡張、改善、使用することができます-この記事は一般的な原則を示しています。
実装方法
テスト用のリポジトリとすべてのコードは、 https : //github.com/patsevanton/ansible-gitlab-habrから取得できます。
ユーザー名/パスワードを使用してサーバーにアクセスする場合、目的のグループ(この場合はチーム)でuserpassword変数を作成し(変更する必要がある場合は、コード内の変数も変更する必要があります)、パスワードを指定します(パスワードパスワードはコードで使用されます)
エンドサーバーでsudo権限を持つ必要なユーザーを作成することを忘れないでください(ユーザーコードはコードで使用されます)。
SSHキーを使用してサーバーにアクセスする場合は、チームグループにSSH_PRIVATE_KEY変数を作成し、サーバーに接続するユーザーの秘密キーを追加する必要があります。
これはサーバーへの接続の簡単な例であるため、この記事ではセキュリティの問題については説明しません。
各リポジトリ(アプリケーション、データベース、ロードバランサー)でgitサブモジュールを作成します。
git submodule add git@gitlab.example.com:common/base-bootstrap.git git submodule add git@gitlab.example.com:team/team-users.git
共有プライベートリポジトリにアクセスするには、サブモジュールが必要です。
私たちの場合、これは、base-bootstrapの一般設定と、team-usersチームのユーザーリポジトリを持つリポジトリです。
gitlab.example.comはgitlabサーバーです。
次に、.gitmodulesでリポジトリへのパスを相対パスに変更します
例:
[submodule "team-users"] path = team-users url = ../team-users.git [submodule "base-bootstrap"] path = base-bootstrap url = ../../common/base-bootstrap.git
ホストの各リポジトリでIPを独自のものに変更し、ansible.cfgでremote_userをユーザーに変更します。
過去数時間/数日間にコミットがなく、サーバーに新しい一般的な変更を展開する必要がある場合(たとえば、新しい管理者を追加する必要がある場合)-そのような状況では、ansible-pullがあります。
ansible-pullをセットアップして、common / base-bootstrapリポジトリをダウンロードします。
これを行うには、デプロイトークンリポジトリを追加します。
共通/ base-bootstrapリポジトリに移動してから、設定/リポジトリ/トークンの展開に移動します。
トークンを作成します。 結果のユーザー名とパスワードはbase-bootstrap / vars / cron.ymlに記録されます。
すべてが正しく機能することを確認した後、アンシブルプルの開始時間を「2分ごと」から自分に合った時間に変更する価値があると思います。
ansible-pullが落ちた場合、このサービスのCIはドロップします。これは、このサービスリポジトリにコミットするたびに開始されます(サービスがアプリケーションと呼ばれるとしましょう)
確認する
新しい管理者を作成します。
https://github.com/patsevanton/ansible-gitlab-habr/blob/master/commons/base-bootstrap/vars/users.ymlで新しい管理者を追加してみてください
Sysctlの変更
https://github.com/patsevanton/ansible-gitlab-habr/blob/master/commons/base-bootstrap/vars/sysctl.ymlで sysctl設定を追加/変更してみてください
cronへのエントリの追加
cronエントリーをhttps://github.com/patsevanton/ansible-gitlab-habr/blob/master/commons/base-bootstrap/vars/cron.ymlに追加してみてください
アプリケーションの拡張またはインストール
最初に、アプリケーションをインストールする役割を見つける必要があります。
https://galaxy.ansible.com/にアクセスして、アプリケーションをインストールする役割を見つけます。
サーバーのコンソールからロールを使用してアプリケーションをインストールしてみてください。 通常、すべての役割の説明に指示があります。
たとえば、tomcatの横にjavaをインストールしてみてください。 最初にgeerlingguy.javaロールをインストールします
ansible-galaxy install geerlingguy.java
リポジトリと同じ標準のansible.cfgを作成します。
インベントリを作成します。
[java] java ansible_host=IP-
プレイブックjava.ymlを作成する
- hosts: java become: yes vars_files: - vars/main.yml roles: - { role: geerlingguy.java }
ansible-playbook java.ymlを実行します
すべてが正常に完了したら、目的のプロジェクト(この場合はアプリケーション)に追加します
geerlingguy.javaの役割は、robertdebock.tomcatの役割の後に追加されますhttps://github.com/patsevanton/ansible-gitlab-habr/blob/master/team/application/tomcat-app.yml#L11
サーバーにインストールする必要がある他のすべてのアプリケーションでも同じです。
プレイブックのテストとセキュリティ
記事を簡略化するために、パスワードの保存とテストの問題には対処していません。
プレイブックのテストに関する記事があります。
#Ansible:プレイブックのテスト(パート1)
#AnsibleロールのMoleculeおよびJenkinsとのテストおよび継続的統合
質問への回答
1)Mentat:そして、結局のところ、環境のあるアンシブルドックに書かれていないのはなぜですか? 最初の読書から、それはもう一度それを再発明する試みのように見えます。 そこで、すべてをansible-playbookのように適用すると非常に便利です-i env / teamA personalAPlaybook.yml
回答:このスキームにより、グローバル設定を変更できます。 質問で説明されているのは、ローカルコマンド設定の変更です。
PSおそらく同じ機能がAnsible Towerに実装されています。 しかし、これについては何も言えません-Ansible Towerとは連携していません。