ときどきAnsible日記

主にITインフラ基盤の自動化に関する事を書いているブログです

AnsibleのModule:win_scheduled_task

お疲れ様です。伊藤です。

今回はWindows側のModuleになります。いわゆるタスクスケジューラの設定用Moduleです。


説明文は下記になります。
スケジュールされたタスクを管理する
う~んそのまんまですね。

パラメータは以下です。

パラメータ 必須 デフォルト 選択肢 備考
arguments no スケジュールされたタスクアクションを提供する引数
days_of_week no 週単位のタスクを実行するための曜日。冪等ではありません。
description no スケジュールされたタスクの説明
enabled no True True or False タスクを有効または無効にする
executable no スケジュールされたタスクを実行するコマンド
frequency no once or daily or weekly コマンドの頻度。冪等ではありません。
name yes スケジュールされたタスクの名前
path no \ このタスクが格納されるタスクフォルダ
state yes present or absent タスクが有るか無いか
time no 偶数ではなくスケジュールされたタスクを実行する時間
user no スケジュールされたタスクを実行するユーザー

例文はこちら

# コマンドプロンプトを開くスケジュールされたタスクを作成する
- win_scheduled_task:
    name: TaskName
    description: open command prompt
    executable: cmd
    arguments: -opt1 -opt2
    path: example
    time: 9am
    frequency: daily
    state: present
    enabled: yes
    user: SYSTEM


説明文についてはこちらで終了なのですが、使ってみてわかったのが「一度作成したscheduleについては変更ができない」ということでした。この部分については一度削除してから再作成することで解決しています。(もし他の解決方法をご存じに方がいらっしゃったら教えてください)
以上です。お疲れ様でした。

AnsibleでWindowsUpdateを行う

お久しぶりです。伊藤です。
すっかり更新が滞ってしまい、申し訳ありません。少々個人的なことがありましてそちらに追われておりました(その件については後程。。。)

というわけで久々に更新します。今回はAnsibleを使ってWindowsUpdateを試してみます。以前Windowsへの接続環境を作成したので、その環境を使います。でWindowsがインターネットに接続されている状態であれば、話は簡単です。


まずはインベントリファイルにホスト名とIPを追加します。追加する内容は下記。

[windows]
192.168.1.110

これだけです。IPについてはそれぞれのWindosサーバのものをどうぞ。

インベントリファイルについては既存のものに追加すればOKです。個別に用意してもいいですが、この環境ではdevelopment、staging、productionとリリースに合わせてインベントリファイルを分けていますので、煩雑さを避けるためにこのようにしました。このあたりもルールを作っておかないとその場に合わせて変更してしまい、のちに手に負えなくなりますのでご注意ください。(現に手に負えなくなりました)

次にプレイブックを作りますが、ここでロールを分けておきます。windowsというロールを作成します。

# mkdir -p role/windows/defaults
# mkdir -p role/windows/files
# mkdir -p role/windows/handlers
# mkdir -p role/windows/meta
# mkdir -p role/windows/tasks
# mkdir -p role/windows/templates
# mkdir -p role/windows/vars

ロールの下にプレイブックを作ります。

# vi role/windows/tasks/main.yml

内容は下記の通り。

- name: update
  win_updates: category_names=Updates state=searched

- name: reboot
  win_reboot:

これでWindowsUpdate後に再起動が自動で行われます。本来はupdateの戻り値を見て更新がなければ再起動しない、などの判断を入れたいのですがとりあえず今回は見送ります。


続いて、Windowsサーバにアクセスするための環境変数を用意しておきましょう。以前はhostsというインベントリファイルに直書きしましたが、ベストプラクティスに沿って環境を作成した場合はgroup_varの下に環境変数ファイルを置くことができます。ここに指定したrole名と同じ名前のファイルがあればその環境変数を読み込みます。

# vi group_var/windows.yml

内容は下記

ansible_ssh_user: Administrator(ログインユーザ名)
ansible_ssh_pass: xxxxxxxx(パスワード)
ansible_ssh_port: 5986
ansible_connection: winrm
ansible_winrm_server_cert_validation: ignore


で、最後に呼び出すプレイブックを作成します。

# windows.yml

内容はこんな感じ

---
- hosts: windows
  roles:
    - windows


これで実行します。

# ansible-playbook -i development windows.yml

結果は以下のような感じ

[root@18e034a057dd ansible]# ansible-playbook -i development windows.yml

PLAY [windows] *********************************************

TASK [Gathering Facts] *************************************
ok: [192.168.1.110]

TASK [windows : update] ************************************
changed: [192.168.1.110]

TASK [windows : reboot] ************************************
changed: [192.168.1.110]

PLAY RECAP *************************************************
192.168.1.110              : ok=3    changed=2    unreachable=0    failed=0

Windows側を見ると更新されていることがわかります。(実行日は10/10)
f:id:pj_doaa:20171010120644p:plain

以上です。お疲れでした。