Ansible-quick-guide

提供:Dev Guides
移動先:案内検索

Ansible-はじめに

*Ansible* は、アプリケーションの展開、イントラサービスオーケストレーション、クラウドプロビジョニング、および他の多くのITツールを自動化するシンプルなオープンソースITエンジンです。

Ansibleは、エージェントやカスタムセキュリティインフラストラクチャを使用しないため、簡単に展開できます。

Ansibleはプレイブックを使用して自動化ジョブを記述し、プレイブックは非常にシンプルな言語を使用します。 YAML (人間が読めるデータシリアル化言語であり、一般に構成ファイルに使用されますが、データが保存されている多くのアプリケーションで使用できます)。これは人間にとって非常に簡単に理解、読み取り、書き込みできます。 したがって、利点は、ITインフラストラクチャのサポート担当者でさえ、プレイブックを読んで理解し、必要に応じてデバッグできることです(YAML –人間が読める形式です)。

Ansibleは、多層展開向けに設計されています。 Ansibleは一度に1つのシステムを管理するのではなく、すべてのシステムが相互に関連していることを記述することでITインフラストラクチャをモデル化します。 Ansibleは完全にエージェントレスです。つまり、Ansibleはsshを介してノードを接続することで機能します(デフォルト)。 ただし、Kerberosなどの他の接続方法が必要な場合は、Ansibleがそのオプションを提供します。

ノードに接続した後、Ansibleは「Ansible Modules」と呼ばれる小さなプログラムをプッシュします。 Ansibleはそのモジュールをノード上で実行し、終了したら削除します。 Ansibleは、単純なテキストファイル(これらはホストファイルです)でインベントリを管理します。 Ansibleはホストファイルを使用して、ホストをグループ化し、プレイブック内の特定のグループに対するアクションを制御できます。

サンプルホストファイル

これは、ホストファイルの内容です-

#File name: hosts
#Description: Inventory file for your application. Defines machine type abc
node to deploy specific artifacts
# Defines machine type def node to upload
metadata.

[abc-node]
#server1 ansible_host = <target machine for DU deployment> ansible_user = <Ansible
user> ansible_connection = ssh
server1 ansible_host = <your host name> ansible_user = <your unix user>
ansible_connection = ssh

[def-node]
#server2 ansible_host = <target machine for artifact upload>
ansible_user = <Ansible user> ansible_connection = ssh
server2 ansible_host = <host> ansible_user = <user> ansible_connection = ssh

構成管理とは

Ansibleの観点からの構成管理とは、企業のハードウェアとソフトウェアを記述する詳細情報を記録して更新することにより、製品のパフォーマンスの構成を維持することを意味します。

通常、このような情報には、インストールされているソフトウェアパッケージに適用された正確なバージョンと更新、ハードウェアデバイスの場所とネットワークアドレスが含まれます。 例えば エンタープライズに存在するすべてのマシンに WebLogic/WebSphere サーバーの新しいバージョンをインストールする場合、手動で各マシンを更新することは現実的ではありません。

最も簡単な方法で記述されたAnsibleプレイブックとインベントリを使用して、すべてのマシンにWebLogic/WebSphereを一度にインストールできます。 必要なことは、インベントリ内のノードのIPアドレスをリストし、プレイブックを作成してWebLogic/WebSphereをインストールすることだけです。 コントロールマシンからプレイブックを実行すると、すべてのノードにインストールされます。

Ansibleの仕組み

以下の図は、Ansibleの動作を示しています。

  • Ansibleは、ノードに接続し、「 Ansible モジュール」と呼ばれる小さなプログラムをノードにプッシュすることで機能します。 Ansible はこれらのモジュールを実行し(デフォルトではSSHを介して)、完了したら削除します。 モジュールのライブラリは任意のマシンに常駐でき、サーバー、デーモン、またはデータベースは必要ありません。

Ansible Works

上の図の管理ノードは、プレイブック全体の実行を制御する制御ノード(管理ノード)です。 これは、インストールを実行しているノードです。 インベントリファイルは、Ansibleモジュールを実行する必要があるホストのリストを提供し、管理ノードはSSH接続を行い、ホストマシンで小さなモジュールを実行し、製品/ソフトウェアをインストールします。

Ansibleの Beauty は、インストールされたモジュールを削除してホストマシンに効果的に接続し、命令を実行し、正常にインストールされた場合、実行されたホストマシンにコピーされたコードを削除することです

Ansible-環境設定

この章では、Ansibleの環境設定について学習します。

インストールプロセス

主に、展開について話すときは2種類のマシンがあります-

  • 制御マシン-他のマシンを管理できるマシン。
  • リモートマシン-制御マシンによって処理/制御されるマシン。

1台の制御マシンで処理される複数のリモートマシンが存在する場合があります。 そのため、リモートマシンを管理するには、制御マシンにAnsibleをインストールする必要があります。

制御マシンの要件

Ansibleは、Python 2(バージョン2.6または2.7)またはPython 3(バージョン3.5以降)がインストールされている任意のマシンから実行できます。

注意-Windowsは制御マシンをサポートしていません。

デフォルトでは、Ansibleは ssh を使用してリモートマシンを管理します。

Ansibleはデータベースを追加しません。 デーモンを起動したり、実行を維持したりする必要はありません。 リモートマシンを管理している間、Ansibleは、インストールまたは実行されているソフトウェアを*残し*ません。 したがって、新しいバージョンに移行するときにアップグレードする方法については疑問の余地はありません。

Ansibleは、上記の要件を持つ制御マシンにさまざまな方法でインストールできます。 Apt、yum、pkg、pip、OpenCSW、pacmanなどから最新リリースをインストールできます。

UbuntuマシンでのAptによるインストール

Ansibleをインストールするには、マシンでPPAを構成する必要があります。 このためには、次のコード行を実行する必要があります-

$ sudo apt-get update
$ sudo apt-get install software-properties-common
$ sudo apt-add-repository ppa:ansible/ansible $ sudo apt-get update
$ sudo apt-get install ansible

上記のコード行を実行すると、Ansibleを介してリモートマシンを管理する準備が整います。 Ansible–versionを実行してバージョンを確認し、Ansibleが正しくインストールされたかどうかを確認するだけです。

Ansible-YAMLの基本

Ansibleは、Ansibleプレイブックを表現するためにYAML構文を使用します。 この章では、YAMLの概要を説明します。 AnsibleはYAMLを使用します。これは、XMLやJSONなどの他のデータ形式と比較すると、人間が理解、読み取り、書き込みが非常に簡単だからです。

すべての YAML ファイルは、オプションで「---」で始まり、「…​」で終わります。

YAMLを理解する

このセクションでは、YAMLデータを表すさまざまな方法を学習します。

キーと値のペア

YAMLは単純なキーと値のペアを使用してデータを表します。 辞書はキーと値のペアで表されます。

-:と値の間にはスペースが必要です。

例:学生の記録

--- #Optional YAML start syntax
james:
   name: james john
   rollNo: 34
   div: B
   sex: male
… #Optional YAML end syntax

略語

略語を使用して辞書を表すこともできます。

James: {name: james john, rollNo: 34, div: B, sex: male}

リストを表す

YAMLでリストを表すこともできます。 リストのすべての要素(メンバー)は、「-」(-およびスペース)で始まる同じインデントで新しい行に記述する必要があります。

---
countries:
   - America
   - China
   - Canada
   - Iceland
…

略語

略語を使用してリストを表すこともできます。

Countries: [‘America’, ‘China’, ‘Canada’, ‘Iceland’]

辞書内のリスト

辞書内のリストを使用できます。つまり、キーの値はリストです。

---
james:
   name: james john
   rollNo: 34
   div: B
   sex: male
   likes:
      - maths
      - physics
      - english
…

辞書のリスト

辞書のリストを作成することもできます。

---
- james:
   name: james john
   rollNo: 34
      div: B
   sex: male
   likes:
      - maths
      - physics
      - english

- robert:
      name: robert richardson
      rollNo: 53
      div: B
      sex: male
   likes:
      - biology
      - chemistry
…

YAMLは、「|」を使用して複数行を表示しながら改行を含め、「>」を使用して複数行を表示しながら改行を抑制します。 このため、大きな行を読み取って編集できます。 どちらの場合も、意図は無視されます。

YAMLで Boolean (True/false)値を表すこともできます。 boolean 値は大文字と小文字を区別しません。

---
- james:
   name: james john
   rollNo: 34
   div: B
   sex: male
   likes:
      - maths
      - physics
      - english

   result:
      maths: 87
      chemistry: 45
      biology: 56
      physics: 70
      english: 80

   passed: TRUE

   messageIncludeNewLines: |
      Congratulation!!
      You passed with 79%

   messageExcludeNewLines: >
      Congratulation!!
      You passed with 79%

'__ === Ansibleに関連する一般的な単語。

*Service/Server* -サービスを提供するマシン上のプロセス。

マシン-物理サーバー、vm(仮想マシン)またはコンテナ。

ターゲットマシン-Ansibleで設定しようとしているマシン。

タスク-Ansibleが管理するアクション(これを実行、削除)など。

 *Playbook* -Ansibleコマンドが書き込まれ、ymlがマシンで実行されるymlファイル。
____ ____

Ansible-アドホックコマンド

アドホックコマンドは、個別に実行してクイック機能を実行できるコマンドです。 これらのコマンドは後で実行する必要はありません。

たとえば、すべての会社のサーバーを再起動する必要があります。 このために、「 /usr/bin/ansible 」からアドホックコマンドを実行します。

これらのアドホックコマンドは構成管理と展開には使用されません。これらのコマンドは一度しか使用されないためです。

ansible-playbookは、構成の管理と展開に使用されます。

並列処理とシェルコマンド

一度に12の並列フォークで会社のサーバーを再起動します。 このため、接続のためにSSHagentをセットアップする必要があります。

$ ssh-agent bash
$ ssh-add ~/.ssh/id_rsa

グループ内のすべての会社のサーバーで再起動を実行するには、「abc」、12並列フォークで-

$ Ansible abc -a "/sbin/reboot" -f 12

デフォルトでは、Ansibleは現在のユーザーアカウントから上記のアドホックコマンドを実行します。 この動作を変更する場合は、次のようにアドホックコマンドでユーザー名を渡す必要があります-

$ Ansible abc -a "/sbin/reboot" -f 12 -u username

ファイル転送

アドホックコマンドを使用して、 SCP (Secure Copy Protocol)の多数のファイルを複数のマシンで並行して実行できます。

多くのサーバー/マシンへのファイルの転送

$ Ansible abc -m copy -a "src =/etc/yum.conf dest =/tmp/yum.conf"

新しいディレクトリを作成する

$ Ansible abc -m file -a "dest =/path/user1/new mode = 777 owner = user1 group = user1 state = directory"

ディレクトリ全体とファイルを削除する

$ Ansible abc -m file -a "dest =/path/user1/new state = absent"

パッケージの管理

アドホックコマンドは、yumおよびaptで使用できます。 以下は、yumを使用したアドホックコマンドです。

次のコマンドは、yumパッケージがインストールされているかどうかを確認しますが、更新はしません。

$ Ansible abc -m yum -a "name = demo-tomcat-1 state = present"

次のコマンドは、パッケージがインストールされていないことを確認します。

$ Ansible abc -m yum -a "name = demo-tomcat-1 state = absent"

次のコマンドは、パッケージの最新バージョンがインストールされていることを確認します。

$ Ansible abc -m yum -a "name = demo-tomcat-1 state = latest"

事実の収集

プレイブックに条件ステートメントを実装するために、ファクトを使用できます。 あなたは、次のアドホックコマンドを介してすべてのあなたの事実のアドホック情報を見つけることができます-

$ Ansible all -m setup

Ansible-プレイブック

この章では、AnsibleのPlaybookについて学習します。

プレイブックは、Ansibleコードが記述されているファイルです。 プレイブックはYAML形式で書かれています。 YAMLは、Yet Another Markup Languageの略です。 Playbook はAnsibleのコア機能の1つであり、実行する内容をAnsibleに伝えます。 これらは、タスクのリストを含むAnsibleのTo Doリストのようなものです。

プレイブックには、ユーザーが特定のマシンで実行したいステップが含まれています。 プレイブックは順番に実行されます。 プレイブックは、Ansibleのすべてのユースケースの構成要素です。

プレイブックの構造

各プレイブックは、その中の1つ以上のプレイの集合です。 PlaybookはPlaysを使用して構成されています。 プレイブック内に複数のプレイがある場合があります。

プレイの機能は、特定のホストに対して定義された一連の命令をマップすることです。

YAMLは厳密に型指定された言語です。そのため、YAMLファイルの書き込み中は特に注意する必要があります。 さまざまなYAMLエディターがありますが、notepad などの単純なエディターを使用することをお勧めします。 notepad を開き、以下のyamlをコピーして貼り付け、言語をYAMLに変更します(言語→YAML)。

YAMLは---(3つのハイフン)で始まります

プレイブックを作成する

サンプルのYAMLファイルを書くことから始めましょう。 yamlファイルに記述された各セクションを見ていきます。

---
   name: install and configure DB
   hosts: testServer
   become: yes

   vars:
      oracle_db_port_value : 1521

   tasks:
   -name: Install the Oracle DB
      yum: <code to install the DB>

   -name: Ensure the installed service is enabled and running
   service:
      name: <your service name>

上記はPlaybookの基本的な構文をカバーしようとしているサンプルPlaybookです。 上記のコンテンツを test.yml としてファイルに保存します。 YAML構文は正しいインデントに従う必要があり、構文の作成中は少し注意する必要があります。

さまざまなYAMLタグ

さまざまなYAMLタグを見てみましょう。 さまざまなタグは以下のとおりです-

name

このタグは、Ansibleプレイブックの名前を指定します。 このプレイブックがやっていることのように。 プレイブックには任意の論理名を付けることができます。

ホスト

このタグは、タスクを実行するホストまたはホストグループのリストを指定します。 ホストのフィールド/タグは必須です。 リストされたタスクを実行するホストをAnsibleに伝えます。 タスクは、同じマシンまたはリモートマシンで実行できます。 複数のマシンでタスクを実行できるため、hostsタグにはホストのグループのエントリも含めることができます。

vars

Varsタグを使用すると、プレイブックで使用できる変数を定義できます。 使用法は、プログラミング言語の変数に似ています。

タスク

すべてのプレイブックには、実行するタスクまたはタスクのリストを含める必要があります。 タスクは、実行する必要があるアクションのリストです。 タスクフィールドには、タスクの名前が含まれています。 これは、ユーザーのヘルプテキストとして機能します。 これは必須ではありませんが、プレイブックのデバッグに役立ちます。 各タスクは、モジュールと呼ばれるコードに内部的にリンクしています。 実行するモジュール、および実行するモジュールに必要な引数。

Ansible-ロール

ロールは、変数、タスク、ファイル、テンプレート、およびモジュールの完全に独立した、または相互に依存するコレクションのフレームワークを提供します。

Ansibleの役割は、プレイブックを複数のファイルに分割するための主要なメカニズムです。 これにより、*複雑なプレイブック*の記述が簡単になり、再利用しやすくなります。 プレイブックの分割により、プレイブックを論理的に再利用可能なコンポーネントに分割できます。

各ロールは基本的に特定の機能または目的の出力に制限されており、そのロール自体または依存関係としてリストされている他のロールのいずれかで結果を提供するために必要なすべてのステップがあります。

役割はプレイブックではありません。 ロールは、独立して使用できる小さな機能ですが、プレイブック内で使用する必要があります。 ロールを直接実行する方法はありません。 ロールには、ロールが適用されるホストの明示的な設定はありません。

トップレベルのプレイブックは、インベントリファイルからホストに適用されるロールへのホストを保持するブリッジです。

新しい役割を作成する

新しい役割を作成するには、役割のディレクトリ構造が不可欠です。

ロール構造

ロールには、ファイルシステム上に構造化されたレイアウトがあります。 デフォルトの構造は変更できますが、ここではデフォルトのままにします。

各役割は、それ自体がディレクトリツリーです。 ロール名は、/rolesディレクトリ内のディレクトリ名です。

$ ansible-galaxy -h

使用法

ansible-galaxy [delete|import|info|init|install|list|login|remove|search|setup] [--help] [options] ...

オプション

  • -h、--help -このヘルプメッセージを表示して終了します。
  • -v、-verbose -詳細モード(詳細は-vvv、接続デバッグを有効にするには-vvvv)
  • *-version *-プログラムのバージョン番号を表示して終了します。

役割ディレクトリの作成

上記のコマンドにより、役割ディレクトリが作成されました。

$ ansible-galaxy init vivekrole
ERROR! The API server (https://galaxy.ansible.com/api/) is not responding, please try again later.

$ ansible-galaxy init --force --offline vivekrole
- vivekrole was created successfully

$ tree vivekrole/
vivekrole/
├── defaults
│   └── main.yml
├── files ├── handlers
│   └── main.yml
├── meta
│   └── main.yml
├── README.md ├── tasks
│   └── main.yml
├── templates ├── tests │   ├── inventory
│   └── test.yml
└── vars
    └── main.yml

8 directories, 8 files

この例ではすべてのディレクトリが使用されるわけではなく、例ではそれらの一部の使用方法を示します。

Playbookでのロールの活用

これは、デモ用に作成したプレイブックのコードです。 このコードは、プレイブックvivek_orchestrate.ymlのものです。 ホスト: tomcat-node を定義し、 install-tomcat および start-tomcat の2つのロールを呼び出しました。

問題の声明は、Ansible経由でマシンに展開する必要がある戦争があるということです。

---
- hosts: tomcat-node
roles:
   - {role: install-tomcat}
   - {role: start-tomcat}

プレイブックを実行しているディレクトリ構造のコンテンツ。

ディレクトリ

$ ls
ansible.cfg  hosts  roles  vivek_orchestrate.retry vivek_orchestrate.yml

ロール

各ディレクトリの下にtasksディレクトリがあり、main.ymlが含まれています。 install-tomcatのmain.ymlの内容は次のとおりです-

---
#Install vivek artifacts
-
   block:
      - name: Install Tomcat artifacts
         action: >
            yum name = "demo-tomcat-1" state = present
         register: Output

   always:
      - debug:
         msg:
            - "Install Tomcat artifacts task ended with message: {{Output}}"
            - "Installed Tomcat artifacts - {{Output.changed}}"

開始Tomcatのmain.ymlの内容は次のとおりです-

#Start Tomcat
-
   block:
      - name: Start Tomcat
      command: <path of tomcat>/bin/startup.sh"
      register: output
      become: true

   always:
      - debug:
         msg:
            - "Start Tomcat task ended with message: {{output}}"
            - "Tomcat started - {{output.changed}}"

プレイブックをロールに分割する利点は、Tomcatのインストール機能を使用したい人は誰でもTomcatのインストールロールを呼び出すことができることです。

プレイブックをロールに分割する

ロール用でない場合、それぞれのロールのmain.ymlのコンテンツをプレイブック yml ファイルにコピーできます。 しかし、モジュール性を持たせるために、役割が作成されました。

再利用可能な機能として再利用できる論理エンティティは、そのエンティティをロールに移動できます。 この例は上に示されています

プレイブックを実行するコマンドを実行しました。

-vvv option for verbose output – verbose output
$ cd vivek-playbook/

これは、プレイブックを実行するコマンドです

$ sudo ansible-playbook -i hosts vivek_orchestrate.yml –vvv
-----------------------------------------------------------------
-----------------------------------------------------------------------

出力

生成された出力は、画面に表示されるとおりです-

*/users/demo/vivek-playbook/ansible.cfg* を構成ファイルとして使用します。
PLAYBOOK: vivek_orchestrate.yml *********************************************************
********************************************************** *
1 plays in vivek_orchestrate.yml

PLAY [tomcat-node]* *********************************************************************
******** ************************************************ *

TASK [Gathering Facts]* ************************************************
****************************** ******************************************** *
Tuesday 21 November 2017  13:02:05 +0530 (0:00:00.056) 0:00:00.056* **** *
Using module file/usr/lib/python2.7/sitepackages/ansible/modules/system/setup.py
<localhost> ESTABLISH LOCAL CONNECTION FOR USER: root
<localhost> EXEC/bin/sh -c 'echo ~ && sleep 0'
<localhost> EXEC/bin/sh -c '( umask 77 && mkdir -p "` echo
  /root/.ansible/tmp/ansible-tmp-1511249525.88-259535494116870 `" &&
   echo ansible-tmp-1511249525.88-259535494116870="`
   echo/root/.ansible/tmp/ansibletmp-1511249525.88-259535494116870 `" ) && sleep 0'
<localhost> PUT/tmp/tmpPEPrkd TO
  /root/.ansible/tmp/ansible-tmp-1511249525.88259535494116870/setup.py
<localhost> EXEC/bin/sh -c 'chmod u+x
  /root/.ansible/tmp/ansible-tmp1511249525.88-259535494116870/
  /root/.ansible/tmp/ansible-tmp-1511249525.88259535494116870/setup.py && sleep 0'
<localhost> EXEC/bin/sh -c '/usr/bin/python
  /root/.ansible/tmp/ansible-tmp1511249525.88-259535494116870/setup.py; rm -rf
   "/root/.ansible/tmp/ansible-tmp1511249525.88-259535494116870/" >/dev/null 2>&1 && sleep 0'
ok: [server1]
META: ran handlers

TASK [install-tomcat : Install Tomcat artifacts]* **********************************
************************************************************** *
task path:/users/demo/vivek-playbook/roles/install-tomcat/tasks/main.yml:5
Tuesday 21 November 2017  13:02:07 +0530 (0:00:01.515)       0:00:01.572* **** *
Using module file/usr/lib/python2.7/sitepackages/ansible/modules/packaging/os/yum.py
<localhost> ESTABLISH LOCAL CONNECTION FOR USER: root
<localhost> EXEC/bin/sh -c 'echo ~ && sleep 0'
<localhost> EXEC/bin/sh -c '( umask 77 && mkdir -p "` echo
  /root/.ansible/tmp/ansible-tmp-1511249527.34-40247177825302 `" && echo
   ansibletmp-1511249527.34-40247177825302="` echo
  /root/.ansible/tmp/ansible-tmp1511249527.34-40247177825302 `" ) && sleep 0'
<localhost> PUT/tmp/tmpu83chg TO
  /root/.ansible/tmp/ansible-tmp-1511249527.3440247177825302/yum.py
<localhost> EXEC/bin/sh -c 'chmod u+x
  /root/.ansible/tmp/ansible-tmp1511249527.34-40247177825302/
  /root/.ansible/tmp/ansible-tmp-1511249527.3440247177825302/yum.py && sleep 0'
<localhost> EXEC/bin/sh -c '/usr/bin/python
  /root/.ansible/tmp/ansible-tmp1511249527.34-40247177825302/yum.py; rm -rf
   "/root/.ansible/tmp/ansible-tmp1511249527.34-40247177825302/" >/dev/null 2>
   &1 && sleep 0'
changed: [server1] => {
   "changed": true,
   "invocation": {
      "module_args": {
         "conf_file": null,
         "disable_gpg_check": false,
         "disablerepo": null,
         "enablerepo": null,
         "exclude": null,
         "install_repoquery": true,
         "installroot": "/",
         "list": null,
         "name": ["demo-tomcat-1"],
         "skip_broken": false,
         "state": "present",
         "update_cache": false,
         "validate_certs": true
      }
   },
   "msg": "",
   "rc": 0,
   "results": [
      "Loaded plugins: product-id,
      search-disabled-repos,
      subscriptionmanager\nThis system is not registered to Red Hat Subscription Management.
      You can use subscription-manager to register.\nResolving Dependencies\n-->
      Running transaction check\n--->
      Package demo-tomcat-1.noarch 0:SNAPSHOT-1 will be installed\n--> Finished Dependency
      Resolution\n\nDependencies Resolved\n
      \n================================================================================\n
      Package Arch Version Repository
      Size\n==================================================================\nInstalling:\n
      demo-tomcat-1 noarch SNAPSHOT-1 demo-repo1 7.1 M\n\nTransaction
      Summary\n==================================================================\nInstall  1
      Package\n\nTotal download size: 7.1 M\nInstalled size: 7.9 M\nDownloading
         packages:\nRunning transaction
      check\nRunning transaction test\nTransaction test succeeded\nRunning transaction\n  Installing :
      demotomcat-1-SNAPSHOT-1.noarch 1/1 \n  Verifying  :
      demo-tomcat-1-SNAPSHOT-1.noarch 1/1 \n\nInstalled:\n
      demo-tomcat-1.noarch 0:SNAPSHOT-1 \n\nComplete!\n"
   ]
}

TASK [install-tomcat : debug]* *********************************************************
************************************************************************** *
task path:/users/demo/vivek-playbook/roles/install-tomcat/tasks/main.yml:11
Tuesday 21 November 2017  13:02:13 +0530 (0:00:06.757) 0:00:08.329* **** *
ok: [server1] => {
   "changed": false,
   "msg": [
      "Install Tomcat artifacts task ended with message: {
         u'msg': u'', u'changed': True, u'results':
         [u'Loaded plugins: product-id,
         search-disabledrepos,
         subscription-manager\\nThis system is not registered to Red Hat Subscription Management.
         You can use subscription-manager to register.\\nResolving Dependencies\\n-->
         Running transaction check\\n--->
         Package demo-tomcat-1.noarch 0:SNAPSHOT-1 will be installed\\n-->
         Finished Dependency Resolution\\n
         \\nDependencies
         Resolved\\n\\n==================================================================\\n
         Package Arch Version Repository
         Size\\n========================================================================
         =====\\nInstalling:\\n demo-tomcat-1 noarch SNAPSHOT-1 demo-repo1 7.1 M\\n\\nTransaction
         Summary\\n=========================================================\\nInstall  1
         Package\\n\\nTotal download size: 7.1 M\\nInstalled size: 7.9 M\\nDownloading
            packages:\\nRunning
         transaction check\\nRunning transaction test\\nTransaction test succeeded\\nRunning
            transaction\\n
         Installing : demo-tomcat-1-SNAPSHOT-1.noarch 1/1 \\n  Verifying  :
         demo-tomcat-1-SNAPSHOT-1.noarch
         1/1 \\n\\nInstalled:\\n  demo-tomcat-1.noarch 0:SNAPSHOT-1  \\n\\nComplete!\\n'], u'rc': 0
      }",
      "Installed Tomcat artifacts - True"
   ]
}

TASK [install-tomcat : Clean DEMO environment]* ***************************************
*********************************************************** *
task path:/users/demo/vivek-playbook/roles/install-tomcat/tasks/main.yml:19
Tuesday 21 November 2017  13:02:13 +0530 (0:00:00.057) 0:00:08.387* **** *
[WARNING]: when statements should not include jinja2 templating delimiters such as {{ }} or
   {% %}. Found: {{installationOutput.changed}}

Using module file/usr/lib/python2.7/sitepackages/ansible/modules/files/file.py
<localhost> ESTABLISH LOCAL CONNECTION FOR USER: root
<localhost> EXEC/bin/sh -c 'echo ~ && sleep 0'
<localhost> EXEC/bin/sh -c '( umask 77 && mkdir -p "` echo
  /root/.ansible/tmp/ansible-tmp-1511249534.13-128345805983963 `" && echo
   ansible-tmp-1511249534.13-128345805983963="` echo
  /root/.ansible/tmp/ansibletmp-1511249534.13-128345805983963 `" ) && sleep 0'
<localhost> PUT/tmp/tmp0aXel7 TO
  /root/.ansible/tmp/ansible-tmp-1511249534.13128345805983963/file.py
<localhost> EXEC/bin/sh -c 'chmod u+x
  /root/.ansible/tmp/ansible-tmp1511249534.13-128345805983963/
  /root/.ansible/tmp/ansible-tmp-1511249534.13128345805983963/file.py && sleep 0'
<localhost> EXEC/bin/sh -c '/usr/bin/python
  /root/.ansible/tmp/ansible-tmp1511249534.13-128345805983963/file.py; rm -rf
   "/root/.ansible/tmp/ansible-tmp1511249534.13-128345805983963/" >/dev/null 2>&1
   && sleep 0'
changed: [server1] => {
   "changed": true,
      "diff": {
         "after": {
            "path": "/users/demo/DEMO",
            "state": "absent"
      },
      "before": {
         "path": "/users/demo/DEMO",
         "state": "directory"
      }
   },

   "invocation": {
      "module_args": {
         "attributes": null,
         "backup": null,
         "content": null,
         "delimiter": null,
         "diff_peek": null,
         "directory_mode": null,
         "follow": false,
         "force": false,
         "group": null,
         "mode": null,
         "original_basename": null,
         "owner": null,
         "path": "/users/demo/DEMO",
         "recurse": false,
         "regexp": null,
         "remote_src": null,
         "selevel": null,
         "serole": null,
         "setype": null,
         "seuser": null,
         "src": null,
         "state": "absent",
         "unsafe_writes": null,
         "validate": null
      }
   },
   "path": "/users/demo/DEMO",
   "state": "absent"
}

TASK [install-tomcat : debug]* *******************************************************
************************************************************ *
task path:/users/demo/vivek-playbook/roles/install-tomcat/tasks/main.yml:29
Tuesday 21 November 2017  13:02:14 +0530 (0:00:00.257)       0:00:08.645* **** *
ok: [server1] => {
   "changed": false,
   "msg": [
      "Clean DEMO environment task ended with message:{u'diff': {u'after': {u'path':
         u'/users/demo/DEMO', u'state': u'absent'},
      u'before': {u'path': u'/users/demo/DEMO', u'state': u'directory'}}, u'state': u'absent',
         u'changed': True, u'path': u'/users/demo/DEMO'}",
      "check value  :True"
   ]
}

TASK [install-tomcat : Copy Tomcat to user home]* ************************************
******************************************************* *
task path:/users/demo/vivek-playbook/roles/install-tomcat/tasks/main.yml:37
Tuesday 21 November 2017  13:02:14 +0530 (0:00:00.055)       0:00:08.701* **** *
[WARNING]: when statements should not include jinja2 templating delimiters such as {{ }} or
   {% %}. Found: {{installationOutput.changed}}

Using module file/usr/lib/python2.7/sitepackages/ansible/modules/commands/command.py
<localhost> ESTABLISH LOCAL CONNECTION FOR USER: root
<localhost> EXEC/bin/sh -c 'echo ~ && sleep 0'
<localhost> EXEC/bin/sh -c '( umask 77 && mkdir -p "` echo
  /root/.ansible/tmp/ansible-tmp-1511249534.43-41077200718443 `" && echo
   ansibletmp-1511249534.43-41077200718443="` echo
  /root/.ansible/tmp/ansible-tmp1511249534.43-41077200718443 `" ) && sleep 0'
<localhost> PUT/tmp/tmp25deWs TO
  /root/.ansible/tmp/ansible-tmp-1511249534.4341077200718443/command.py
<localhost> EXEC/bin/sh -c 'chmod u+x
  /root/.ansible/tmp/ansible-tmp1511249534.43-41077200718443/
  /root/.ansible/tmp/ansible-tmp-1511249534.4341077200718443/command.py && sleep 0'
<localhost> EXEC/bin/sh -c '/usr/bin/python
  /root/.ansible/tmp/ansible-tmp1511249534.43-41077200718443/command.py; rm -rf
   "/root/.ansible/tmp/ansibletmp-1511249534.43-41077200718443/" >/dev/null 2>&1
   && sleep 0'
changed: [server1] => {
   "changed": true,
   "cmd": [
      "cp",
      "-r",
      "/opt/ansible/tomcat/demo",
      "/users/demo/DEMO/"
   ],
   "delta": "0:00:00.017923",
   "end": "2017-11-21 13:02:14.547633",
   "invocation": {
      "module_args": {
         "_raw_params": "cp -r/opt/ansible/tomcat/demo/users/demo/DEMO/",
         "_uses_shell": false,
         "chdir": null,
         "creates": null,
         "executable": null,
         "removes": null,
         "warn": true
      }
   },
   "rc": 0,
   "start": "2017-11-21 13:02:14.529710",
   "stderr": "",
   "stderr_lines": [],
   "stdout": "",
   "stdout_lines": []
}

TASK [install-tomcat : debug]* *******************************************************
********************************************************* *
task path:/users/demo/vivek-playbook/roles/install-tomcat/tasks/main.yml:47
Tuesday 21 November 2017  13:02:14 +0530 (0:00:00.260)       0:00:08.961* **** *
ok: [server1] => {
   "changed": false,
   "msg": "Copy Tomcat to user home task ended with message {
      'stderr_lines': [], u'changed': True, u'end': u'2017-11-21 13:02:14.547633', u'stdout':
      u'', u'cmd': [u'cp', u'-r', u'/opt/ansible/tomcat/demo', u'/users/demo/DEMO/'], u'rc': 0,
      u'start': u'2017-11-21 13:02:14.529710', u'stderr': u'', u'delta': u'0:00:00.017923',
      'stdout_lines': []}"
}

TASK [start-tomcat : Start Tomcat]* *************************************************
********************************************************* *
task path:/users/demo/vivek-playbook/roles/start-tomcat/tasks/main.yml:5
Tuesday 21 November 2017  13:02:14 +0530 (0:00:00.044)       0:00:09.006* **** *
Using module file/usr/lib/python2.7/sitepackages/ansible/modules/commands/command.py
<localhost> ESTABLISH LOCAL CONNECTION FOR USER: root
<localhost> EXEC/bin/sh -c 'echo ~ && sleep 0'
<localhost> EXEC/bin/sh -c '( umask 77 && mkdir -p "` echo
  /root/.ansible/tmp/ansible-tmp-1511249534.63-46501211251197 `" && echo
   ansibletmp-1511249534.63-46501211251197="` echo
  /root/.ansible/tmp/ansible-tmp1511249534.63-46501211251197 `" ) && sleep 0'
<localhost> PUT/tmp/tmp9f06MQ TO
  /root/.ansible/tmp/ansible-tmp-1511249534.6346501211251197/command.py
<localhost> EXEC/bin/sh -c 'chmod u+x
  /root/.ansible/tmp/ansible-tmp1511249534.63-46501211251197/
  /root/.ansible/tmp/ansible-tmp-1511249534.6346501211251197/command.py && sleep 0'
<localhost> EXEC/bin/sh -c '/usr/bin/python
  /root/.ansible/tmp/ansible-tmp1511249534.63-46501211251197/command.py; rm -rf
   "/root/.ansible/tmp/ansibletmp-1511249534.63-46501211251197/" >/dev/null 2>&1
   && sleep 0'
changed: [server1] => {
   "changed": true,
   "cmd": [ "/users/demo/DEMO/bin/startup.sh" ],
   "delta": "0:00:00.020024",
   "end": "2017-11-21 13:02:14.741649",
   "invocation": {
      "module_args": {
         "_raw_params": "/users/demo/DEMO/bin/startup.sh",
         "_uses_shell": false,
         "chdir": null,
         "creates": null,
         "executable": null,
         "removes": null,
         "warn": true
      }
   },
   "rc": 0,
   "start": "2017-11-21 13:02:14.721625",
   "stderr": "",
   "stderr_lines": [],
   "stdout": "Tomcat started.",
   "stdout_lines": [ "Tomcat started." ]
}

TASK [start-tomcat : debug]* ************************************************
********************************************************************* *
task path:/users/demo/vivek-playbook/roles/start-tomcat/tasks/main.yml:10
Tuesday 21 November 2017  13:02:14 +0530 (0:00:00.150)       0:00:09.156* **** *
ok: [server1] => {
   "changed": false,
   "msg": [
      "Start Tomcat task ended with message: {'
         stderr_lines': [], u'changed': True, u'end': u'2017-11-21 13:02:14.741649', u'stdout':
         u'Tomcat started.', u'cmd': [u'/users/demo/DEMO/bin/startup.sh'], u'rc': 0, u'start':
         u'2017-11-21 13:02:14.721625', u'stderr': u'', u'delta': u'0:00:00.020024',
         'stdout_lines': [u'Tomcat started.']}",
      "Tomcat started - True"
   ]
}
META: ran handlers
META: ran handlers

PLAY RECAP* ******************************************************************************
******************************************************** *
server1  : ok = 9    changed = 4    unreachable = 0    failed = 0

Tuesday 21 November 2017  13:02:14 +0530 (0:00:00.042)       0:00:09.198* *****
===============================================================================
install-tomcat : Install Tomcat artifacts ------------------------------- 6.76s
/users/demo/vivek-playbook/roles/install-tomcat/tasks/main.yml:5 --------------
Gathering Facts --------------------------------------------------------- 1.52s
 ------------------------------------------------------------------------------
install-tomcat : Copy Tomcat to user home ------------------------------- 0.26s
/users/demo/vivek-playbook/roles/install-tomcat/tasks/main.yml:37 -------------

install-tomcat : Clean DEMO environment --------------------------------- 0.26s
/users/demo/vivek-playbook/roles/install-tomcat/tasks/main.yml:19 -------------

start-tomcat : Start Tomcat --------------------------------------------- 0.15s
/users/demo/vivek-playbook/roles/start-tomcat/tasks/main.yml:5 ----------------

install-tomcat : debug -------------------------------------------------- 0.06s
/users/demo/vivek-playbook/roles/install-tomcat/tasks/main.yml:11 -------------

install-tomcat : debug -------------------------------------------------- 0.06s
/users/demo/vivek-playbook/roles/install-tomcat/tasks/main.yml:29 -------------

install-tomcat : debug -------------------------------------------------- 0.04s
/users/demo/vivek-playbook/roles/install-tomcat/tasks/main.yml:47 -------------

start-tomcat : debug ---------------------------------------------------- 0.04s
/users/demo/vivek-playbook/roles/start-tomcat/tasks/main.yml:10 ---------------

次のURLにアクセスすると、以下に示すページが表示されます- http://10.76.0.134:11677/HelloWorld/HelloWorld

Hello World

デプロイされた戦争には、「Hello World」を表示するサーブレットがあります。 詳細な出力は、ansible.cfgファイルに追加されたエントリのために、すべてのタスクにかかった時間を示しています-

[defaults]
callback_whitelist = profile_tasks

Ansible-変数

プレイブックの変数は、プログラミング言語で変数を使用するのと*非常に似ています*。 値を使用して変数に割り当て、プレイブックの任意の場所で使用するのに役立ちます。 変数の値に条件を付けて、それに応じてプレイブックで使用できます。

- hosts : <your hosts>
vars:
tomcat_port : 8080

上記の例では、変数名 tomcat_port を定義し、その変数に値8080を割り当て、必要な場所でプレイブックで使用できます。

共有された例から参照を取得します。 次のコードは、ロールの1つ(install-tomcat)からのものです-

block:
   - name: Install Tomcat artifacts
      action: >
      yum name = "demo-tomcat-1" state = present
      register: Output

   always:
      - debug:
         msg:
            - "Install Tomcat artifacts task ended with message: {{Output}}"
            - "Installed Tomcat artifacts - {{Output.changed}}"

ここで、出力は使用される変数です。

上記のコードで使用されているすべてのキーワードを見てみましょう-

  • block -特定のブロックを実行するためのAnsible構文。
  • name -ブロックの関連名-これはロギングで使用され、すべてのブロックが正常に実行されたことをデバッグするのに役立ちます。
  • アクション-アクションタグの隣のコードは実行されるタスクです。 ここでも、アクションはyamlで使用されるAnsibleキーワードです。
  • register -アクションの出力はregisterキーワードを使用して登録され、Outputはアクション出力を保持する変数名です。
  • always -再びAnsibleキーワード、それは以下が常に実行されることを示します。
  • msg -メッセージを表示します。

変数の使用法-\ {\ {出力}}

これにより、変数Outputの値が読み取られます。 また、「msg」タブで使用されるため、出力変数の値が出力されます。

さらに、変数のサブプロパティも使用できます。 出力が変更されたかどうかを\ {\ {Output.changed}}でチェックし、それに応じて使用する場合と同様です。

プレイブックでの例外処理

Ansibleの例外処理は、プログラミング言語の例外処理に似ています。 プレイブックでの例外処理の例を以下に示します。

tasks:
   - name: Name of the task to be executed
      block:
         - debug: msg = 'Just a debug message , relevant for logging'
         - command: <the command to execute>

      rescue:
         - debug: msg = 'There was an exception.. '
         - command: <Rescue mechanism for the above exception occurred)

      always:
         - debug: msg = "this will execute in all scenarios. Always will get logged"

例外処理の構文は次のとおりです。

  • rescue および always は、例外処理に固有のキーワードです。
  • ブロックは、コードが書き込まれる場所です(Unixマシンで実行されるもの)。
  • ブロック機能内に書き込まれたコマンドが失敗すると、実行はレスキューブロックに到達し、実行されます。 ブロック機能下のコマンドにエラーがない場合、レスキューは実行されません。
  • *常に*はすべての場合に実行されます。
  • したがって、同じことをjavaと比較すると、try、catch、およびfinallyブロックに似ています。
  • ここで、 Block は、実行するコードを記述する try block に似ており、 rescuecatch block に似ており、 alwaysfinally に似ています。

ループ

以下は、Ansibleでのループの使用法を示す例です。

タスクは、すべてのwarファイルのセットを1つのディレクトリーからtomcat webappsフォルダーにコピーすることです。

以下の例で使用されるコマンドのほとんどは、以前にすでに説明されています。 ここでは、ループの使用に集中します。

最初は「shell」コマンドでls *.warを実行しました。 そのため、ディレクトリ内のすべてのwarファイルがリストされます。

そのコマンドの出力は、outputという変数で取得されます。

ループするには、「with_items」構文が使用されています。

with_items: "\ {\ {output.stdout_lines}}"→ output.stdout_linesは行ごとの出力を提供し、Ansibleのwith_itemsコマンドで出力をループします。

with_itemsコマンドでstdout_linesを使用した方法を理解できるようにするために、サンプル出力を添付します。

---
#Tsting
- hosts: tomcat-node
   tasks:
      - name: Install Apache
      shell: "ls* .war"
      register: output
      args:
         chdir:/opt/ansible/tomcat/demo/webapps

      - file:
         src: '/opt/ansible/tomcat/demo/webapps/{{ item }}'
         dest: '/users/demo/vivek/{{ item }}'
         state: link
      with_items: "{{output.stdout_lines}}"

ループ

ブロック

プレイブック全体がブロックに分割されています。 実行するステップの最小部分はブロックで記述されます。 特定の命令をブロックで記述すると、機能を分離し、必要に応じて例外処理で処理できます。

ブロックの例は、上記の変数の使用法、例外処理、およびループで説明されています。

条件付き

条件に基づいて特定のステップを実行する必要がある場合、条件が使用されます。

---
#Tsting
- hosts: all
   vars:
      test1: "Hello Vivek"
   tasks:
      - name: Testing Ansible variable
      debug:
         msg: "Equals"
         when: test1 == "Hello Vivek"

この場合、when条件で述べたようにtest1変数が等しいため、Equalsが出力されます。 when は、すべてのプログラミング言語と同様に、論理ORおよび論理AND条件で使用できます。

条件付き出力

test1変数の値をHello Vivekから変更して、Hello Worldと言って出力を確認するだけです。

条件付き出力の変更

Ansible-高度な実行

この章では、Ansibleによる高度な実行とは何かを学びます。

タスクによる実行を制限する方法

これは、プレイブック全体ではなく、1つの実行のみを実行する必要がある非常に重要な実行戦略です。 たとえば、サーバーを停止するだけで(運用上の問題が発生した場合)、サーバーの起動のみを希望するパッチの適用をポストするとします。

元のプレイブックでは、ストップとスタートは同じプレイブックの異なる役割の一部でしたが、これはタグの使用で処理できます。 異なるロールに異なるタグを提供し(これにはタスクが割り当てられます)、したがって、指定されたロール/タスクのみが実行されるエグゼキューターによって提供されるタグに基づきます。 したがって、上記の例では、次のようなタグを追加できます-

- {role: start-tomcat, tags: ['install']}}

次のコマンドは、タグの使用に役立ちます-

ansible-playbook -i hosts <your yaml> --tags "install" -vvv

上記のコマンドを使用すると、start-tomcatロールのみが呼び出されます。 提供されるタグでは大文字と小文字が区別されます。 完全一致がコマンドに渡されていることを確認してください。

ホストによる実行を制限する方法

特定のホストで特定のステップを実行するには、2つの方法があります。 特定の役割に対して、ホストを定義します-特定の役割を実行する特定のホストについて。

- hosts: <A>
   environment: "{{your env}}"
   pre_tasks:
      - debug: msg = "Started deployment.
      Current time is {{ansible_date_time.date}} {{ansible_date_time.time}} "

   roles:
      - {role: <your role>, tags: ['<respective tag>']}
   post_tasks:
      - debug: msg = "Completed deployment.
      Current time is {{ansible_date_time.date}} {{ansible_date_time.time}}"

- hosts: <B>
   pre_tasks:
      - debug: msg = "started....
      Current time is {{ansible_date_time.date}} {{ansible_date_time.time}} "

   roles:
      - {role: <your role>, tags: ['<respective tag>']}
   post_tasks:
      - debug: msg = "Completed the task..
      Current time is {{ansible_date_time.date}} {{ansible_date_time.time}}"

上記の例のように、提供されるホストに応じて、それぞれのロールのみが呼び出されます。 これで、ホストAとBがホスト(インベントリファイル)に定義されました。

代替ソリューション

別の解決策は、変数を使用してプレイブックのホストを定義し、*-extra-vars *を介して特定のホストアドレスを渡すことです。

# file: user.yml  (playbook)
---
- hosts: '{{ target }}'
   user: ...
playbook contd….

プレイブックの実行

ansible-playbook user.yml --extra-vars "target = "<your host variable>"

\ {\ {target}}が定義されていない場合、プレイブックは何もしません。 必要に応じて、hostsファイルのグループもパススルーできます。 余分な変数が提供されない場合、これは害になりません。

単一のホストを対象としたプレイブック

$ ansible-playbook user.yml --extra-vars "target = <your hosts variable>" --listhosts

Ansible-トラブルシューティング

Ansibleプレイブックをデバッグするための最も一般的な戦略は、以下に示すモジュールを使用することです-

デバッグと登録

これら2つは、Ansibleで利用可能なモジュールです。 デバッグのために、2つのモジュールを慎重に使用する必要があります。 以下に例を示します。

冗長性を使用する

Ansibleコマンドを使用すると、冗長レベルを指定できます。 冗長レベル1(-v)または2(-vv)でコマンドを実行できます。

重要なポイント

このセクションでは、いくつかの例を見て、いくつかの概念を理解します。

変数で始まる引数を引用していない場合。 例えば、

vars:
   age_path: {{vivek.name}}/demo/

{{vivek.name}}

これによりエラーがスローされます。

溶液

vars:
   age_path: "{{vivek.name}}/demo/" – marked in yellow is the fix.

How to use register -> Copy this code into a yml file say test.yml and run it
---
#Tsting
- hosts: tomcat-node
   tasks:

   - shell:/usr/bin/uptime
      register: myvar
      - name: Just debugging usage
         debug: var = myvar

コマンドAnsible-playbook -i hosts test.ymlを介してこのコードを実行すると、次のような出力が得られます。

yamlが表示される場合、コマンド出力を変数に登録しました( myvar )。出力を出力しました。

黄色のマークが付いたテキストは、さらにフロー制御に使用できる変数–myvarのプロパティを示しています。 このようにして、特定の変数の公開されているプロパティについて調べることができます。 これには次のdebugコマンドが役立ちます。

$ ansible-playbook -i hosts test.yml

PLAY [tomcat-node] ***************************************************************
**************** ****************************************************************
*************** ***************************** *

TASK [Gathering Facts]* ****************************************************************
************** *****************************************************************
************** ************************* *
Monday 05 February 2018  17:33:14 +0530 (0:00:00.051) 0:00:00.051* ***** *
ok: [server1]

TASK [command]* *****************************************************************
************* ******************************************************************
************* ********************************* *
Monday 05 February 2018  17:33:16 +0530 (0:00:01.697) 0:00:01.748* ***** *
changed: [server1]

TASK [Just debugging usage]* *****************************************************************
************* ******************************************************************
************* ******************** *
Monday 05 February 2018  17:33:16 +0530 (0:00:00.226) 0:00:01.974* ***** *
ok: [server1] => {
   "myvar": {
      "changed": true,
      "cmd": "/usr/bin/uptime",
      "delta": "0:00:00.011306",
      "end": "2018-02-05 17:33:16.424647",
      "rc": 0,
      "start": "2018-02-05 17:33:16.413341",
      "stderr": "",
      "stderr_lines": [],
      "stdout": " 17:33:16 up 7 days, 35 min,  1 user,  load average: 0.18, 0.15, 0.14",
      "stdout_lines": [
         " 17:33:16 up 7 days, 35 min,  1 user,  load average: 0.18, 0.15, 0.14"
      ]
   }
}

PLAY RECAP* ***************************************************************************
**********************************************************************************
 **************************************
server1 : ok = 3    changed = 1    unreachable = 0    failed = 0

一般的なPlaybookの問題

このセクションでは、いくつかの一般的なプレイブックの問題について学習します。 問題は-

  • 引用
  • インデント

Playbookはyaml形式で記述されており、上記2つはyaml/playbookで最も一般的な問題です。

Yamlはタブベースのインデントをサポートせず、スペースベースのインデントをサポートしているため、同じことに注意する必要があります。

注意-yamlの作成が完了したら、このサイト(https://editor.swagger.io/)を開いて、左側にyamlをコピーして貼り付け、yamlが正しくコンパイルされるようにします。 これはほんの一口です。

Swaggerは、警告とエラーのエラーを限定します。