ライトウェルブログ

2020/10/01PC展開を自動化!苦労編

こんにちは、ライトウェルAnsibleチームの増田です。

今回は、PC展開自動化の苦労編について書いていきます!

PC展開自動化で苦労したことは、
AnsibleでWindowsをドメインユーザで操作することです。
めちゃめちゃ苦戦しました。。

AnsibleでWinodwsをドメインユーザで操作場合は、いくつかのポイントがありました。

<Ansibleでドメインユーザに接続する際のポイント>

  • Ansibleでドメインユーザに接続する際はKerberos認証となる
  • Kerberos認証用に追加でパッケージのインストールと/etc/krb5.confの編集が必要
  • /etc/krb5.confとInventoryの編集は大文字小文字に注意!
  • ドメインユーザ用Inventoryではクライアント情報はIPアドレスではなくFQDN名で指定する

上記のポイントをちゃんと抑えられていれば、苦労せずに済んだはず…(´-`)

 

ということで、実際にAnsibleでWindowsをドメインユーザで操作しようとした際に
ぶつかったエラーと上記のポイントについてもう少し詳しくついて書いていきたいと思います。

はじめに

PCセットアップ手順の中に、ローカルユーザで実施する内容とドメインユーザで実施する内容ってそれぞれありますよね。
どちらの実施内容もAnsibleで自動化するべく、
ドメイン参加前用のPlaybookとドメイン参加後用のPlaybookとInventoryを作成しました。
今回はInventoryが重要になってくるので、Invenrtoryのサンプルのみ載せておきます。

#ドメイン参加前用:Inventory
[windows]
192.168.123.100

[windows:vars]
ansible_user=taro
ansible_password=Password123
ansible_connection=winrm
ansible_port=5986
ansible_winrm_server_cert_validation=ignore
#ドメイン参加後用:Inventory2
[windows]
192.168.123.100

[windows:vars]
ansible_user=hanako@test.local
ansible_password=Password123
ansible_connection=winrm
ansible_port=5986
ansible_winrm_server_cert_validation=ignore


 

ドメイン参加後Playbook実行

さて、ここから本題に入ります。
ドメイン参加前用のPlaybookが終わり、クライアントのドメイン参加も完了しました。
続いてドメイン参加後用のPlaybookを実行します。

ドメイン参加後用のPlaybookの内容はドメインユーザを使って実施したいです。
なので、ドメイン参加後用のInventory2を指定してドメイン参加後用のPlaybookを実行します。

[root@Ansible01 ansible]# ansible-playbook -i inventory2 windows_setup_after.yml


PLAY [Windowsセットアップ] ************************************************************************************************************************

TASK [Gathering Facts] **********************************************************************************************************************
fatal: [192.168.123.100]: UNREACHABLE! => {"changed": false, "msg": "ssl: the specified credentials were rejected by the server", "unreachable": true}

PLAY RECAP **********************************************************************************************************************************
192.168.123.100             : ok=0    changed=0    unreachable=1    failed=0    skipped=0    rescued=0    ignored=0

あれ、失敗いちゃいました。credentialエラー??
Inventoryの内容を間違えたかな?Inventoryに書いてある内容はあっているはずだけど…?

 つまずきポイント①

AnsibleでWindowsを操作するときはWinRMで接続となることは皆さんご存知ですよね。
このWinRMの接続にドメインユーザを使う場合はKerberos認証が使用されます。
どうやらKerberos認証を使うためにはKerberosのパッケージを追加でインストールする必要があるようです。
先程のエラーは、そのKerberosのパッケージが入っていなかったので、
SSL認証でドメインユーサに接続しようとして怒られていたみたいですね。

 

これを突破するためにKerberosのパッケージをインストールしましょう。

[root@Ansible01 ansible]# yum -y install python-devel krb5-devel krb5-libs krb5-workstation

 

続いて、/etc/krb5.confの編集してADやドメイン名を指定する必要があります。
このとき、大文字・小文字の表記が重要になります。
デフォルト/etc/krb5.confでコメントアウトされている例に則って
大文字小文字に注意して記載するようにしましょう!

編集箇所は薄緑色になっている3箇所です。

  1. 18行目:default_realm
  2. 21~25行目:realms
  3. 27~29行目:domain_realm
#編集後:/etc/krb5.conf

# Configuration snippets may be placed in this directory as well
includedir /etc/krb5.conf.d/

[logging]
 default = FILE:/var/log/krb5libs.log
 kdc = FILE:/var/log/krb5kdc.log
 admin_server = FILE:/var/log/kadmind.log

[libdefaults]
 dns_lookup_realm = false
 ticket_lifetime = 24h
 renew_lifetime = 7d
 forwardable = true
 rdns = false
 pkinit_anchors = FILE:/etc/pki/tls/certs/ca-bundle.crt
 default_realm = TEST.LOCAL 
 default_ccache_name = KEYRING:persistent:%{uid}

[realms] 
test.local = {
  kdc = ad.test.local
  admin_server = ad.test.local
 }

[domain_realm]
 .test.local = TEST.LOCAL
 test.local = TEST.LOCAL

ちなみに、/etc/krb5.confを編集せずにPlaybookを実行すると下記のようなエラーが出ます。
同様のエラーがでる場合は、/etc/krb5.confの内容をもう一度確認してみてください。

[root@Ansible01 ansible]# ansible-playbook -i inventory2 windows_setup_after.yml

PLAY [Windowsセットアップ] ************************************************************************************************************************

TASK [Gathering Facts] **********************************************************************************************************************
fatal: [192.168.100.123]: UNREACHABLE! => {"changed": false, "msg": "Kerberos auth failure for principal momotarou@TEST.LOCAL with subprocess: kinit: Cannot find KDC for realm \"TEST.LOCAL\" while getting initial credentials", "unreachable": true}

PLAY RECAP **********************************************************************************************************************************
192.168.100.123             : ok=0    changed=0    unreachable=1    failed=0    skipped=0    rescued=0    ignored=0

 

 

 つまづきポイント②

Kerberosバッケージのインストールとconfファイルの編集も完了したので、
これでいけるはずですね!いざ、Playbook実行!

[root@Ansible01 ansible]# ansible-playbook -i inventory2 windows_setup_after.yml

PLAY [Windowsセットアップ] ***************************************************************************************************************************************************

TASK [Gathering Facts] *************************************************************************************************************************************************
fatal: [192.168.123.100]: UNREACHABLE! => {"changed": false, "msg": "Kerberos auth failure for principal momotarou@test.local with subprocess: kinit: KDC reply did not match expectations while getting initial credentials", "unreachable": true}

PLAY RECAP *************************************************************************************************************************************************************
192.168.123.100             : ok=0    changed=0    unreachable=1    failed=0    skipped=0    rescued=0    ignored=0 

あれ…まだ失敗…。エラーメッセージが変わってますね(*_*)
この失敗の原因はInventoryにあります。

#修正前:Inventory2
[windows]
192.168.123.100

[windows:vars]
ansible_user=momotarou@test.local
ansible_password=Password123
ansible_connection=winrm
ansible_port=5986
ansible_winrm_server_cert_validation=ignore

#修正後:Inventory2
[windows]
ansible-win10.test.local

[windows:vars]
ansible_user=momotarou@TEST.LOCAL
ansible_password=Password123
ansible_connection=winrm
ansible_port=5986
ansible_winrm_server_cert_validation=ignore

Ansibleから操作対象の情報をIPアドレスではなく、クライアントのFQDN名で指定する必要があります。
また、ansible_userの宣言部分で、ドメイン名(@以降部分)が大文字で正しく指定されている必要があります。
修正前のInventory2では、ansible_user=momotarou@test.localとなっていましたが、
これをansible_user=momotarou@TEST.LOCALと指定してあげる必要がありました。

これで準備完了なはずので、Playbookをもう一度実行してみます。

[root@Ansible01 ansible]# ansible-playbook -i inventory2 windows_setup_after.yml

PLAY [Windowsセットアップ] ************************************************************************************************************************

TASK [Gathering Facts] **********************************************************************************************************************
ok: [ansible-win10.TEST.LOCAL]

いけましたね(;;)!!!ドメインユーザで接続できるようになりました!
これでドメイン参加後以降の設定もAnsibleでできるようになりました◎

 

おわりに

こんな感じで、AnsibleでWindowsをドメインユーザで操作する場合は、ハマるポイントがあったのでお気をつけください。
ansibleの公式ドキュメントでも、Kerberos認証について載っていますので、つまづいたときは一度確認してみてください。

今回のブログが、PC展開自動化をテーマにした内容の最終回になります\(^o^)/
また、別のテーマでAnsible関連の記事を書いていく予定ですので、そちらもご覧いただけると嬉しいです。

 

トップページに戻る