2017年11月2日木曜日

Windows 2016 に ansible を使ってみる

概要

Ansible を WindowsServer 2016 に使ってみました
WindowsServer の構築はこちらを参考にしてください
ansible コマンドを実行する環境は CentOS になります

環境

  • Windows 2016
  • CentOS 7.4.1708
    • ansible 2.4.0.0
    • pip 9.0.1
    • python 2.7.5

ansible 環境の準備

ansible は yum コマンドでインストールしています

  • yum -y install ansible

必要な python モジュール等があるので準備します

  • wget 'https://bootstrap.pypa.io/get-pip.py'
  • python get-pip.py
  • pip install xmltodict
  • pip install pywinrm

2 つのライブラリを追加しました

とりあえず ping を送ってみる

では ansible の playbook を作成していきます
とりあえず ansible 経由で ping を送信してみましょう

  • vim inventory.yml
[windows]
192.168.56.101

ホストの情報を設定します

  • mkdir group_vars
  • vim group_vars/windows.yml
ansible_user: winuser1
ansible_password: winpass123
ansible_port: 5985
ansible_connection: winrm
ansible_winrm_server_cert_validation: ignore

WindowsServer に接続する認証情報を記載します
ansible が WindowsServer に接続するのは packer 時と同様で winrm を使っています

では実行してみましょう

  • ansible windows -i inventory.yml -m win_ping

で以下の結果が返ってくれば OK です

192.168.56.103 | SUCCESS => {
    "changed": false, 
    "failed": false, 
    "ping": "pong"
}

winrm の有効化について

今回 WindowsServer 2016 の構築は packer を使用しました
packer を使って構築する場合 winrm の有効が必須になります
なので、packer 経由で WindowsServer を構築すると必然的に winrm が有効になっています

もし有効になっていない場合はコンソール画面を使って WindowsServer を操作します
Powershell のプロンプトを管理者権限で開いて以下のコマンドを実行することで有効にすることができます

  • winrm qc

で y/n を求められるので y を入力すれば有効にできます

他のプロビジョニングをしてみる

接続できたらいろいろと playbook を作成して実行してみましょう
ディレクトリ構成はベストプラクティスに沿って作成します

コマンドを実行して結果を出力する

  • mkdir -p roles/common/tasks/
  • vim roles/common/tasks/main.yml
- include_tasks: test.yml
  • vim roles/common/tasks/test.yml
- name: run ipconfig
  raw: ipconfig
  register: ip_info
- debug: var=ip_info

- name: test stat module on file
  win_stat: path="C:/Windows/win.ini"
  register: stat_file
- debug: var=stat_file

raw はコマンドを直接実行するモジュールです
register は実行した結果を指定した変数に格納することができるモジュールです
debug は指定した情報を出力するモジュールです
var= オプションを使うことで register で定義した変数を参照することができます

  • vim site.yml
---
- hosts: all
  roles: 
    - common
  • ansible-playbook -i inventory.yml site.yml

で実行すると IP アドレスの表示とファイルのチェックを行います
本当は stat_file を assert: を使って中身を確認するところまでやったほうが良いのですが今回はサンプルなので省略しています

Powershell を実行する

  • mkdir -p roles/common/files/
  • vim roles/common/files/test.ps1
Write-Host "test `n"
  • vim roles/common/tasks/powershell.yml
- name: execute powershell
  script: files/test.ps1
  register: echo_ret
- debug: var=echo_ret
  • vim roles/common/tasks/main.yml
- include_tasks: test.yml
- include_tasks: powershell.yml
  • ansible-playbook -i inventory.yml site.yml

こんな感じです
先ほどの test.yml も実行していますが不要であれば include_tasks から削除すれば OK です

WinRAR をインストールする

  • vim roles/common/files/winrar.ps1
$workdir = "c:\installer\"

If (Test-Path -Path $workdir -PathType Container)
{ Write-Host "$workdir already exists" -ForegroundColor Red}
ELSE
{ New-Item -Path $workdir  -ItemType directory }

$source = "http://rarlab.com/rar/winrar-x64-540.exe"
$destination = "$workdir\winrar.exe"
Invoke-WebRequest $source -OutFile $destination
Start-Process -FilePath "$workdir\winrar.exe" -ArgumentList "/S"

Start-Sleep -s 35
rm -Force $workdir\w*
  • vim roles/common/tasks/winrar.yml
- name: execute powershell
  script: files/winrar.ps1
  register: install_ret
- debug: var=install_ret
  • vim roles/common/tasks/main.yml
- include_tasks: test.yml
- include_tasks: powershell.yml
- include_tasks: winrar.yml
  • ansible-playbook -i inventory.yml site.yml

成功した後にプラグラムの一覧を確認すると WinRAR がインストールされているのか確認できると思います
win2016_with_ansible1.png

最後に

WindowsServer2016 に ansible を実行してみました
基本は WinRM 経由でいろいろとコマンドを実行する感じです
コマンドは shell などではなく Powershell がメインになります

Powershell を覚えさえすればいろいろとできるかなと思います

参考サイト

0 件のコメント:

コメントを投稿