ときどきAnsible日記

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

AnsibleをWindowsに接続する

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

昨日Ansibleのインストールを行いましたので、本日はAnsible(管理サーバ)側からWindows(管理対象サーバ)側への接続を行います。

その前にLinux(管理対象サーバ)側への接続確認も行いましょう。Ansibleのインストールが終わっていればそのままAnsibleのコマンドで接続することができる(はず)です。/etc/ansibleに移動して、hostsファイルを編集します。

# cd /etc/ansible
# vi hosts

追加する内容は下記のような感じになります。

[linux]
【LinuxサーバのIP】

【】の中は該当する値に書き換えてください。その後下記コマンドでpingの疎通確認ができます。

# ansible linux -i hosts -m ping

下記の結果が出れば疎通はOKです。

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

例えば管理対象サーバ(ここでは192.168.1.105)が起動していないと下記のようなメッセージが出ます。

192.168.1.105 | UNREACHABLE! => {
    "changed": false,
    "msg": "Failed to connect to the host via ssh: ssh: connect to host 192.168.1.105 port 22: Connection timed out\r\n",
    "unreachable": true
}

ここまでがLinuxへの疎通確認です。

ここから本題のWindows側への接続を行います。Windowsの接続までの流れですが、管理サーバ(Ansible)側の作業と管理対象サーバ(Windows)側に分かれます。簡単に整理すると以下のような流れです。
【管理サーバ側作業】

  • (1)pipインストール
  • (2)pywinrmインストール

【管理対象サーバ側作業】

  • (3)接続設定用シェル実行

【管理サーバ側作業】

  • (4)変数設定
  • (5)接続コマンド実行

それでは(1)pipインストールからやっていきましょう。インターネットがつながる環境であれば下記コマンドでpipのインストールが始まります。

# curl -sL https://bootstrap.pypa.io/get-pip.py | python

インターネットにつながらない環境であれば別途get-pip.pyファイルをダウンロードしてサーバにファイルをアップロード後にpythonで実行してください。下記のような表示が出ればインストール成功です。

Collecting pip
  Downloading pip-9.0.1-py2.py3-none-any.whl (1.3MB)
    100% |????????????????????????????????| 1.3MB 623kB/s
Collecting wheel
  Downloading wheel-0.29.0-py2.py3-none-any.whl (66kB)
    100% |????????????????????????????????| 71kB 5.1MB/s
Installing collected packages: pip, wheel
Successfully installed pip-9.0.1 wheel-0.29.0

※インターネット環境がない場合、get-pip.pyの中で外部に接続してそうなのでやっぱり失敗するかもです。ごめんなさい。

続いて、(2)pywinrmインストールです。pywinrmとはpythonのモジュールでwinrmへ接続するための機能になります。先ほどのpipはこれを入れるための準備です。pipを使ってpywinrmをインストールします。こちらもインターネット接続が必要になります。まずは下記コマンドでpywinrmがインストールされていないことを確認します。

# pip list

インストールされているpythonの機能が出ますが、ここにpywinrmがいないことを確認してください。確認後下記コマンドでpywinrmをインストール。

# pip install pywinrm

下記のような表示が出ればインストール完了です。

Collecting pywinrm
  Downloading pywinrm-0.2.2-py2.py3-none-any.whl
Collecting requests>=2.9.1 (from pywinrm)
  Downloading requests-2.18.1-py2.py3-none-any.whl (88kB)
    100% |????????????????????????????????| 92kB 5.2MB/s
Collecting xmltodict (from pywinrm)
  Downloading xmltodict-0.11.0-py2.py3-none-any.whl
Requirement already satisfied: six in /usr/lib/python2.7/site-packages (from pywinrm)
Collecting requests-ntlm>=0.3.0 (from pywinrm)
  Downloading requests_ntlm-1.0.0-py2.py3-none-any.whl
Collecting chardet<3.1.0,>=3.0.2 (from requests>=2.9.1->pywinrm)
  Downloading chardet-3.0.4-py2.py3-none-any.whl (133kB)
    100% |????????????????????????????????| 143kB 4.3MB/s
Collecting certifi>=2017.4.17 (from requests>=2.9.1->pywinrm)
  Downloading certifi-2017.4.17-py2.py3-none-any.whl (375kB)
    100% |????????????????????????????????| 378kB 2.3MB/s
Collecting idna<2.6,>=2.5 (from requests>=2.9.1->pywinrm)
  Downloading idna-2.5-py2.py3-none-any.whl (55kB)
    100% |????????????????????????????????| 61kB 5.5MB/s
Collecting urllib3<1.22,>=1.21.1 (from requests>=2.9.1->pywinrm)
  Downloading urllib3-1.21.1-py2.py3-none-any.whl (131kB)
    100% |????????????????????????????????| 133kB 4.7MB/s
Collecting ntlm-auth>=1.0.2 (from requests-ntlm>=0.3.0->pywinrm)
  Downloading ntlm_auth-1.0.5-py2.py3-none-any.whl
Collecting ordereddict (from ntlm-auth>=1.0.2->requests-ntlm>=0.3.0->pywinrm)
  Downloading ordereddict-1.1.tar.gz
Building wheels for collected packages: ordereddict
  Running setup.py bdist_wheel for ordereddict ... done
  Stored in directory: /root/.cache/pip/wheels/cf/2c/b5/a1bfd8848f7861c1588f1a2dfe88c11cf3ab5073ab7af08bc9
Successfully built ordereddict
Installing collected packages: chardet, certifi, idna, urllib3, requests, xmltodict, ordereddict, ntlm-auth, requests-ntlm, pywinrm
Successfully installed certifi-2017.4.17 chardet-3.0.4 idna-2.5 ntlm-auth-1.0.5 ordereddict-1.1 pywinrm-0.2.2 requests-2.18.1 requests-ntlm-1.0.0 urllib3-1.21.1 xmltodict-0.11.0

pywinrmを入れるために関連する機能もインストールされます。これがあるのでインターネット環境がないとかなりインストールは辛いです。以前私はpipを入れずにpywinrmをインストールしたことがありますが、その際にはpythonモジュールをrpm化して強引に入れました。もしかしたらもっと簡単な方法があるかもしれないので、探してみてください。。(無責任)

とりあえず、pywinrmが入れ終わったら下記コマンドで確認します。

# pip list

pywinrmが追加されているはずです。

pywinrm (0.2.2)

続いてWindows側の作業(3)接続設定用シェル実行です。まずは実行するファイルを取得します。Githubにあるのでそこからとってきます。面倒な場合は下記URLを見てコピペでファイルを作っちゃってもOK。
https://github.com/ansible/ansible/blob/devel/examples/scripts/ConfigureRemotingForAnsible.ps1
ConfigureRemotingForAnsible.ps1を入手出来たらWindowsサーバにアップロードしてください。その後、windows側でPowershellのコンソールを管理者権限で開き、下記コマンドで実行します。

powershell -ExecutionPolicy RemoteSigned .\ConfigureRemotingForAnsible.ps1

下記のような表示が出ればOKです。
f:id:pj_doaa:20170719100456p:plain

次にまたAnsible側に戻っての作業(4)変数設定です。/etc/ansibleにあるhostsに手を加えます。

# cd /etc/ansible
# vi hosts

下記の内容を追加しましょう。

[windows]
【WindowsサーバのIP】

[windows:vars]
ansible_ssh_user=【WindowsにログインするユーザID】
ansible_ssh_pass=【Windowsにログインするパスワード】
ansible_ssh_port=5986
ansible_connection=winrm
ansible_winrm_server_cert_validation=ignore

【】の中は該当する値に書き換えてください。

最後に(5)接続コマンド実行で疎通確認します。下記コマンドを実行してください。

# ansible windows -i hosts -m win_ping

下記表示が出ればOKです。お疲れ様でした。

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