Ansible-クイックガイド
Ansible は、アプリケーションの展開、サービス内オーケストレーション、クラウドプロビジョニング、およびその他の多くのITツールを自動化するシンプルなオープンソースITエンジンです。
Ansibleは、エージェントやカスタムセキュリティインフラストラクチャを使用しないため、簡単にデプロイできます。
Ansibleは自動化ジョブを説明するためにプレイブックを使用し、プレイブックは非常に単純な言語を使用します。 YAML(これは人間が読めるデータシリアル化言語であり、構成ファイルに一般的に使用されますが、データが格納されている多くのアプリケーションで使用できます)これは人間が理解、読み取り、書き込みするのが非常に簡単です。したがって、ITインフラストラクチャのサポート担当者でさえ、プレイブックを読んで理解し、必要に応じてデバッグできるという利点があります(YAML –人間が読める形式です)。
Ansibleは多層展開用に設計されています。Ansibleは一度に1つのシステムを管理するのではなく、すべてのシステムが相互に関連していることを記述してITインフラストラクチャをモデル化します。Ansibleは完全にエージェントレスです。つまり、Ansibleはssh(デフォルト)を介してノードを接続することで機能します。ただし、Kerberosなどの他の接続方法が必要な場合は、Ansibleがそのオプションを提供します。
ノードに接続した後、Ansibleは「Ansibleモジュール」と呼ばれる小さなプログラムをプッシュします。Ansibleはそのモジュールをノードで実行し、終了時にそれらを削除します。Ansibleは、単純なテキストファイル(これらはhostsファイル)でインベントリを管理します。Ansibleはhostsファイルを使用して、ホストをグループ化し、プレイブック内の特定のグループに対するアクションを制御できます。
サンプルホストファイル
これはhostsファイルの内容です-
#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 works ノードに接続し、「」と呼ばれる小さなプログラムをプッシュすることによってAnsible それらへのモジュール」。 Ansible次に、これらのモジュールを(デフォルトではSSH経由で)実行し、終了時に削除します。モジュールのライブラリは任意のマシンに常駐でき、サーバー、デーモン、またはデータベースは必要ありません。
上の図の管理ノードは、プレイブックの実行全体を制御する制御ノード(管理ノード)です。これは、インストールを実行しているノードです。インベントリファイルは、Ansibleモジュールを実行する必要があるホストのリストを提供し、管理ノードはSSH接続を実行し、ホストマシンで小さなモジュールを実行して、製品/ソフトウェアをインストールします。
Beauty Ansibleの機能は、モジュールがインストールされるとモジュールを削除して、ホストマシンに効果的に接続し、命令を実行し、正常にインストールされた場合、実行されたホストマシンにコピーされたコードを削除することです。
この章では、Ansibleの環境設定について学習します。
インストールプロセス
展開について話すとき、主に2つのタイプのマシンがあります-
Control machine −他のマシンを管理できるマシン。
Remote machine −制御機械によって処理/制御される機械。
1台の制御マシンで処理される複数のリモートマシンが存在する可能性があります。したがって、リモートマシンを管理するには、制御マシンにAnsibleをインストールする必要があります。
制御機械の要件
Ansibleは、Python 2(バージョン2.6または2.7)またはPython 3(バージョン3.5以降)がインストールされている任意のマシンから実行できます。
Note −Windowsは制御マシンをサポートしていません。
デフォルトでは、Ansibleは ssh リモートマシンを管理します。
Ansibleはデータベースを追加しません。起動または実行を継続するためにデーモンは必要ありません。リモートマシンの管理中に、Ansibledoes notソフトウェアをインストールまたは実行したままにします。したがって、新しいバージョンに移行するときにどのようにアップグレードするかは問題ありません。
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プレイブックを表現します。この章では、YAMLの概要を説明します。AnsibleはYAMLを使用します。これは、XMLやJSONなどの他のデータ形式と比較すると、人間が理解、読み取り、書き込みを行うのが非常に簡単だからです。
すべて YAML ファイルはオプションで「---」で始まり、「...」で終わります。
YAMLを理解する
このセクションでは、YAMLデータが表現されるさまざまな方法を学習します。
キーと値のペア
YAMLは、単純なキーと値のペアを使用してデータを表します。辞書はキーと値のペアで表されます。
Note −:とvalueの間にはスペースが必要です。
例:学生の記録
--- #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は「|」を使用します 複数の行を表示しているときに改行を含めるには、「>」は複数の行を表示しているときに改行を抑制します。このため、大きな行を読み取って編集することができます。どちらの場合も、意図は無視されます。
表現することもできます BooleanYAMLの(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 −サービスを提供するマシン上のプロセス。
Machine −物理サーバー、vm(仮想マシン)またはコンテナー。
Target machine −Ansibleで構成しようとしているマシン。
Task − Ansibleが管理するアクション(これを実行、削除)など。
Playbook − Ansibleコマンドが書き込まれ、ymlがマシン上で実行されるymlファイル。
アドホックコマンドは、個別に実行して迅速な機能を実行できるコマンドです。これらのコマンドは後で実行する必要はありません。
たとえば、会社のすべてのサーバーを再起動する必要があります。このために、アドホックコマンドを 'から実行します/usr/bin/ansible'。
これらのアドホックコマンドは1回限りの使用であるため、構成の管理と展開には使用されません。
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 (セキュアコピープロトコル)複数のマシン上で並行して多数のファイル。
多くのサーバー/マシンにファイルを転送する
$ 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のPlaybookについて学習します。
プレイブックは、Ansibleコードが記述されているファイルです。プレイブックはYAML形式で書かれています。YAMLはYetAnotherMarkupLanguageの略です。PlaybooksはAnsibleのコア機能の1つであり、何を実行するかをAnsibleに指示します。これらは、タスクのリストを含むAnsibleのやることリストのようなものです。
プレイブックには、ユーザーが特定のマシンで実行したいステップが含まれています。プレイブックは順番に実行されます。プレイブックは、Ansibleのすべてのユースケースの構成要素です。
プレイブックの構造
各プレイブックは、その中の1つ以上のプレイの集合体です。プレイブックは、Playを使用して構成されています。プレイブック内には複数のプレイが存在する可能性があります。
プレイの機能は、特定のホストに対して定義された一連の命令をマップすることです。
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タグについて見ていきましょう。さまざまなタグについて以下に説明します-
名前
このタグは、Ansibleプレイブックの名前を指定します。このプレイブックが行うことのように。プレイブックには任意の論理名を付けることができます。
ホスト
このタグは、タスクを実行するホストまたはホストグループのリストを指定します。ホストフィールド/タグは必須です。リストされたタスクを実行するホストをAnsibleに指示します。タスクは、同じマシンまたはリモートマシンで実行できます。複数のマシンでタスクを実行できるため、hostsタグにホストのエントリのグループを含めることもできます。
vars
Varsタグを使用すると、プレイブックで使用できる変数を定義できます。使用法は、他のプログラミング言語の変数と同様です。
タスク
すべてのプレイブックには、実行するタスクまたはタスクのリストが含まれている必要があります。タスクは、実行する必要のあるアクションのリストです。タスクフィールドには、タスクの名前が含まれます。これは、ユーザーのヘルプテキストとして機能します。これは必須ではありませんが、プレイブックのデバッグに役立ちます。各タスクは、モジュールと呼ばれるコードに内部的にリンクしています。実行する必要のあるモジュール、および実行するモジュールに必要な引数。
ロールは、変数、タスク、ファイル、テンプレート、およびモジュールの完全に独立した、または相互依存したコレクションのフレームワークを提供します。
Ansibleでは、ロールはプレイブックを複数のファイルに分割するための主要なメカニズムです。これにより、書き込みが簡単になりますcomplex playbooks、そしてそれはそれらを再利用しやすくします。プレイブックを分割すると、プレイブックを論理的に再利用可能なコンポーネントに分割できます。
各ロールは基本的に特定の機能または目的の出力に制限され、そのロール自体または依存関係としてリストされている他のロールのいずれかでその結果を提供するために必要なすべての手順があります。
役割はプレイブックではありません。ロールは、独立して使用できる小さな機能ですが、プレイブック内で使用する必要があります。ロールを直接実行する方法はありません。ロールには、ロールが適用されるホストの明示的な設定はありません。
トップレベルのプレイブックは、インベントリファイルからそれらのホストに適用する必要のあるロールへのホストを保持するブリッジです。
新しい役割の作成
ロールのディレクトリ構造は、新しいロールを作成するために不可欠です。
役割の構造
ロールは、ファイルシステム上で構造化されたレイアウトを持っています。デフォルトの構造は変更できますが、今のところはデフォルトのままにしておきましょう。
各役割は、それ自体がディレクトリツリーです。ロール名は、/ 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
この例ではすべてのディレクトリが使用されるわけではなく、例ではそれらの一部の使用法を示します。
プレイブックでの役割の活用
これは、デモ用に作成したプレイブックのコードです。このコードは、プレイブックvivek_orchestrate.ymlのものです。ホストを定義しました:tomcat-node そして2つの役割を呼びました– install-tomcat そして start-tomcat。
問題の説明は、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}}"
starttomcatの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
展開された戦争には、「HelloWorld」を表示するサーブレットがあります。詳細な出力には、ansible.cfgファイルにエントリが追加されたためにすべてのタスクにかかった時間が表示されます-
[defaults]
callback_whitelist = profile_tasks
プレイブックの変数は very similar任意のプログラミング言語で変数を使用すること。変数を使用して値を割り当て、それをプレイブックのどこでも使用するのに役立ちます。変数の値の周りに条件を設定し、それに応じてそれらをプレイブックで使用できます。
例
- 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 −ブロックの関連名-これはロギングで使用され、すべてのブロックが正常に実行されたもののデバッグに役立ちます。
action−アクションタグの横のコードは、実行するタスクです。このアクションも、yamlで使用されるAnsibleキーワードです。
register −アクションの出力は、registerキーワードを使用して登録され、Outputは、アクションの出力を保持する変数名です。
always −ここでも、Ansibleキーワードは、以下が常に実行されることを示しています。
msg −メッセージを表示します。
変数の使用法-{{出力}}->
これにより、変数Outputの値が読み取られます。また、[メッセージ]タブで使用されるため、出力変数の値が出力されます。
さらに、変数のサブプロパティを使用することもできます。{{Output.changed}}で出力が変更されたかどうかを確認し、それに応じて使用する場合と同様です。
Playbookでの例外処理
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マシンで実行されるものすべて)。
ブロック機能内に記述されたコマンドが失敗した場合、実行はレスキューブロックに到達し、実行されます。ブロック機能下のコマンドにエラーがない場合、レスキューは実行されません。
Always すべての場合に実行されます。
したがって、同じものをJavaと比較すると、try、catch、finallyblockに似ています。
ここに、 Block と類似しています try block 実行するコードを記述し、 rescue と類似しています catch block そして always と類似しています finally。
ループ
以下は、Ansibleでのループの使用法を示す例です。
タスクは、すべてのwarファイルのセットを1つのディレクトリからtomcatwebappsフォルダにコピーすることです。
以下の例で使用されているコマンドのほとんどは、すでに説明されています。ここでは、ループの使用法に焦点を当てます。
最初に「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変数の値をHelloVivekからHelloWorldに変更して、出力を確認するだけです。
この章では、Ansibleを使用した高度な実行とは何かを学習します。
タスクによる実行を制限する方法
これは非常に重要な実行戦略であり、プレイブック全体ではなく、1回の実行のみを実行する必要があります。 For example、サーバーを停止するだけで(本番環境の問題が発生した場合)、サーバーのみを起動するパッチを適用したいとします。
ここで、元のプレイブックでは、停止と開始は同じプレイブックの異なる役割の一部でしたが、これはタグを使用して処理できます。さまざまな役割にさまざまなタグを提供でき(タスクがあります)、したがって、エグゼキュータによって提供されたタグに基づいて、指定された役割/タスクのみが実行されます。したがって、上記の例では、次のようなタグを追加できます。
- {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プレイブックをデバッグするための最も一般的な戦略は、以下のモジュールを使用することです。
デバッグと登録
これら2つは、Ansibleで使用可能なモジュールです。デバッグの目的で、2つのモジュールを慎重に使用する必要があります。例を以下に示します。
Verbosityを使用する
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のプロパティについて説明しています。このようにして、特定の変数の公開されているプロパティについて知ることができます。次のデバッグコマンドはこれに役立ちます。
$ 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
一般的なプレイブックの問題
このセクションでは、いくつかの一般的なプレイブックの問題について学習します。問題は-
- Quoting
- Indentation
Playbookはyaml形式で記述されており、上記の2つはyaml / playbookで最も一般的な問題です。
Yamlはタブベースのインデントをサポートせず、スペースベースのインデントをサポートしているため、同じことに注意する必要があります。
Note − yamlの記述が完了したら、このサイトを開きます(https://editor.swagger.io/)そして、yamlが正しくコンパイルされるように、左側にyamlをコピーして貼り付けます。これはほんの一例です。
Swaggerは、エラーだけでなく警告のエラーも修飾します。