ライトウェルブログ

2019/08/26Windows Server 2016の構築手順を自動化する その5

こんにちわ

8月もあっという間に終わってしまいますが、まだまだ暑いですねー。
クーラーがないと生きていけない樋口です。

さて今回は、ループ処理。ループ・ザ・ループです。

 

まず、読者の皆様に考えていただきたい。

なぜループ処理が必要なのでしょうか。

 

ループ処理とは??

 

某フリー百科事典を参照すると、以下の記述があります。

ループとは、特定の条件下において特定の処理を繰り返すこと。

あるいはそのように作られた制御構造のことを言う。

 

なるほど!!よくわからん!

やはり寿司屋で例えるしか無いのか・・・

寿司屋さんで、ループ処理を使わずに、イカ、タコ、トロ、エビを注文しましょう

 

 

 

 

ぼく「イカください」

板前「イカお待ち~」

ぼく「タコください」

板前「タコお待ち~」

ぼく「トロください」

板前「トロお待ち~」

アイツ「ちくわ大明神」

ぼく「エビください」

板前「エビお待ち~」

ぼく「誰だ今の」

 

次にループ処理を使って、イカ、タコ、トロ、エビを注文しましょう。

 

 

 

 

 

ぼく「イカとタコとトロとエビください」

板前「イカ、タコ、トロ、エビお待ち~」

 

ループ処理を使ったことにより、

  • 何回もやり取りをしなくて良くなり
  • 効率よくシャリとネタを握れる

ことがわかりますね?

 

コンピュータの世界でも同じことが言えます。

 

これをバックアップ対象ファイルが複数あり、

robocopyでローカルのバックアップを別のディレクトリにコピーする処理を

Winowsのバッチプログラムで、書いてみましょう。

REM -------------------------------------------------
REM バックアップ対象ディレクトリをリストファイルに定義する
REM -------------------------------------------------
set LIST_FILE=C:\script\backup\robocopy.lst

REM -------------------------------------------------
REM robocopy でバックアップ対象をEドライブにBackup
REM -------------------------------------------------

FOR /F %%i in (%LIST_FILE%) do (
  robocopy %%i E:\ 
  IF ERRORLEVEL == 8 (
  GOTO ERROR
  )
)

REM 正常終了の場合
:SUCCESS
echo %date% %time% "バックアップに成功しました。"
GOTO EXIT

REM エラーの場合
:ERROR
echo %date% %time% "バックアップに失敗しました。"
exit /b 1

:EXIT
exit /b 0

 

FOR文で定義ファイルに記載されているバックアップ対象フォルダを一番上から順番に、

Eドライブにrobocopyしています。

はい。Windowsバッチ書いた事がある人でないとよくわからないですよね?

 

ansibleでこの処理をやろうとすると、FOR文ではなく、with_itemsを使います。

(最近はloopっていう書き方も流行ってきましたが、今回は割愛)

 

copyはwin_copyモジュールでやります。

---
- name: Eドライブにバックアップを取得する
  win_copy:
    src: "{{ item }}"
    dest: E:\backup
    remote_src: yes
  with_items:
    - C:\ORACLEXE\APP\ORACLE\ORADATA\XE\USERS.DBF 
    - C:\ORACLEXE\APP\ORACLE\ORADATA\XE\SYSAUX.DBF
    - C:\ORACLEXE\APP\ORACLE\ORADATA\XE\UNDOTBS1.DBF

全体的に構文がわかりやすくなったと思いませんか?

 

またお気づきの方もいらっしゃるかもしれませんが、

windowsバッチプログラムで記述していた、

成功、失敗したときのメッセージを

Ansibleでは記述する必要はありません。

Playbook実行時に成功、失敗がわかるようになっております。

 

[root@Ansible01 ansible]# ansible-playbook -i inventory playbook.yml 
PLAY [windows] *******************************************************
  
TASK [Gathering Facts] *********************************************** 
ok: [192.168.123.123] 
ok: [192.168.123.124]
  
TASK [win_copy : Eドライブにバックアップを取得する] *************************
changed: [192.168.123.123] =>(item=C:\ORACLEXE\APP\ORACLE\ORADATA\XE\USERS.DBF)
changed: [192.168.123.123] =>(item=C:\ORACLEXE\APP\ORACLE\ORADATA\XE\SYSAUX.DBF)
changed: [192.168.123.123] =>(item=C:\ORACLEXE\APP\ORACLE\ORADATA\XE\UNDOTBS1.DBF)
changed: [192.168.123.124] =>(item=C:\ORACLEXE\APP\ORACLE\ORADATA\XE\USERS.DBF)
changed: [192.168.123.124] =>(item=C:\ORACLEXE\APP\ORACLE\ORADATA\XE\SYSAUX.DBF) 
failed: [192.168.123.124] =>(item=C:\ORACLEXE\APP\ORACLE\ORADATA\XE\UNDOTBS1.DBF)
 
PLAY RECAP ********************************************************** 
192.168.123.123 : ok=2 changed=1 unreachable=0 failed=0 
192.168.123.124 : ok=2 changed=0 unreachable=0 failed=1

 

今回の記事のまとめです。

  • Ansibleでもループ処理は実装可能
  • バッチやシェルに比べてループ処理が比較的簡単にできる
  • ループ処理関係ないけども、エラーハンドリング処理を実装する必要がない

 

次回は何か書こうか悩んでますが、ADユーザーでの認証について書こうかなぁ

トップページに戻る