DUICUO

運用と保守に忙しすぎないようにする: Ansible の自動化された運用と保守について詳しく説明します。

I. Ansibleの概要

Ansibleは、近年急速に普及しているオープンソースの運用保守自動化ツールです。Ansibleを使用することで、運用保守を自動化することができ、運用保守エンジニアの作業効率を向上させ、人的ミスを削減することができます。

Ansibleは豊富な統合モジュールを提供し、様々な管理タスクを可能にします。1,000を超えるモジュールが付属しています。さらに重要なのは、初心者でも驚くほど簡単に使用できるにもかかわらず、豊富な機能を備えていることです。運用・保守分野のほぼあらゆるタスクに対応できます。

1. Ansibleの機能

Ansible は 2012 年のリリース以来、急速に世界中で人気を博しており、その特徴は次のとおりです。

  • Ansible は Python ベースで開発されているため、運用エンジニアが二次開発を行うことが比較的容易です。
  • Ansible の豊富な組み込みモジュール セットは、ほぼすべての要件を満たすことができます。
  • 管理モデルは非常にシンプルで、1 つのコマンドで数千のホストに影響を与えることができます。
  • SSH 経由の基盤通信を備えたクライアントレス モード。
  • Ansible はリリース以来、AWS、Google Cloud Platform、Microsoft Azure、Cisco、HP、VMware、Twitter などの大手企業に採用され、利用されています。

II. Ansibleの役割

  • ユーザー: Ansible を使用して運用とメンテナンスを自動化するにはどうすればよいですか?
  • Ansible ツールセット: Ansible で何ができるのか?
  • ターゲット: Ansible はどのホストに影響を与えることができますか?

1. ユーザー

下の画像に示すように、AnsibleユーザーはAnsibleを複数の方法で操作できます。この画像では4つの方法を示しています。

  • CMDB:CMDBは、企業のITアーキテクチャにおける様々な構成情報を保存・管理します。ITILプロジェクト構築の中核ツールです。運用担当者はCMDBとAnsibleを組み合わせ、CMDBを介して直接コマンドを発行することでAnsibleツールセットを呼び出し、目的を達成することができます。
  • PUBLIC/PRIVATE方式:豊富な組み込みモジュールに加え、AnsibleはPHP、Python、PERLなどの一般的な言語に対応した豊富なAPI言語インターフェースも提供しています。PUBLIC/PRIVATE方式に基づき、AnsibleはAPIを呼び出すことで動作します。
  • アドホック コマンド セット: ユーザーは、アドホック コマンド セットを通じて Ansible ツールキットを直接呼び出してタスクを完了できます。
  • プレイブック: ユーザーは Ansible プレイブックを事前に作成し、それを実行できます...
  • Playbooks 内の事前設定されたタスク セットは順番に実行されます。

2. Ansibleツールセット

Ansible ツールセットには、インベントリ、モジュール、プラグイン、API が含まれます。

Ansibleライブラリは、インベントリ(グループ化によってデバイスリストを管理します。グループへの呼び出しは、そのグループ内のすべてのホストに直接影響します)、モジュール(さまざまな実行モジュールを含みます。ほぼすべての管理タスクはモジュールを通じて実行されます)、プラグイン(さまざまな追加機能を提供します)、およびAPI(プログラマーがAnsibleで二次開発を行うためのインターフェースを提供します)で構成されています。具体的には、次のとおりです。

  • Ansible Playbook: Ansibleタスクとその設定ファイルを整理・定義するタスクスクリプト。Ansibleによって順次実行されます。通常、JSON形式のYMLファイルです。
  • インベントリ: Ansible はホストのリストを管理します。
  • モジュール: Ansible のコマンド実行モジュール。ほとんどはコア モジュールが組み込まれていますが、カスタマイズすることもできます。
  • プラグイン:接続型プラグイン、ループプラグイン、変数プラグイン、フィルタープラグインなど、モジュールの機能を補完するプラグインです。この機能はあまり使用されません。
  • API: サードパーティ プログラムで使用されるアプリケーション プログラミング インターフェイス。
  • Ansible: この部分は図では分かりにくいですが、インベントリ、API、モジュール、プラグインの組み合わせは、Ansibleのコマンドラインツール、つまりコア実行ツールとして理解できます。

3. 適用対象

Ansible は、Linux および Linux 以外のオペレーティング システム ホストだけでなく、さまざまなパブリック/プライベート、商用および非商用デバイスのネットワーク インフラストラクチャでも使用できます。

ユーザーがAnsibleまたはAnsible-Playbookを使用する場合、サーバーターミナルにAnsible Ad-HocコマンドセットまたはPlaybookを入力すると、Ansibleは事前に選択されたルールに従ってPlaybookをPlayに分解し、PlayをAnsibleが認識できるタスクに編成します。その後、タスクに関連するすべてのモジュールとプラグインを呼び出し、Inventoryに定義されたホストリストに従って、タスクセットを一時ファイルまたはコマンドの形式でSSH経由でリモートクライアントに送信します。そして、実行結果を返します。一時ファイルの場合は、実行後に自動的に削除されます。

III. Ansibleの設定

1. Ansibleのインストール

Ansibleはインストールとデプロイが非常に簡単です。RPMインストールを例に挙げると、依存関係はPythonとSSHのみで、どちらもシステムにデフォルトでインストールされています。Ansibleの管理インターフェースは、Red Hat、Debian、CentOSなどのLinuxシステムでのみ利用可能です。

1) YUM経由でAnsibleをインストールする

必要なAnsibleパッケージはインターネットから直接ダウンロードできます。このブログ記事では、Ansible自動化ツールのインストールに必要な依存パッケージを紹介します。

  1. [root@centos01 ~]# cd /mnt/ansiblerepo/ansiblerepo/repodata/  
  2. [root@centos01 ansiblerepo]# vim /etc/yum.repos.d/local.repo  
  3. [地元]
  4. 名前= Centos    
  5. baseurl = file :///mnt/ansiblerepo/ansiblerepo <!-- yum パスを変更します -->    
  6. 有効= 1    
  7. gpgcheck = 0    
  8. [root@centos01 ~]# yum -y ansible をインストール 
  9. <!--Ansible 自動化ツールをインストールする-->  

2) インストール結果を確認する

  1. [root@centos01 ~]# ansible --version  
  2. <!-- コマンドが正常に実行された場合、Ansible ツールが正常にインストールされたことを意味します -->    
  3. アンシブル 2.3.1.0  
  4. 設定ファイル= /etc/ansible/ansible.cfg  
  5. 構成されたモジュール検索パス=オーバーライドなしのデフォルト 
  6. pythonバージョン= 2.7.5 (デフォルト、2016年11月6日、00:28:07) [GCC 4.8.5 20150623 (Red Hat 4.8.5-11)]

3) SSH非対話型ログインを作成する

AnsibleはSSH経由でデバイスを管理します。SSHには、パスワード認証とキーペア認証という2つの認証方法があります。前者はシステムとの対話を必要とし、後者は対話型ログインを可能にします。Ansibleでデバイス管理を自動化するには、管理対象デバイスを対話型ログイン用に設定する必要があります。

  1. [root@centos01 ~]# ssh-keygen -t rsa <!-- 鍵ペアを生成 -->    
  2. 公開/秘密 RSA キー ペアを生成しています。  
  3. キーを保存するファイルを入力します (/root/.ssh/id_rsa): <!--キーペアの保存パス-->    
  4. ディレクトリ '/root/.ssh' を作成しました。  
  5. パスフレーズを入力してください(パスフレーズがない場合は空白)。  
  6. <!-- 秘密鍵保護パスワードを入力し、パスワードがない場合は Enter キーを押します -->    
  7. 同じパスフレーズをもう一度入力してください: <!--もう一度入力してください-->    
  8. あなたの識別情報は /root/.ssh/id_rsa に保存されました。  
  9. 公開鍵は /root/.ssh/id_rsa.pub に保存されました。
  10. キーのフィンガープリントは次のとおりです。  
  11. SHA256:cJz6NRTrvMDxX+Jpce6LRnWI3vVEl/zvARL7D10q9WY ルート@centos01  
  12. キーのランダムアート画像は次のとおりです。  
  13. +---[RSA 2048]----+
  14. | . . .|  
  15. | . . + oo|  
  16. | . = o o. oo|  
  17. | = * o..+ *|  
  18. | . S * . =+=*+|
  19. | . o =+XooE|  
  20. | . .. =.++.|  
  21. | ..お ..|
  22. | .. お. |  
  23. +----[SHA256]-----+  
  24. [root@centos01 ~]# ssh-copy-id -i .ssh/id_rsa.pub [email protected] <!--公開鍵をリモートの192.168.100.20にコピーします-->    
  25. [root@centos01 ~]# ssh-copy-id -i .ssh/id_rsa.pub [email protected] <!--公開鍵をリモートの192.168.100.30にコピーします-->  

この時点で、Ansible のデプロイは完了し、Ansible を使用してデバイスを管理できるようになりました。

2. Ansibleの設定

Inventory は、システムの Hosts ファイルに似た、ホスト情報を管理するための Ansible の構成ファイルであり、デフォルトでは /etc/ansible/hosts に保存されます。

ホストファイルでは、デバイスはグループごとに整理されます。Ansibleは、ホストとグループをインベントリによって定義します。インベントリは、ansibleコマンドの-iまたは--inventory-fileオプションを使用して指定します。

  1. [root@centos01 ~]# ansible -i /etc/ansible/hosts web -m ping

デフォルトのインベントリ ファイル (/etc/ansible/hosts) を使用する場合は、インベントリ ファイルの指定を省略することもできます。次に例を示します。

  1. [root@centos01 ~]# ansible web -m ping

Ansibleは、デバイスをグループ化して`/etc/ansible/hosts`ファイルに追加することでデバイスを管理します。そのため、実際の管理を開始する前に、hostsファイルを適切に設定する必要があります。hostsファイルでは、角括弧[ ]で囲まれた部分はグループ名を表し、デバイスリストはホスト名とIPアドレスの両方をサポートします。

デフォルトでは、デバイスはポート22(SSH)経由で管理されます。ターゲットホストがデフォルト以外のSSHポートを使用している場合は、ホスト名の後にコロンを追加し、行区切りで指定できます。また、hostsファイルはワイルドカードをサポートしています。

  1. [root@centos01 ~]# vim /etc/ansible/hosts  
  2. ... <!--ここでは一部の内容は省略されています-->    
  3. [ウェブ]  
  4. 192.168.100.20  
  5. 192.168.100.30
  6. [テスト]  
  7. www.benet.com:222 <!--ポート222経由でデバイスを管理-->    
  8. [郵便]  
  9. yj1.kgc.cn  
  10. yj[2:5].kgc.cn  
  11. <!--[2:5]は2から5までのすべての数字、つまりyj2.kgc.cn、yj3.kgc.cnなどのすべてのホストを表します。-->  

ホストは異なるグループに同時に割り当てることができます。

設定後、hostsファイルに定義されたグループ、またはグループ内の1つ以上のホストに対してリモート操作を実行できます。例:

1) Web グループ内のホスト 192.168.1.2 のみを操作し、--limit パラメータを使用してホストの変更を制限します。

  1. [root@centos01 ~]# ansible web -m command -a "systemctl status httpd" --limit "192.168.100.20"  
  2. 192.168.100.20 | 成功 | rc = 0   > >    
  3. <!--SUCCESS が表示されれば成功したことを意味します。そのため、次の内容が続きます -->    
  4. <!-- httpd サービスをテストする場合、テスト対象のホストにはすでに httpd サービスがインストールされ、実行されている必要があります。-->  

2) IPアドレス192.168.100.20のホストのみで操作します。ホストへの変更はIPアドレスによって制限されます。

  1. [root@centos01 ~]# ansible 192.168.100.20 -m コマンド -a "systemctl status httpd"  
  2. 192.168.100.20 | 成功 | rc = 0   > >  

3) 192.168.100.0 ネットワーク セグメント内のホストのみを操作するには、ホストの変更を制限するためにワイルドカードが必要です。

  1. [root@centos01 ~]# ansible 192.168.1.* -m コマンド -a "systemctl status httpd"  
  2. 192.168.100.20 | 成功 | rc = 0   > >    
  3. ... <!--一部の内容は省略されています-->    
  4. 192.168.100.30 | 成功 | rc = 0   > >    
  5. ... <!--一部の内容は省略されています-->    
  6. <!--実験環境と結果は同じなので、ここでは詳細には触れません-->  

3. Ansibleコマンド

Ansibleのメンテナンスコマンドのほとんどは「ansible」で始まります。ターミナルで「ansible」と入力してTabキーを2回押すと、Ansible関連のすべてのコマンドが補完されます。

  1. [root@centos01 ~]# ansible <!-- Tabキーを繰り返し押します-->    
  2. ansible ansible-console-2 ansible-galaxy ansible-playbook-2.7 ansible-vault-2  
  3. ansible-2 ansible-console-2.7 ansible-galaxy-2 ansible-pull ansible-vault-2.7  
  4. ansible-2.7 ansible-doc ansible-galaxy-2.7 ansible-pull-2  
  5. ansible-connection、ansible-doc-2、ansible-playbook、ansible-pull-2.7  
  6. ansible-console ansible-doc-2.7 ansible-playbook-2 ansible-vault

1) アンシブル

Ansible は、主に次のシナリオにおいて、実稼働環境で最も頻繁に使用されるコマンドの 1 つです。

固定されていない要件。

一時的な、1回限りの操作。

二次開発インターフェース呼び出し。

非永続的な要件とは、Webサーバーグループのディスク使用量の確認や、ファイルを別のマシンにコピーするといった一時的なメンテナンスタスクを指します。これらのタスクは不定期で一時的なアクションを必要とするため、非永続的な要件と呼ばれます。つまり、一時的な、一度限りの操作です。構文は次のとおりです。

  1. Ansible <ホストパターン> [オプション]
  • -v (--verbose): 実行プロセスに関するすべての情報を提供して、詳細な実行プロセス情報を出力します。
  • -i PATH (--inventory=PATH): インベントリ情報を指定します。デフォルトは /etc/ansible/hosts です。
  • -f NUM (--forks=NUM): 同時スレッド数。デフォルトは 5 スレッドです。
  • —private-key=PRIVATE_KEY_FILE: キーファイルを指定します。
  • -m NAME、--module-name=NAME: 実行に使用するモジュールを指定します。
  • -M DIRECTORY (--module-path=DIRECTORY): モジュールが保存されているパスを指定します。デフォルトは /usr/share/ansible です。
  • -a ARGUMENTS (--args=ARGUMENTS): モジュールパラメータを指定します。
  • -u USERNAME (--user=USERNAME): USERNAME でコマンドを実行するリモート ホストを指定します。
  • -l subset (--limit=SUBSET): 実行中のホストの数を制限します。

① 次のコマンドを実行して、すべてのホストが稼働しているかどうかを確認します。

  1. [root@centos01 ~]# ansible all -f 5 -m ping  
  2. <!-- ping モジュールを呼び出すと、all は /etc/ansible/hosts ファイル内のすべてのホストを表します。all グループを作成する必要はありません (デフォルトで存在します) -->    
  3. 192.168.100.20 | SUCCESS = > { <!-- 実行が成功したことを示します -->    
  4. "changed": false、 <!--ホストには変更が加えられていません -->    
  5. "ping": "pong" <!-- pingコマンドの実行結果を示します-->    
  6. }  
  7. 192.168.100.30 |成功= > {  
  8. 「変更済み」: false、  
  9. 「ピン」:「ポン」
  10. }

② 次のコマンドを実行して、Web グループ内のすべてのホストを一覧表示します。

  1. [root@centos01 ~]# ansible web --list <!-- --list: ホスト情報の一覧を示します -->    
  2. ホスト(2):  
  3. 192.168.100.20  
  4. 192.168.100.30

③ Web グループのディスク領域使用量を一括して表示するには、次のコマンドを実行します。

  1. [root@centos01 ~]# ansible web -m command -a "df -hT"  
  2. 192.168.100.30 | 成功 | rc = 0   > >    
  3. ファイルシステムの種類、容量、使用済み、使用可能、使用率、マウントポイント 
  4. /dev/mapper/cl-root xfs 17G 4.4G 13G 26% /  
  5. devtmpfs devtmpfs 897M 0 897M 0% /dev  
  6. tmpfs tmpfs 912M 84K 912M 1% /dev/shm  
  7. tmpfs tmpfs 912M 0 912M 0% /sys/fs/cgroup  
  8. /dev/sda1 xfs 1014M 173M 842M 18% /boot  
  9. tmpfs tmpfs 183M 16K 183M 1% /run/user/42  
  10. tmpfs tmpfs 183M 0 183M 0% /run/user/0  
  11. 192.168.100.20 | 成功 | rc = 0   > >    
  12. ファイルシステムの種類、容量、使用済み、使用可能、使用率、マウントポイント 
  13. /dev/mapper/cl-root xfs 17G 4.3G 13G 26% /  
  14. devtmpfs devtmpfs 897M 0 897M 0% /dev  
  15. tmpfs tmpfs 912M 84K 912M 1% /dev/shm  
  16. tmpfs tmpfs 912M 0 912M 0% /sys/fs/cgroup  
  17. /dev/sda1 xfs 1014M 173M 842M 18% /boot  
  18. tmpfs tmpfs 183M 16K 183M 1% /run/user/42  
  19. tmpfs tmpfs 183M 0 183M 0% /run/user/0  
  20. /dev/sr0 iso9660 4.1G 4.1G 0 100% /mnt

web キーワードを使用する場合、事前に /etc/ansible/hosts ファイルにグループを定義する必要があります。

Ansible が返す結果は非常にユーザーフレンドリーで、通常は 3 色を使用して実行結果を表します。

  • 赤: 実行中にエラーが発生したことを示します。
  • オレンジ色: コマンドの実行後にターゲットの状態が変化したことを示します。
  • 緑: 実行が成功し、ターゲット マシンに変更が加えられていないことを示します。

2) Ansibleドキュメント

Ansible-doc は、man コマンドと同様に、Ansible モジュールのドキュメントを参照するために使用されます。各モジュールの詳細な使用方法と適用例を提供します。構文は次のとおりです。

  1. ansible-doc [オプション] [モジュール……]

サポートされているモジュールのリスト:

  1. [root@centos01 ~]#ansible-doc -l

ping モジュールのドキュメントを照会します。

  1. [root@centos01 ~]# ansible-doc ping  
  2. > PING (/usr/lib/python2.7/site-packages/ansible/modules/system/ping.py)  
  3. このモジュールは単純なテストモジュールで、接続に成功すると常に「pong」を返します。  
  4. プレイブックでは意味をなさないが、`/usr/bin/ansible'から確認するのには便利である。  
  5. ログインできること、そして使用可能なPythonが設定されていることを確認してください。これはICMP pingではありません。  
  6. これは単なる簡単なテストモジュールです。  
  7. 例:  
  8. # 'webservers' にログオンし、json ライブラリを使用して Python を実行できるかどうかをテストします。  
  9. Ansible ウェブサーバー -m ping  
  10. メンテナー: Ansible Core チーム、Michael DeHaan  
  11. メタデータ:  
  12. ステータス: ['stableinterface']  
  13. サポート:コア

3) Ansibleプレイブック

Ansible-playbook は、Linux の sh コマンドや source コマンドと同様に、日常のアプリケーションで最も頻繁に使用されるコマンドであり、一連のタスクを実行するために使用されます。

動作メカニズムは以下のとおりです。事前に記述されたプレイブックファイルを読み込んでタスクを集中的に処理します。Ansible-playbook コマンドの後に、yml 形式のプレイブックファイルが続きます。プレイブックファイルには、実行するタスクコードが含まれています。このコマンドは以下のように使用します。

  1. Ansible プレイブック playbook.yml  
  2. <!--playbook.yml ファイルは事前に準備しておく必要があります。絶対パスが推奨されます -->  

4) Ansibleコンソール

Ansible-consoleは、WindowsのcmdやLinuxのシェルに似た、Ansibleが提供する対話型ツールです。ユーザーは、ansible-consoleによって作成された仮想ターミナルで、シェルのように様々なAnsible組み込みコマンドを使用できるため、対話型シェルに慣れたユーザーにとって優れたユーザーエクスペリエンスを提供します。ターミナルでコマンド「ansible-console」を入力すると、以下が表示されます。

  1. [root@centos01 ~]# ansible-console  
  2. Ansible コンソールへようこそ。
  3.  コマンドの一覧を表示するには、help または ? と入力します。  
  4. <!--ヘルプを表示するにはhelpまたは?と入力してください-->    
  5. root@all (2)[f:5]$ cd web <!--cdコマンドを使用してホストまたはグループを切り替えます-->    
  6. root@web (2)[f:5]$ list <!--現在のデバイスを一覧表示します-->    
  7. 192.168.100.20  
  8. 192.168.100.30  
  9. <!--Tabキーによる補完がサポートされています。現在の仮想端末を終了するには、Ctrl+DまたはCtrl+Cを使用してください。-->  

4. Ansibleモジュール

1) コマンドモジュール

`command` モジュールはリモートホスト上でコマンドを実行しますが、パイプやリダイレクトなどのシェル機能はサポートしていません。よく使用されるパラメータは以下のとおりです。

  • chdir: リモート ホストでコマンドを実行する前に入力するディレクトリ。
  • 作成: コマンド実行時にファイルを作成します。ファイルが既に存在する場合、作成タスクは実行されません。
  • 削除: コマンド実行時にファイルを削除します。ファイルが存在しない場合は、削除タスクは実行されません。
  • 実行可能: コマンドを実行するシェル プログラムを指定します。

すべてのホストで「ls ./」コマンドを実行します。実行前に/homeディレクトリに切り替えてください。手順は以下のとおりです。

  1. [root@centos01 ~]# ansible web -m command -a " chdir =/ ls ./"

2) シェルモジュール

shell モジュールはリモートホスト上でコマンドを実行します。基本的にはリモートホストのシェルプロセスを呼び出し、そのシェル内でサブシェルを開いてコマンドを実行します。command モジュールとは異なり、パイプやリダイレクトなどのシェル機能をサポートしています。

例は次のようになります。

  1. [root@centos01 ~]# ansible web -m shell -a "echo hello world " <!-- 画面に出力 -->    
  2. 192.168.100.20 | 成功 | rc = 0   > >    
  3. こんにちは世界 
  4. 192.168.100.30 | 成功 | rc = 0   > >    
  5. こんにちは世界 
  6. [root@centos01 ~]# ansible web -m shell -a "echo hello world > /1.txt" <!-- ファイル 1.txt に出力 -->    
  7. 192.168.100.20 | 成功 | rc = 0   > >    
  8. 192.168.100.30 | 成功 | rc = 0   > >  

3) モジュールをコピーする

`copy` モジュールは、指定されたホストからリモートホスト上の指定された場所にファイルをコピーするために使用されます。共通のパラメータは次のとおりです。

  • `dest`: ファイルの複製先ディレクトリを絶対パスで指定します。複製元がディレクトリの場合、複製先もディレクトリである必要があります。複製先ファイルが既に存在する場合、その内容は上書きされます。
  • `src` はソースファイルへのパスを指定します。相対パスと絶対パスを使用でき、ディレクトリを直接指定することもできます。ソースがディレクトリの場合、ターゲットもディレクトリである必要があります。
  • mode: コピー中の対象ファイルの権限を指定します(オプション)。
  • owner: コピー中にターゲット ファイルの所有者を指定します (オプション)。
  • group: コピー中の対象ファイルのグループを指定します (オプション)。
  • content: ターゲットホストにコピーするコンテンツを指定します。src と併用することはできません。content で指定されたデータをターゲットファイルにコピーするのと同じです。

例は次のようになります。

  1. [root@centos01 ~]# ansible web -m コピー -a " src =/etc/hosts  
  2. 宛先=/root/a1.hostsモード= 777  所有者=ルート グループ=ルート"  
  3. ローカル ホスト ファイルを、Web グループ内のすべてのホストのホーム ディレクトリにある a1.hosts ディレクトリにコピーします。  
  4. 権限は 777、所有者は root、グループは root -- >  

4) ホスト名モジュール

ホスト名モジュールは、リモートホスト上のホスト名を管理するために使用されます。一般的に使用されるパラメータは次のとおりです。

名前:

ホスト名を指定します。

例は次のようになります。

  1. [root@centos01 ~]# ansible 192.168.100.20 -m ホスト名 -a " name = test "  
  2. <!-- 192.168.100.20 のホスト名を test に変更します -->  
  3. ただし、192.168.100.20 を有効にするには bash と入力する必要があります -- >  

5) yumモジュール

yumモジュールは、yumメカニズムに基づいて、リモートホスト上のパッケージを管理します。一般的に使用されるパラメータは次のとおりです。

  • name: パッケージ名。バージョン番号を含めることができます。バージョンが指定されていない場合は、デフォルトで最新バージョンが使用されます。
  • state=present|latest|absent: パッケージに対して実行する操作を指定します。present はパッケージがインストールされることを示し、latest はパッケージの最新バージョンがインストールされることを示し、absent はパッケージがアンインストールされることを示します。
  • disablerepo: yum を使用してインストールするときにリポジトリの ID を一時的に無効にします。
  • enablerepo: yum を使用してインストールするときにリポジトリの ID を一時的に有効にします。
  • conf_file: デフォルトの設定ファイルの代わりに、実行時に yum によって使用される設定ファイル。
  • disable_gpg_check=yes|no: 整合性チェック機能を有効にするかどうか。

例は次のようになります。

  1. [root@centos01 ~]# ansible web -m shell -a "/usr/bin/rm -rf  
  2. /etc/yum.repos.d/CentOS-*  
  3. <!-- Web グループ ホストの yum リポジトリの一括削除 -->    
  4. [root@centos01 ~]# ansible web -m shell -a "/usr/bin/mount  
  5. /dev/cdrom /mnt" <!-- CD-ROM の一括マウント -->  
  6.   [警告]: マウントを実行するのではなく、マウントモジュールの使用を検討してください 
  7. 192.168.100.20 | 成功 | rc = 0   > >    
  8. マウント: /dev/sr0 は書き込み禁止になっており、読み取り専用モードでマウントされます。  
  9. 192.168.100.30 | 成功 | rc = 0   > >  
  10. マウント: /dev/sr0 は書き込み禁止になっており、読み取り専用モードでマウントされます。  
  11. [root@centos01 ~]# ansible web -m yum -a " name = httpd    
  12. state = present " <!-- httpd プログラムのバッチインストール -->    
  13. [root@centos01 ~]# ansible web -m shell -a "rpm -qa | grep httpd"  
  14. <!-- インストールされた httpd パッケージの一括表示 -->    
  15. [警告]: rpm を実行するのではなく、yum、dnf、または zypper モジュールの使用を検討してください。  
  16. 192.168.100.20 | 成功 | rc = 0   > >  
  17. httpd-2.4.6-67.el7.centos.x86_64  
  18. httpd-tools-2.4.6-67.el7.centos.x86_64  
  19. 192.168.100.30 | 成功 | rc = 0   > >    
  20. httpd-2.4.6-67.el7.centos.x86_64  
  21. httpd-tools-2.4.6-67.el7.centos.x86_64  
  22. [root@centos01 ~]# ansible web -m shell -a "systemctl start httpd" <!-- サービスを一括起動 -->    
  23. [root@centos01 ~]# ansible web -m shell -a "netstat -anptu | grep httpd" <!-- httpd サービスが正常に開始されたかどうかを確認するためのバッチ監視 -->    
  24. 192.168.100.20 | 成功 | rc = 0   > >    
  25. tcp6 0 0 :::80 :::* LISTEN 2072/httpd  
  26. 192.168.100.30 | 成功 | rc = 0   > >    
  27. tcp6 0 0 :::80 :::* LISTEN 3098/httpd

管理側は管理対象側に yum コマンドを送信するだけです。インストールを成功させるには、管理対象側に使用可能な yum リポジトリが必要です。

6) サービスモジュール

サービスモジュールは、リモートホスト上のサービスを管理するために使用されます。共通パラメータは次のとおりです。

  • name: 管理対象のサービスの名前。
  • state=started|stopped|restarted: アクションには、開始、停止、または再起動が含まれます。
  • enable=yes|no: 起動時にサービスを自動的に開始するかどうかを示します。
  • 実行レベル: 起動時に自動的に起動するように有効に設定されている場合、どの実行ターゲットで自動的に起動するかを定義する必要があります。

例は次のようになります。

  1. [root@centos01 ~]# ansible web -m サービス -a "名前= httpd    
  2. 有効=はい 状態=再起動 
  3. <!-- 起動時に httpd サービスを再起動して自動的に開始するように設定します -->  

7) ユーザーモジュール

ユーザーモジュールは主にリモートホスト上のユーザーアカウントを管理するために使用されます。共通パラメータは以下のとおりです。

name: 必須パラメーター、アカウント名。

state=present|absent: アカウントを作成または削除します。present は作成を示し、absent は削除を示します。system=yes|no: システム アカウントであるかどうか。

uid: ユーザーのUID;

グループ: ユーザーの基本グループ

groups: ユーザーの追加グループ。

shell: 使用されるデフォルトのシェル。

home: ユーザーのホームディレクトリ。

mve_home=はい|いいえ:

ホーム ディレクトリが既に存在する場合、既存のホーム ディレクトリを移動しますか?

pssword: ユーザーのパスワード。暗号化された文字列を使用することをお勧めします。

コメント:

ユーザーのコメント情報。

remore=はい|いいえ:

state=absent の場合、ユーザーのホームディレクトリを削除しますか?

ユーザーを作成する例を次に示します。

  1. [root@centos01 ~]# ansible web -m user -a " name = user01    
  2. システム=はい  uid = 502  グループ=ルート グループ=ルート シェル= /etc/nologin  
  3. ホーム=/home/user01パスワード= pwd @123"  
  4. Web グループ内のすべてのホストに UID 502 を持つ新しいシステム ユーザーを作成します。  
  5. グループは root、名前は user01、パスワードは pwd@123 です -- >  

IV. プレイブック設定ファイル

1. 設定ファイルを実行する

Playbook設定ファイルは、簡潔で明瞭、そして明確に定義された構造を特徴とするYAML構文を使用します。シェルスクリプトと同様に、Playbook設定ファイルは特定のニーズに対応するタスクのリストを保存するためのYAMLファイルです。上記のAnsibleコマンドは様々なタスクを実行できますが、複雑なタスクを設定する際にコマンドを1行ずつ入力するのは非常に非効率的です。

より効率的なアプローチは、すべてのタスクコードをプレイブック設定ファイルに配置し、`ansible-playbook` コマンドを使用してファイルを実行することです。これにより、自動化された運用とメンテナンスが可能になります。YAML ファイルの拡張子は通常、.yaml または .yml です。

YAMLの構文は他の高水準言語と似ています。構造はインデントによって示され、項目は「-」で表されます。キーと値は「:」で区切られます。ファイル全体は「--」で始まり、「...」で終わります(以下を参照)。

  1. [root@centos01 ~]# grep -v ^# /etc/ansible/hosts | grep -v ^$ <!--ホスト内のグループ情報を表示-->    
  2. [ウェブ1]  
  3. 192.168.100.20  
  4. [ウェブ2]  
  5. 192.168.100.30  
  6. [root@centos01 ~]# vim /etc/ansible/a.yml  
  7. <!--.yml ファイルを作成し、次の内容を記述します-->    
  8. ---  
  9. - ホスト: web1 <!-- web1 グループを対象とした操作 -->    
  10. remote_user: root <!-- リモート ユーザーは root です -->    
  11. タスク: <!--タスクリスト-->    
  12. - name: adduser <!--タスク名-->    
  13. ユーザー:名前= user1  状態=現在  <!-- ユーザーモジュールを実行してユーザーを作成します -->    
  14. tags: <!--タグタグを作成-->  
  15.   - aaa <!--タグはaaaです-->    
  16. - name: addgroup <!--タスク名-->    
  17. グループ:名前=ルート システム=はい  <!--グループモジュールを実行してグループを作成します-->    
  18. tags: <!--タグタグを作成-->    
  19. - bbb <!--タグは bbb-->    
  20. - ホスト: web2 <!-- web2 グループを対象とした操作 -->    
  21. remote_user: root <!-- リモート ユーザーは root です -->    
  22. タスク: <!--タスクリスト-->    
  23. - name: ファイルを Web にコピー<!--タスク名-->    
  24. コピー: src = /etc/passwd dest = /home <!-- コピーモジュールを実行してファイルをコピーします -->    
  25. tags: <!--タグタグを作成-->    
  26. - ccc <!--タグはcccです-->    
  27. ...

すべてのハイフン ("-") とコロン (":") の後にはスペースが続き、次の画像に示すように、インデントと配置に注意する必要があります。

プレイブックの中核となる要素は次のとおりです。

hosts: タスクの対象ホスト。複数のホストはコロンで区切られます。通常は、/etc/ansible/hosts 内のグループ化情報が使用されます。

remote_user: リモート ホストでは、このタスクを実行するためのデフォルトの ID は root です。

タスク: タスクは特定の定義済みタスクであり、モジュールによって定義された操作のリストです。

ハンドラー: トリガーはタスクと同様に、特定の条件下でのみトリガーされるタスクです。

タスクの実行後にそのステータスが「変更済み」に変わると、対応するハンドラーに「notify」経由で通知して実行をトリガーすることができます。

ロール: ロールは、ホストを分離した後、タスク、ハンドラーなどで構成される特定の構造のセットです。

プレイブックファイルで定義されたタスクは、ansible-playbook コマンドを使用して呼び出し、実行する必要があります。ansible-playbook コマンドの使用方法は次のとおりです。

  1. ansible-playbook [オプション] /PATH/TO/PLAYBOOK.yaml

[option] セクションには次の機能が含まれます。

  • —syntax-check: YAML ファイルの構文をチェックします。
  • -C (--check): 事前テスト。ターゲット ホストの設定は変更されません。
  • —list-hosts: yaml ファイルの影響を受けるホストを一覧表示します。
  • —list-tasks: yaml ファイル内のタスクを一覧表示します。
  • —list-tags: YAML ファイル内のタグを一覧表示します。
  • -t TAGS (--tags=TAGS): このオプションは、指定されたタグを持つタスクのみが実行されることを示します。
  • —skip-tags=SKIP_TAGS: 指定されたタグ以外のタスクが実行されることを意味します。
  • —start-at-task=START_AT: 指定されたタスクから実行を開始します。

プレイブックを実行する例を次に示します。

  1. [root@centos01 ~]# ansible-playbook --syntax-check /etc/ansible/a.yml <!--構文チェック-->    
  2. プレイブック: /etc/ansible/a.yml <!-- エラーがないことを示します -->    
  3. [root@centos01 ~]# ansible-playbook -C /etc/ansible/a.yml  
  4. <!-- a.yml で事前テストを実行する-->    
  5. ... <!--省略されたコンテンツ-->    
  6. 192.168.100.20 :正常= 3     変更= 1     到達不能= 0     失敗= 0    
  7. 192.168.100.30 :正常= 2     変更= 1     到達不能= 0     失敗= 0    
  8. <!-- 返された結果は、エラーがなく、プロセス全体が正常に実行されたことを示します。 -->    
  9. [root@centos01 ~]# ansible-playbook --list-hosts /etc/ansible/a.yml  
  10. <!-- a.yml ファイルにホストをリストします -->    
  11. [root@centos01 ~]# ansible-playbook --list-tasks /etc/ansible/a.yml  
  12. <!-- タスクの一覧 -->    
  13. [root@centos01 ~]# ansible-playbook --list-tags /etc/ansible/a.yml <!-- タグの一覧 -->    
  14. [root@centos01 ~]# ansible-playbook /etc/ansible/a.yml <!--タスクを実行-->    
  15. [root@centos01 ~]# ssh 192.168.100.20 tail -1 /etc/passwd <!--実行結果の確認-->    
  16. ユーザー1:x:1001:1001::/home/user1:/bin/bash  
  17. [root@centos01 ~]# ssh 192.168.100.30 ls -ld /home/passwd  
  18. -rw-r--r--。1 ルート ルート 2342 7月23日 16:06 /home/passwd  
  19. <!--通常は、事前テストのために最初に「-C」コマンドを実行します。問題がなければ、.ymlファイルが実行されます。-->  

通常、まずコマンド `ansible-playbook -C /PATH/TO/PLAYBOOK.yaml` を実行してテストする必要があります。テストが成功したら、コマンド `ansible-playbook /PATH/TO/PLAYBOOK.yml` を実行します。

2. トリガー

トリガーの実行を必要とするタスクでは、`tasks` で定義されたタスクが正常に実行された後、必要に応じて他のタスクをトリガーできます。この場合、`handlers` を定義する必要があります。例えば、Ansible モジュールを使用してターゲットホストの設定ファイルを変更した後、タスクが正常に実行された場合、ターゲットホストのサービスを再起動して変更を有効にするトリガーを設定できます。Handlers トリガーには、以下の特性があります。

  • ハンドラーは、Ansible が提供する条件メカニズムの 1 つです。
  • ハンドラーはタスクに似ていますが、タスクによって通知された場合にのみトリガーされます。
  • ハンドラーはすべてのタスクが完了した後にのみ実行されます。
  • また、何度も通知されても実行されるのは 1 回だけです。
  • ハンドラは定義された順序で順番に実行されます。

ハンドラーでトリガーを使用する方法の例を次に示します。

  1. [root@centos01 ~]# ssh 192.168.100.20 netstat -anpt | grep 80 <!--ホスト192.168.100.20がリッスンしているポートを照会します-->    
  2. tcp6 0 0 :::80 :::* LISTEN 94858/httpd  
  3. <!-- ご覧のとおり、ポート 80 で listen しています。ここで、スクリプトを使用してポート 8080 に変更し、有効にします。 -->    
  4. [root@centos01 ~]# vim /etc/ansible/httpd.yml  
  5. <!--httpd.yml ファイルを編集し、次の内容を記述します-->    
  6. ---  
  7. - ホスト: web1  
  8. リモートユーザー: ルート 
  9. タスク:  
  10. - 名前: ポートの変更 
  11. コマンド: sed -i 's/Listen\ 80/Listen\ 8080/g' /etc/httpd/conf/httpd.conf  
  12. 通知: <!--トリガー条件を設定する-->    
  13. - httpd サーバーを再起動します<!-- タスクが完了したら、「restart httpd server」という関数が実行されます -->    
  14. ハンドラー: <!--トリガーを構成する-->    
  15. - name: httpd サーバーを再起動します<!--トリガー名を指定します。これは、上記の「notify」で指定したトリガー名と同じである必要があります-->    
  16. サービス:名前= httpd   state = restarted <!--トリガータスクはhttpdサービスを再起動することです-->    
  17. ...  
  18. <!-- 書き込み後、保存して終了します。-->    
  19. [root@centos01 ~]# ansible-playbook -C /etc/ansible/httpd.yml <!--事前テストを実行します-->    
  20. [root@centos01 ~]# ansible-playbook /etc/ansible/httpd.yml <!--スクリプトを実行-->    
  21. [root@centos01 ~]# ssh 192.168.100.20 netstat -anpt | grep 8080 <!--リモートホストは既にポート8080で実行されています-->    
  22. tcp6 0 0 :::8080 :::* LISTEN 103594/httpd

3. 役割

将多种不同的tasks的文件集中存储在某个目录下,则该目录就是角色。角色一般存放在/etc/ansible/roles/ 目录,可通过ansible的配置文件来调整默认的角色目录,/etc/ansible/roles/ 目录下有很多子目录,其中每一个子目录对应一个角色,每个角色也有自己的目录结构,如下图所示:

/etc/ansible/roles/为角色集合,该目录下有自定义的各个子目录:

  • mariadb:mysql角色;
  • Apache:httpd角色;
  • Nginx:Nginx角色;

每个角色的定义,以特定的层级目录结构进行组织。以mariadb(mysql角色)为例:

  • files:存放由copy或script等模块调用的文件;
  • templates:存放template模块查找所需要的模板文件的目录,如mysql配置文件模板;
  • tasks:任务存放的目录;
  • handlers:存放相关触发执行的目录;
  • vars:变量存放的目录;
  • meta:用于存放此角色元数据;
  • default:默认变量存放的目录,文件中定义了此角色使用的默认变量;

上述目录中,tasks、handlers、vars、meta、default至少应该包含一个main.yml文件,该目录下也可以有其他.yml文件,但是需要在main.yml文件中用include指令将其他.yml文件包含进来。

有了角色后,可以直接在yaml文件(playbook配置文件)中调用角色,示例如下:

  1. - hosts: web  
  2. リモートユーザー: ルート 
  3. roles:  
  4. - mysql <!--调用角色名-->    
  5. - httpd <!--调用角色名-->  

可以只调用一个角色,也可以调用多个角色,当定义了角色后,用ansible-playbook PALYBOOK文件执行即可。

此时ansible会到角色集合的目录(/etc/ansible/roles)去找mysql和httpd目录,然后依次运行mysql和httpd目录下的所有代码。

下面来个安装及配置mariadb数据库的实例

需求分析:

  • 要求被管理主机上自动安装mariadb,安装完成后上传提前准备好的配置文件至远端主机,重启服务,然后新建testdb数据库,并允许test用户对其拥有所有权限。
  • 被管理主机配置yum仓库,自行配置,若被管理端可以连接互联网,那么直接将yum仓库指向互联网即可。