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

AnsibleはPostgreSQLが大好きです

    Ansibleは単純に素晴らしく、PostgreSQLは確かに素晴らしかったので、それらがどのように驚くほど連携して機能するか見てみましょう!

    ====================プライムタイムの発表! ====================

    PGConf Europe 2015は、今年10月27日から30日にウィーンで開催されます。

    構成管理、サーバーオーケストレーション、自動デプロイに興味があると思います(そのため、このブログ投稿を読んでいますよね?)。 AWS(オプション)でPostgreSQL(確かに)を使用する場合は、10月28日15-15:50の私の講演「ManagingPostgreSQLwithAnsible」に参加することをお勧めします。

    すばらしいスケジュールを確認し、ヨーロッパ最大のPostgreSQLイベントに参加するチャンスをお見逃しなく!

    そこでお会いしましょう。はい、話し合いの後でコーヒーを飲むのが好きです🙂

    ====================プライムタイムの発表! ====================

    Ansibleとは何ですか?どのように機能しますか?

    Ansibleのモットーは、「シンプルでエージェントレスで強力なオープンソースIT自動化」です。 」Ansibleのドキュメントから引用してください。

    下の図からわかるように、Ansibleのホームページには、Ansibleの主な使用領域として、プロビジョニング、構成管理、アプリのデプロイ、継続的デリバリー、セキュリティとコンプライアンス、オーケストレーションが記載されています。概要メニューには、Ansibleを統合できるプラットフォーム(AWS、Docker、OpenStack、Red Hat、Windows)も表示されます。

    Ansibleの主な使用例を確認して、Ansibleがどのように機能し、IT環境にどれほど役立つかを理解しましょう。

    プロビジョニング

    Ansibleは、システム内のすべてを自動化したいときの忠実な友人です。エージェントレスであり、SSH経由で物事(サーバー、ロードバランサー、スイッチ、ファイアウォールなど)を簡単に管理できます。システムがベアメタルサーバーで実行されているかクラウドサーバーで実行されているかAnsibleが存在し、インスタンスのプロビジョニングを支援します。べき等の特性により、常に希望する(そして期待される)状態になります。

    構成管理

    最も難しいことの1つは、繰り返しの操作タスクで自分自身を繰り返さないことです。ここで、Ansibleは救世主として再び頭に浮かびます。時代が悪かった古き良き時代には、システム管理者は多くのスクリプトを作成し、それらを適用するために多くのサーバーに接続していましたが、それは明らかに彼らの生活の中で最高のものではありませんでした。誰もが知っているように、手動のタスクはエラーが発生しやすく、均質で管理しやすい環境ではなく、不均一な環境につながり、間違いなく私たちの生活をよりストレスの多いものにします。

    Ansibleを使用すると、(非常に有益なドキュメントとその巨大なコミュニティのサポートの助けを借りて)簡単なプレイブックを作成できます。タスクを作成すると、さまざまなモジュール(AWS、Nagios、PostgreSQL、SSH、APT、ファイルなど)を呼び出すことができます。モジュール)。その結果、構成を手動で管理するよりも、より創造的な活動に集中できます。

    アプリの導入

    アーティファクトの準備ができているので、それらを多数のサーバーにデプロイするのは非常に簡単です。 AnsibleはSSH経由で通信しているため、各サーバーのリポジトリからプルしたり、FTP経由でファイルをコピーするなどの従来の方法に煩わされたりする必要はありません。 Ansibleはアーティファクトを同期し、新しいファイルまたは更新されたファイルのみが転送され、古いファイルが削除されるようにすることができます。これにより、ファイル転送が高速化され、帯域幅が大幅に節約されます。

    Ansibleは、ファイルを転送するだけでなく、サーバーを本番環境で使用できるようにするのにも役立ちます。転送する前に、監視を一時停止したり、ロードバランサーからサーバーを削除したり、サービスを停止したりできます。展開後、サービスを開始し、サーバーをロードバランサーに追加して、監視を再開できます。

    これらすべてが、すべてのサーバーで一度に発生する必要はありません。 Ansibleは、一度にサーバーのサブセットで動作して、ダウンタイムゼロのデプロイメントを提供できます。たとえば、一度に5台のサーバーを一度にデプロイし、完了したら次の5台のサーバーにデプロイできます。

    このシナリオを実装すると、どこでも実行できます。開発者またはQAチームのメンバーは、テスト目的で自分のマシンに展開を行うことができます。また、何らかの理由でデプロイメントをロールバックするために必要なのは、最後に既知の作業成果物の場所だけです。その後、それらを本番サーバーに簡単に再デプロイして、システムを安定した状態に戻すことができます。

    継続的デリバリー

    継続的デリバリーとは、リリースに迅速かつシンプルなアプローチを採用することを意味します。その目標を達成するには、ダウンタイムなしで頻繁なリリースを可能にし、人間の介入をできるだけ少なくすることができる最高のツールを使用することが重要です。上記でAnsibleのアプリケーション展開機能について学習したので、ダウンタイムなしで展開を実行するのは非常に簡単です。継続的デリバリーのもう1つの要件は、手動プロセスが少ないことです。これは自動化を意味します。 Ansibleは、サーバーのプロビジョニングからサービスの構成まで、あらゆるタスクを自動化して本番環境に対応させることができます。 Ansibleでシナリオを作成してテストした後、それらを継続的インテグレーションシステムの前に置き、Ansibleにその仕事を任せるのは簡単になります。

    セキュリティとコンプライアンス

    セキュリティは常に最も重要であると考えられていますが、システムを安全に保つことは達成するのが最も難しいことの1つです。データのセキュリティと顧客のデータのセキュリティについて確認する必要があります。システムのセキュリティを確保するには、セキュリティを定義するだけでは不十分です。そのセキュリティを適用し、システムを常に監視して、システムがそのセキュリティに準拠していることを確認する必要があります。

    Ansibleは、ファイアウォールルールの設定、ユーザーとグループのロックダウン、カスタムセキュリティポリシーの適用など、使いやすいものです。同じ構成を繰り返し適用でき、システムをコンプライアンスに戻すために必要な変更を加えるだけなので、本質的に安全です。

    オーケストレーション

    Ansibleは、指定されたすべてのタスクが適切な順序になっていることを確認し、管理するすべてのリソース間の調和を確立します。 Ansibleの構成管理およびデプロイメント機能を使用すると、複雑な多層デプロイメントの調整が容易になります。たとえば、ソフトウェアスタックの展開を考えると、アプリケーションサーバーをアクティブ化する前にすべてのデータベースサーバーの準備ができていることを確認したり、サーバーをロードバランサーに追加する前にネットワークを構成したりすることは、もはや複雑な問題ではありません。

    Ansibleは、AmazonのCloudFormation、OpenStackのHeat、DockerのSwarmなどの他のオーケストレーションツールのオーケストレーションにも役立ちます。このようにして、さまざまなプラットフォーム、言語、ルールを学習する代わりに、ユーザーはAnsibleのYAML構文と強力なモジュールにのみ集中できます。

    Ansibleモジュールとは何ですか?

    モジュールまたはモジュールライブラリは、ローカルサーバーまたはリモートサーバー上のリソースを制御または管理するためのAnsible手段を提供します。それらはさまざまな機能を実行します。たとえば、モジュールがマシンの再起動を担当したり、画面にメッセージを表示したりする場合があります。

    Ansibleを使用すると、ユーザーは独自のモジュールを作成でき、すぐに使用できるコアモジュールまたは追加モジュールも提供されます。

    Ansibleプレイブックはどうですか?

    Ansibleを使用すると、さまざまな方法で作業を整理できます。最も直接的な形式では、「 ansible」を使用してAnsibleモジュールを操作できます。 」コマンドラインツールとインベントリファイル。

    在庫

    最も重要な概念の1つは、在庫です。 。 SSHを使用して接続する必要のあるサーバー、必要な接続情報、およびオプションでそれらのサーバーに関連付けられている変数をAnsibleに知らせるためのインベントリファイルが必要です。

    インベントリファイルはINIのような形式です。インベントリファイルでは、複数のホストを指定して、それらを複数のホストグループにグループ化できます。

    インベントリファイルhosts.iniの例は次のようになります:

    [dbservers]
    db.example.com
    

    ここでは、「dbservers」というホストグループに「db.example.com」という単一のホストがあります。インベントリファイルには、カスタムSSHポート、SSHユーザー名、SSHキー、プロキシ情報、変数なども含まれる場合があります。

    インベントリファイルの準備ができているので、データベースサーバーの稼働時間を確認するために、Ansibleの「コマンド」を呼び出すことができます。 」モジュールを実行し、「 uptime それらのサーバーでの”コマンド:

    ansible dbservers -i hosts.ini -m command -a "uptime"
    

    ここでは、hosts.iniファイルからホストを読み取り、SSHを使用して接続し、「 uptime 」を実行するように、Ansibleに指示しました。 それぞれに「」コマンドを実行し、出力を画面に出力します。このタイプのモジュール実行は、アドホックコマンドと呼ばれます。 。

    コマンドの出力は次のようになります:

    [email protected] ~/blog/ansible-loves-postgresql # ansible dbservers -i hosts.ini -m command -a "uptime"
    db.example.com | success | rc=0 >>
    21:16:24 up 93 days,  9:17,  4 users,  load average: 0.08, 0.03, 0.05
    

    ただし、ソリューションに複数のステップが含まれている場合、アドホックコマンドを使用するだけでそれらを管理することは困難になります。

    Ansibleプレイブックが登場します。タスク、変数、役割、テンプレート、ハンドラー、およびインベントリを使用してすべてのステップを統合することにより、ソリューションをプレイブックファイルに整理できます。

    これらの用語のいくつかを簡単に見て、それらがどのように役立つかを理解しましょう。

    タスク

    もう1つの重要な概念はタスクです。各Ansibleタスクには、名前、呼び出されるモジュール、モジュールパラメーター、およびオプションで事前/事後条件が含まれています。これにより、Ansibleモジュールを呼び出して、連続するタスクに情報を渡すことができます。

    変数

    変数もあります。これらは、私たちが提供または収集した情報を再利用するのに非常に役立ちます。インベントリ、外部YAMLファイル、またはプレイブックで定義できます。

    プレイブック

    Ansible Playbookは、YAML構文を使用して記述されています。複数のプレイが含まれている場合があります。各プレイには、接続するホストグループの名前と、実行する必要のあるタスクが含まれています。定義されている場合は、変数/ロール/ハンドラーも含まれる場合があります。

    これで、非常に単純なプレイブックを見て、どのように構成できるかを確認できます。

    ---
    
    - hosts: dbservers
      gather_facts: no
    
      vars:
        who: World
    
      tasks:
      - name: say hello
        debug: msg="Hello {{ who }}"
    
      - name: retrieve the uptime
        command: uptime

    この非常に単純なプレイブックでは、「dbservers」ホストグループで定義されたサーバーで動作する必要があることをAnsibleに伝えました。 「who」という変数を作成してから、タスクを定義しました。デバッグメッセージを出力する最初のタスクで、「who」変数を使用し、Ansibleに「HelloWorld」を画面に出力させたことに注意してください。 2番目のタスクでは、Ansibleに各ホストに接続してから、そこで「uptime」コマンドを実行するように指示しました。

    AnsiblePostgreSQLモジュール

    AnsibleはPostgreSQL用のモジュールをいくつか提供しています。それらのいくつかはコアモジュールの下にあり、他はエクストラモジュールの下にあります。

    すべてのPostgreSQLモジュールでは、Pythonpsycopg2パッケージをPostgreSQLサーバーと同じマシンにインストールする必要があります。 Psycopg2は、Pythonプログラミング言語のPostgreSQLデータベースアダプタです。

    Debian / Ubuntuシステムでは、psycopg2パッケージは次のコマンドを使用してインストールできます:

    apt-get install python-psycopg2
    

    次に、これらのモジュールについて詳しく説明します。例として、ホスト db.example.comのPostgreSQLサーバーで作業します。 ポート5432 postgres ユーザーと空のパスワード。

    postgresql_db

    このコアモジュールは、特定のPostgreSQLデータベースを作成または削除します。 Ansibleの用語では、特定のPostgreSQLデータベースが存在するか存在しないことを保証します。

    最も重要なオプションは、必須パラメーター「 name」です。 」。 PostgreSQLサーバーのデータベースの名前を表します。もう1つの重要なパラメータは、「状態」です。 」。 presentの2つの値のいずれかが必要です。 または不在 。これにより、 nameで指定された値で識別されるデータベースを作成または削除できます。 パラメータ。

    一部のワークフローでは、 login_hostなどの接続パラメータの指定も必要になる場合があります 、ポート login_user 、および login_password

    module_test」というデータベースを作成しましょう 」をPostgreSQLサーバー上で、プレイブックファイルに以下の行を追加します。

    - postgresql_db: name=module_test
                     state=present
                     login_host=db.example.com
                     port=5432
                     login_user=postgres
    

    ここでは、 db.example.comのテストデータベースサーバーに接続しました。 ユーザーと; postgres 。ただし、 postgresである必要はありません ユーザー名としてのuserは何でもかまいません。

    データベースの削除は、データベースを作成するのと同じくらい簡単です。

    - postgresql_db: name=module_test
                     state=absent
                     login_host=db.example.com
                     port=5432
                     login_user=postgres
    

    「state」パラメータの「absent」値に注意してください。

    postgresql_ext

    PostgreSQLには非常に便利で強力な拡張機能があることが知られています。たとえば、最近の拡張機能は tsm_system_rowsです。 これは、テーブルサンプリングで正確な行数を取得するのに役立ちます。 (詳細については、テーブルサンプリング方法に関する以前の投稿を確認してください。)

    このextrasモジュールは、データベースにPostgreSQL拡張機能を追加または削除します。 2つの必須パラメーターが必要です: db および名前 db パラメータはデータベース名と名前を参照します パラメータは拡張名を参照します。 状態もあります presentが必要なパラメータ または不在 値、およびpostgresql_dbモジュールと同じ接続パラメーター。

    話した拡張機能を作成することから始めましょう:

    - postgresql_ext: db=module_test
                      name=tsm_system_rows
                      state=present
                      login_host=db.example.com
                      port=5432
                      login_user=postgres
    

    postgresql_user

    このコアモジュールを使用すると、PostgreSQLデータベースにユーザーとロールを追加または削除できます。

    これは非常に強力なモジュールです。ユーザーがデータベースに存在していることを確認しながら、同時に特権や役割を変更することもできるからです。

    まず、パラメータを見てみましょう。ここでの唯一の必須パラメータは「name」です。 」は、ユーザーまたはロール名を指します。また、ほとんどのAnsibleモジュールと同様に、「状態 」パラメータは重要です。 presentのいずれかを持つことができます または不在 値とそのデフォルト値はpresent

    前のモジュールのような接続パラメータに加えて、他の重要なオプションのパラメータのいくつかは次のとおりです。

    • db :権限が付与されるデータベースの名前
    • パスワード :ユーザーのパスワード
    • priv :「priv1 / priv2」の特権または「table:priv1、priv2、…」形式のテーブル特権
    • role_attr_flags :ロール属性。可能な値は次のとおりです。
      • [NO]スーパーユーザー
      • [NO]クリータロール
      • [NO] CREATEUSER
      • [NO] CREATEDB
      • [NO]継承
      • [NO]ログイン
      • [NO]複製

    adaという新しいユーザーを作成するには パスワードlovelace およびデータベースへの接続特権module_test 、プレイブックに以下を追加する場合があります:

    - postgresql_user: db=module_test
                       name=ada
                       password=lovelace
                       state=present
                       priv=CONNECT
                       login_host=db.example.com
                       port=5432
                       login_user=postgres
    

    ユーザーの準備ができたので、彼女にいくつかの役割を割り当てることができます。 「ada」がログインしてデータベースを作成できるようにするには:

    - postgresql_user: name=ada
                       role_attr_flags=LOGIN,CREATEDB
                       login_host=db.example.com
                       port=5432
                       login_user=postgres
    

    INSERT」などのグローバルまたはテーブルベースの権限を付与することもできます 」、「更新 」、「 SELECT 」、および「 DELETE privを使用 パラメータ。考慮すべき重要な点の1つは、付与されたすべての特権が最初に取り消されるまで、ユーザーを削除できないことです。

    postgresql_privs

    このコアモジュールは、PostgreSQLデータベースオブジェクトに対する権限を付与または取り消します。サポートされているオブジェクトは次のとおりです。テーブルシーケンス関数データベーススキーマ言語テーブルスペース 、およびグループ

    必要なパラメータは「データベース」です。;特権を付与/取り消すデータベースの名前、および「ロール」;役割名のコンマ区切りのリスト。

    最も重要なオプションのパラメータは次のとおりです。

    • タイプ :特権を設定するオブジェクトのタイプ。 テーブル、シーケンス、関数、データベース、スキーマ、言語、テーブルスペース、グループのいずれかになります。 。デフォルト値はtable
    • objs :特権を設定するデータベースオブジェクト。複数の値を持つことができます。その場合、オブジェクトはコンマを使用して区切られます。
    • privs :付与または取り消す特権のコンマ区切りリスト。可能な値は次のとおりです。ALL SELECT 更新挿入

    public」のすべての権限を付与して、これがどのように機能するかを見てみましょう 」スキーマから「ada 」:

    - postgresql_privs: db=module_test
                        privs=ALL
                        type=schema
                        objs=public
                        role=ada
                        login_host=db.example.com
                        port=5432
                        login_user=postgres
    

    postgresql_lang

    PostgreSQLの非常に強力な機能の1つは、手続き型言語として使用される事実上すべての言語のサポートです。このextrasモジュールは、PostgreSQLデータベースを使用して手続き型言語を追加、削除、または変更します。

    単一の必須パラメーターは「lang」です。 」;追加または削除する手続き型言語の名前。その他の重要なオプションは「db 」;言語が追加または削除されるデータベースの名前、および「 trust 」;選択したデータベースで言語を信頼できるものにするか、信頼できないものにするかを選択します。

    データベースでPL/Python言語を有効にしましょう:

    - postgresql_lang: db=module_test
                       lang=plpython2u
                       state=present
                       login_host=db.example.com
                       port=5432
                       login_user=postgres
    

    すべてをまとめる

    Ansibleプレイブックがどのように構成され、どのPostgreSQLモジュールを使用できるかがわかったので、Ansibleプレイブックで知識を組み合わせることができます。

    プレイブックmain.ymlの最終的な形式は、次のようになります。

    ---
    
    - hosts: dbservers
      sudo: yes
      sudo_user: postgres
      gather_facts: yes
    
      vars:
        dbname: module_test
        dbuser: postgres
    
      tasks:
      - name: ensure the database is present
        postgresql_db: >
          state=present
          db={{ dbname }}
          login_user={{ dbuser }}
    
      - name: ensure the tsm_system_rows extension is present
        postgresql_ext: >
          name=tsm_system_rows
          state=present
          db={{ dbname }}
          login_user={{ dbuser }}
    
      - name: ensure the user has access to database
        postgresql_user: >
          name=ada
          password=lovelace
          state=present
          priv=CONNECT
          db={{ dbname }}
          login_user={{ dbuser }}
    
      - name: ensure the user has necessary privileges
        postgresql_user: >
          name=ada
          role_attr_flags=LOGIN,CREATEDB
          login_user={{ dbuser }}
    
      - name: ensure the user has schema privileges
        postgresql_privs: >
          privs=ALL
          type=schema
          objs=public
          role=ada
          db={{ dbname }}
          login_user={{ dbuser }}
    
      - name: ensure the postgresql-plpython-9.4 package is installed
        apt: name=postgresql-plpython-9.4 state=latest
        sudo_user: root
    
      - name: ensure the PL/Python language is available
        postgresql_lang: >
          lang=plpython2u
          state=present
          db={{ dbname }}
          login_user={{ dbuser }}
    

    これで、「ansible-playbook」コマンドを使用してプレイブックを実行できます。

    [email protected] ~/blog/ansible-loves-postgresql # ansible-playbook -i hosts.ini main.yml
    
    PLAY [dbservers] **************************************************************
    
    GATHERING FACTS ***************************************************************
    ok: [db.example.com]
    
    TASK: [ensure the database is present] ****************************************
    changed: [db.example.com]
    
    TASK: [ensure the tsm_system_rows extension is present] ***********************
    changed: [db.example.com]
    
    TASK: [ensure the user has access to database] ********************************
    changed: [db.example.com]
    
    TASK: [ensure the user has necessary privileges] ******************************
    changed: [db.example.com]
    
    TASK: [ensure the user has schema privileges] *********************************
    changed: [db.example.com]
    
    TASK: [ensure the postgresql-plpython-9.4 package is installed] ***************
    changed: [db.example.com]
    
    TASK: [ensure the PL/Python language is available] ****************************
    changed: [db.example.com]
    
    PLAY RECAP ********************************************************************
    db.example.com             : ok=8    changed=7    unreachable=0    failed=0
    

    インベントリとプレイブックファイルは、このブログ投稿用に作成されたGitHubリポジトリにあります。メインのプレイブックで行ったすべてを元に戻す「remove.yml」という別のプレイブックもあります。

    Ansibleの詳細については:

    • よく書かれたドキュメントを確認してください。
    • 非常に役立つチュートリアルであるAnsibleクイックスタートビデオをご覧ください。
    • ウェビナーのスケジュールに従って、リストにいくつかのクールな今後のウェビナーがあります。

    1. SQLite Select

    2. MariaDBにテーブルが存在するかどうかを確認する4つの方法

    3. SQLiteで現在の時刻を取得する方法

    4. このSQLコードでエラー1066(一意のテーブル/エイリアスではない:'user')が発生するのはなぜですか?