sql >> データベース >  >> RDS >> PostgreSQL

Puppetを使用したPostgreSQLの展開と構成

    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の設定」のセクションで示されているこの例について説明します。

    パペットのインストール マスターホストまたはエージェントホストのいずれかで実行する一連の一般的な手順があります:

    ステップ1 ホスト名とそのIPアドレスを使用した/etc/hostsファイルの更新

    192.168.1.85 agent agent.severalnines.com
    
    192.168.1.87 master master.severalnines.com puppet
    ステップ2 システムに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リポジトリにあります。

    ステップ3

    NTP(Network Time Protocol)サーバーの構成

    $ sudo yum -y install chrony
    ステップ4

    chronyは、異なるNTPサーバーからのシステムクロックを同期するために使用されるため、マスターサーバーとエージェントサーバーの間で時刻の同期が維持されます。

    chronyをインストールしたら、有効にして再起動する必要があります:

    $ sudo systemctl enable chronyd.service
    
    $ sudo systemctl restart chronyd.service
    ステップ5 SELinuxパラメーターを無効にする

    ファイル/etc/ sysconfig / selinuxで、両方のホストへのアクセスを制限しないように、パラメーターSELINUX(Security-Enhanced Linux)を無効にする必要があります。

    SELINUX=disabled
    ステップ6

    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 "
    構成ファイル/etc/puppetlabs/puppet/puppet.confで、次のパラメーター化を追加する必要があります。

    [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では、リソースのアグリゲーターとして機能します。

    これらのファイル編成には、従うべき特定のディレクトリ構造があります:

    各フォルダーの目的は次のとおりです:

    フォルダ

    説明

    マニフェスト

    人形コード

    ファイル

    ノードにコピーされる静的ファイル

    テンプレート

    管理対象ノードにコピーされるテンプレートファイル(変数でカスタマイズ可能)

    モジュールの使用方法を示すマニフェスト

    クラス(マニフェスト)は、以下の例に示すように、他のクラスで使用できます。dev_accountsのマニフェストinit.ppは、accountsモジュールのマニフェストグループを使用しています。
    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で利用できます。

    ステップ1 新しいPostgreSQLインスタンスを構成してデプロイします。これが、すべてのノードに新しいPostgreSQLインスタンスをインストールするために必要なすべてのプログラミングと構成です。

    最初のステップは、以前に共有した新しいモジュール構造ディレクトリを作成することです。

    $ 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
    ステップ2

    すべてのインターフェースをリッスンするように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
    ステップ3

    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
    ステップ4 読み取り専用ユーザーを作成します。読み取り専用権限を持つ新しいユーザーを作成するには、前のマニフェストに次のリソースを追加する必要があります。

    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の構成を簡単に実行できます


    1. 外部キー制約は、Oracleのクエリ変換に影響を与えますか?

    2. SQLServer2012の拡張イベントに対する重要な変更

    3. スレッドメインjava.sql.SQLExceptionの例外:ユーザー'' @'localhost'のアクセスが拒否されました(パスワードを使用:NO)

    4. 外部キーのインデックス作成の利点