Puppetは、構成管理と展開のためのオープンソースソフトウェアです。 2005年に設立され、マルチプラットフォームであり、構成用の独自の宣言型言語もあります。
PostgreSQL(または実際には他のソフトウェア)の管理と保守に関連するタスク監視が必要な毎日の反復プロセスで構成されます。これは、スケジューリングツールを介してスクリプトまたはコマンドによって操作されるタスクにも当てはまります。これらのタスクの複雑さは、大規模なインフラストラクチャで実行すると指数関数的に増加しますが、Puppetを使用すると、非常に機敏な方法でこれらの操作のパフォーマンスを一元化および自動化するため、これらのタイプの大規模な問題を解決できることがよくあります。
Puppetは、構成が実行されているクライアント/サーバーレベルのアーキテクチャ内で機能します。これらの操作は、すべてのクライアント(ノードとも呼ばれます)で拡散および実行されます。
通常は30分ごとに実行され、エージェントのノードはファクトとも呼ばれる一連の情報(プロセッサのタイプ、アーキテクチャ、IPアドレスなど)を収集し、その情報をに送信します。適用する新しい構成があるかどうかを確認するための回答を待っているマスター。
これらの事実により、マスターはノードごとに同じ構成をカスタマイズできます。
非常に単純な方法で、Puppetは最も重要なDevOpsツールの1つです本日ご利用いただけます。このブログでは、以下を見ていきます...
- PuppetとPostgreSQLのユースケース
- PostgreSQL用のPuppetの構成
以下で説明するPuppet(バージョン5.3.10)のインストールとセットアップは、オペレーティングシステムとしてCentOS7.0を使用する一連のホストで実行されました。
PuppetとPostgreSQLのユースケース
すべてのPostgreSQLサーバーをホストするマシンのファイアウォールに問題があるとすると、PostgreSQLへのすべてのアウトバウンド接続を拒否し、できるだけ早く実行する必要があります。
Puppetは、特に速度と効率が高いため、この状況に最適なツールです。必要不可欠。パラメータlisten_addressesを管理することにより、「PostgreSQL用のPuppetの設定」のセクションで示されているこの例について説明します。
192.168.1.85 agent agent.severalnines.com
192.168.1.87 master master.severalnines.com puppet
$ sudo rpm –Uvh https://yum.puppetlabs.com/puppet5/el/7/x86_64/puppet5-release-5.0.0-1-el7.noarch.rpm
他のオペレーティングシステムまたはCentOSバージョンの場合、最も適切なリポジトリはPuppet、Inc.のYumリポジトリにあります。
NTP(Network Time Protocol)サーバーの構成
$ sudo yum -y install chrony
chronyは、異なるNTPサーバーからのシステムクロックを同期するために使用されるため、マスターサーバーとエージェントサーバーの間で時刻の同期が維持されます。
chronyをインストールしたら、有効にして再起動する必要があります:
$ sudo systemctl enable chronyd.service
$ sudo systemctl restart chronyd.service
SELINUX=disabled
Puppetをインストールする前に(マスターまたはエージェントのいずれか)、これらのホストのファイアウォールを適切に定義する必要があります。
$ sudo firewall-cmd -–add-service=ntp -–permanent
$ sudo firewall-cmd –-reload
パッケージリポジトリpuppet5-release-5.0.0-1-el7.noarch.rpmがシステムに追加されると、puppetserverのインストールを実行できます。
$ sudo yum install -y puppetserver
最大メモリ割り当てパラメータは、/ etc / sysconfig /puppetserverファイルを2GB(またはサービスが開始されない場合は1GB)に更新するための重要な設定です:
JAVA_ARGS="-Xms2g –Xmx2g "
[master]
dns_alt_names=master.severalnines.com,puppet
[main]
certname = master.severalnines.com
server = master.severalnines.com
environment = production
runinterval = 1h
puppetserverサービスはポート8140を使用してノード要求をリッスンするため、このポートが有効になっていることを確認する必要があります。
$ sudo firewall-cmd --add-port=8140/tcp --permanent
$ sudo firewall-cmd --reload
puppet masterですべての設定が完了したら、次のサービスを開始します。
$ sudo systemctl start puppetserver
$ sudo systemctl enable puppetserver
パッケージリポジトリpuppet5-release-5.0.0-1-el7.noarch.rpmのPuppetエージェントもシステムに追加され、puppet-agentのインストールをすぐに実行できます。
$ sudo yum install -y puppet-agent
puppet-agent構成ファイル/etc/puppetlabs/puppet/puppet.confも、次のパラメーターを追加して更新する必要があります。
[main]
certname = agent.severalnines.com
server = master.severalnines.com
environment = production
runinterval = 1h
次のステップでは、次のコマンドを実行して、マスターホストにエージェントノードを登録します。
$ sudo /opt/puppetlabs/bin/puppet resource service puppet ensure=running enable=true
service { ‘puppet’:
ensure => ‘running’,
enable => ‘true’
}
現時点では、マスターホストで、証明書に署名するためのパペットエージェントからの保留中の要求があります:
次のいずれかのコマンドを実行して署名する必要があります:
>$ sudo /opt/puppetlabs/bin/puppet cert sign agent.severalnines.com
$ sudo /opt/puppetlabs/bin/puppet cert sign --all
最後に(そして、パペットマスターが証明書に署名したら)、パペットマスターからカタログを取得して、エージェントに構成を適用します。
$ sudo /opt/puppetlabs/bin/puppet agent --test
このコマンドでは、パラメータ--testはテストを意味するものではなく、マスターから取得した設定がローカルエージェントに適用されます。マスターから構成をテスト/確認するには、次のコマンドを実行する必要があります:
$ sudo /opt/puppetlabs/bin/puppet agent --noop
Puppetは宣言型プログラミングアプローチを使用しており、その目的は何をするかを指定することであり、それを達成する方法は重要ではありません!
Puppetの最も基本的なコードは、コマンド、サービス、ファイル、ディレクトリ、ユーザー、パッケージなどのシステムプロパティを指定するリソースです。
以下に、ユーザーを作成するためのリソースの構文を示します。
user { 'admin_postgresql':
ensure => present,
uid => '1000',
gid => '1000',
home => '/home/admin/postresql'
}
さまざまなリソースを、拡張子が「pp」(Puppet Programの略)のファイルの以前のクラス(マニフェストとも呼ばれます)に結合できますが、それでも、いくつかのマニフェストとデータ(ファクトなど、ファイル、およびテンプレート)がモジュールを構成します。そこにあるすべての論理階層とルールは、次の図に示されています。
各モジュールの目的は、単一の実行に必要なすべてのマニフェストを含めることです。モジュール方式のタスク。一方、クラスの概念は、オブジェクト指向プログラミング言語の概念と同じではありません。Puppetでは、リソースのアグリゲーターとして機能します。
これらのファイル編成には、従うべき特定のディレクトリ構造があります:
各フォルダーの目的は次のとおりです:
フォルダ | 説明 |
| 人形コード |
| ノードにコピーされる静的ファイル |
| 管理対象ノードにコピーされるテンプレートファイル(変数でカスタマイズ可能) |
| モジュールの使用方法を示すマニフェスト |
class dev_accounts {
$rootgroup = $osfamily ? {
'Debian' => 'sudo',
'RedHat' => 'wheel',
default => warning('This distribution is not supported by the Accounts module'),
}
include accounts::groups
user { 'username':
ensure => present,
home => '/home/admin/postresql',
shell => '/bin/bash',
managehome => true,
gid => 'admin_db',
groups => "$rootgroup",
password => '$1$7URTNNqb$65ca6wPFDvixURc/MMg7O1'
}
}
次のセクションでは、examplesフォルダーのコンテンツを生成する方法と、各モジュールをテストして公開するためのコマンドを示します。
PostgreSQL用のPuppetの構成
PostgreSQLデータベースをデプロイおよび保守するためのいくつかの構成例を提示する前に、すべての機能を使用するためにPostgreSQL puppetモジュールを(サーバーホストに)インストールする必要があります。
$ sudo /opt/puppetlabs/bin/puppet module install puppetlabs-postgresql
現在、Puppetですぐに使用できる何千ものモジュールがパブリックモジュールリポジトリPuppetForgeで利用できます。
最初のステップは、以前に共有した新しいモジュール構造ディレクトリを作成することです。
$ cd /etc/puppetlabs/code/environments/production/modules
$ mkdir db_postgresql_admin
$ cd db_postgresql_admin; mkdir{examples,files,manifests,templates}
次に、マニフェストファイルmanifests / init.ppに、インストールされたモジュールによって提供されるクラスpostgresql ::serverを含める必要があります:
class db_postgresql_admin{
include postgresql::server
}
マニフェストの構文を確認するには、次のコマンドを実行することをお勧めします。
$ sudo /opt/puppetlabs/bin/puppet parser validate init.pp
何も返されない場合は、構文が正しいことを意味します
サンプルフォルダでこのモジュールを使用する方法を示すには、次のコンテンツを含む新しいマニフェストファイルinit.ppを作成する必要があります。
include db_postgresql_admin
モジュール内のサンプルの場所をテストして、マスターカタログに適用する必要があります:
$ sudo /opt/puppetlabs/bin/puppet apply --modulepath=/etc/puppetlabs/code/environments/production/modules --noop init.pp
最後に、各ノードがアクセスできるモジュールをファイル「/etc/puppetlabs/code/environments/production/manifests/site.pp」で定義する必要があります:
node ’agent.severalnines.com’,’agent2.severalnines.com’{
include db_postgresql_admin
}
またはすべてのノードのデフォルト構成:
node default {
include db_postgresql_admin
}
通常、ノードは30分ごとにマスターカタログをチェックしますが、次のコマンドを使用して、このクエリをノード側で強制できます。
$ /opt/puppetlabs/bin/puppet agent -t
または、マスター構成と現在のノード設定の違いをシミュレートすることが目的の場合は、noppパラメーター(操作なし)を使用できます。
$ /opt/puppetlabs/bin/puppet agent -t --noop
すべてのインターフェースをリッスンするようにPostgreSQLインスタンスを更新します。以前のインストールでは、非常に制限されたモードでインスタンス設定を定義しています。ポート5432(PostgreSQL用に定義)に関連付けられたホストで確認できるように、ローカルホストでの接続のみを許可します。
$ sudo netstat -ntlp|grep 5432
tcp 0 0 127.0.0.1:5432 0.0.0.0:* LISTEN 3237/postgres
tcp6 0 0 ::1:5432 :::* LISTEN 3237/postgres
すべてのインターフェースをリッスンできるようにするには、ファイル/etc/puppetlabs/code/environments/production/modules/db_postgresql_admin/manifests/init.pp
に次のコンテンツが含まれている必要があります。class db_postgresql_admin{
class{‘postgresql:server’:
listen_addresses=>’*’ #listening all interfaces
}
}
上記の例では、クラスpostgresql ::serverが宣言されており、パラメータlisten_addressesをすべてのインターフェイスを意味する「*」に設定しています。
これで、ポート5432がすべてのインターフェースに関連付けられました。次のIPアドレス/ポートで確認できます:「0.0.0.0:5432」
$ sudo netstat -ntlp|grep 5432
tcp 0 0 0.0.0.0:5432 0.0.0.0:* LISTEN 1232/postgres
tcp6 0 0 :::5432 :::* LISTEN 1232/postgres
初期設定を元に戻すには:ローカルホストからのデータベース接続のみを許可するlisten_addressesパラメーターを「localhost」に設定するか、必要に応じてホストのリストを指定する必要があります。
listen_addresses = 'agent2.severalnines.com,agent3.severalnines.com,localhost'
マスターホストから新しい構成を取得するには、ノードで要求するだけです。
$ /opt/puppetlabs/bin/puppet agent -t
PostgreSQLデータベースを作成します。 PostgreSQLインスタンスは、新しいデータベースと、このデータベースを使用するための新しいユーザー(パスワード付き)、およびこの新しいユーザーのデータベース接続を許可するためのpg_hab.confファイルのルールを使用して作成できます。
class db_postgresql_admin{
class{‘postgresql:server’:
listen_addresses=>’*’ #listening all interfaces
}
postgresql::server::db{‘nines_blog_db’:
user => ‘severalnines’, password=> postgresql_password(‘severalnines’,’passwd12’)
}
postgresql::server::pg_hba_rule{‘Authentication for severalnines’:
Description =>’Open access to severalnines’,
type => ‘local’,
database => ‘nines_blog_db’,
user => ‘severalnines’,
address => ‘127.0.0.1/32’
auth_method => ‘md5’
}
}
この最後のリソースの名前は「数九の認証」であり、pg_hba.confファイルにはもう1つの追加ルールがあります:
# Rule Name: Authentication for severalnines
# Description: Open access for severalnines
# Order: 150
local nines_blog_db severalnines 127.0.0.1/32 md5
マスターホストから新しい構成を取得するには、ノードで要求するだけです。
$ /opt/puppetlabs/bin/puppet agent -t
postgresql::server::role{‘Creation of a new role nines_reader’:
createdb => false,
createrole => false,
superuser => false, password_hash=> postgresql_password(‘nines_reader’,’passwd13’)
}
postgresql::server::pg_hba_rule{‘Authentication for nines_reader’:
description =>’Open access to nines_reader’,
type => ‘host’,
database => ‘nines_blog_db’,
user => ‘nines_reader’,
address => ‘192.168.1.10/32’,
auth_method => ‘md5’
}
マスターホストから新しい構成を取得するには、ノードで要求するだけです。
$ /opt/puppetlabs/bin/puppet agent -t
このブログ投稿では、複数のノード(仮想マシンの場合もあります)に自動でカスタマイズされた方法でPostgreSQLデータベースをデプロイして構成を開始するための基本的な手順を示しました。
これらのタイプの自動化は、手動で行うよりも効果的にするのに役立ちます。また、puppetforgeリポジトリで利用可能ないくつかのクラスを使用してPostgreSQLの構成を簡単に実行できます