ライトウェルブログ

2019/07/29Windows Server 2016の構築手順を自動化する その4

こんにちわ。

技術の樋口です。

ここからは、実際の処理内容について説明します。

前回は、roleとvarsを使いました。

Ansible モジュールには冪等性がある

 

冪等性という言葉でググると、「1回やっても、2回やっても、何回やっても、結果が同じことという概念」という説明がなされています。ふむふむ、これだけ聞くとよくわからん。

 

寿司屋さんで例えると、「イカ二貫」というオーダーを繰り返したとしましょう。

Ansibleで「イカ2貫」というオーダーを繰り返したときは、
⼿元に1貫しかない場合は、板前さんが1貫だけにぎって合計2貫
⼿元に2貫ある場合は、板前さんは何もにぎらず、合計2貫
⼿元になにもない場合は、板前さんが2貫にぎって合計2貫

これをWindowsのバッチファイルやスクリプトで「イカ2貫」
というオーダーを繰り返したときは、
⼿元に1貫しかない場合は、板前さんが2貫にぎって合計3貫
⼿元に2貫ある場合でも、板前さんが2貫にぎって合計4貫
⼿元になにもない場合は、板前さんが2貫にぎって合計2貫

冪等性はこんな特性です。逆にわかりづらいですかね︖(笑)

 

今度は前回のPlaybookで説明したユーザー追加を例にしてみましょう。

ユーザー追加を通常のWindowsのコマンドプロンプトで実施すると以下の様になります。

 

C:\Users\ansible-11>net user kubo /add
コマンドは正常に終了しました。

 

このコマンドをもう一回流すと以下のようにエラーで終了します。

ここで、Playbookをもう一回実行してみます。

C:\Users\ansible-11>net user kubo /add<br >
アカウントは既に存在します。

NET HELPMSG 2224 と入力すると、より詳しい説明が得られます。

 

既にユーザーが存在している場合にも、エラーがないように終了するには

事前にnet user kuboコマンドでユーザー情報のステータスチェックを⾏い、
そのリターンコードによってIF⽂などをつかって、
分岐処理を⾏うというちょっと複雑な処理を書かないといけないです。
Windowsバッチファイルにするとちょい⻑くなります。

 

@echo off
net user kubo
 if %ERRORLEVEL% == 2 (
   net user kubo /add
   exit /b 0
 )
 if %ERRORLEVEL% == 0 (
   exit /b 0
 )

 

Ansibleの場合は、既にユーザーがいようが、いまいが
以下(イカにかけているわけではない)の構⽂だけで⼤丈夫です。

---
- win_user:
    name: kubo

 

寿司屋さんで例えると、「イカ2貫が⼿元にあること」という処理を
Windowsバッチファイルで例えると

 

手元の以下の数と数える
 もし手元のイカが0貫ならば2貫にぎってして終了
 もし手元のイカが1貫ならば1貫にぎって終了
 もし手元のイカが2貫ならば何もにぎらず終了

 

Ansibleの構文で例えると

 

イカ2貫

圧倒的に短くなるのがわかりますよね︖︖
Ansibleのモジュールには標準で冪等性が実装されているので、
・エラーハンドリングを気にしなくていい
・構⽂が短い
などなど様々なメリットがあります。

 

次回はループ処理について書きたいと思います。

 

トップページに戻る