Gitlab CIおよびAnsibleを使用したインフラストラクチャのローカルコマンドサーバーのグローバル設定の変更[コンセプト]



この記事では、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に関する初心者向けの記事を読む必要があります。


#開始可能な場所


#Ansibleガイド


dockerがインストールされた状態でgitlabとgitlab-runnerをデプロイする必要があります。


ここでは、例としてdocker executorを使用します-Shell executorを使用できます。


gitlabとgitlab-runnerをデプロイする方法:


#SouthbridgeによるGitlab-CIの記事


#GitLab CIでのDockerの継続的な統合と展開


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とは連携していません。



Source: https://habr.com/ru/post/J432260/


All Articles