1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

TerraformでWindowsインスタンスをデプロイした後に引き続きAnsibleを実行するとCredencialエラーが出て失敗する件

Last updated at Posted at 2021-07-24

…という名の備忘録です。恥の多い人生を送ってきました。
冪等性とか云々言ってたらこんなことせん方がいいのではないか説も頭にはあるんですが、
だってめんどくさいんだもの。

#なんでこんなめんどくさいことを
TerraformとAnsible、まあ得意分野が違うじゃないですか。
なので、AWSやAzureなどでインスタンスをデプロイするにはTerraformを使い、
その後OSの設定を行う分にはAnsibleで行う計画を立てました。

しかし、2種類のソフトを使って構築の自動化を行うわけじゃないですか。
まあ基本設定のPlaybookなんかは最初に作ってしまうから、そんなことはいいんですよ。
私は1台自動デプロイするのに2回もコマンドを打たねばならないのがもうめんどくさいんですよ。
ナマケモノなので。(ナマケモノに失礼)
そのようなわけで、できればTerraformでAnsibleのコマンドを組み込んだtfファイルを作って実行するか、
Ansible PlaybookでTerraformを実行したい。

AnsibleにはTerraformのモジュールあるみたいなんですが、
僕が調べた時点では「実行結果はTerraformを単独実行したような出方しないよ」という情報が目についたんで早々に投げました。

そこで、Terraformのlocal-execを使うことを画策したわけです。
まあhashicorpの方であまり推奨はしていない(たぶんコマンドの実行結果をhashicorpの方で保証できないから)provisionブロックですが、ある以上は使わせてほしい。
だってそこにあるから。

#どのように構成したか
AWSのEC2インスタンスで、Windows Server 2019をデプロイするという前提。
AWSのクレデンシャルとかは既に解決している前提、というか
Terraform単体、また既にデプロイ済のWindowsインスタンス上でWinRMをリモート通信可能にした状態でAnsible単体で実行可能なのは確認済みです。
ワイは一気通貫に設定してしまいたいんや。

だもんで、インスタンスデプロイ時にユーザーデータでWinRMをLinuxから通信可能な状態に持っていくようなスクリプトを実行します。
BASIC認証の許可と、平文の許可ですね。
ドメイン参加した後ならkerberos認証でも何でも使えばよいのですが、今この瞬間は勘弁してほしい。
ドメイン参加が終わった後に、BASICと平文を不許可に変更し、ポート番号を変えた状態で、
たとえばNTLM認証でローカルのAnsible実行ユーザでwin_pingモジュール使えるとかは確認済です。

「最初からそのユーザーデータに設定させれば良いのでは」という意見は石のように黙殺します。
もうAnsibleのPlaybookできとるんや。ワイはコンコルドなんや。
あと企業のサーバだと、設定項目がいろいろあったりするんで、ユーザーデータが大長編になったりするし
引数も色々渡したかったりするし、めんどくさいんですよ…。

#単体で実行すると通るAnsibleコマンドが、provisionブロックからだと通らない、のは
Terraformの実行ファイル、resourceブロックにec2のデプロイ用の設定値を色々書いて、ユーザーデータも含めて、
そしてその最後にprovision子ブロックを用意してlocal-execでansible-playbookコマンド書きますやん。
実行しますやん。
「Credencialエラー」が出ますやん。
コマンド間違ってんのかと思って、Linuxの画面に出た実行コマンドそのままコピペして実行してみますやん。
通るんだなぁこれが。

これが通るとなると、WinRMの設定はうまくいっている。
では問題は何か?Terraformでの実行ユーザに問題あるのか?
と思ったら、デバッグログ出してみたら単体でAnsible実行した時と同じ、つまり僕のアカウントなんだなぁこれが。
わけがわからないよ。キュウべえになってしまうよ。

だが他の仕事の合間にこれをやってた僕はふと気づいたね。
「ユーザーデータの実行が、全て終わっていないのでは?その前にprovisionブロックを実行してしまっているのでは?」

そこで、provisionブロックに書くコマンド、次のようにしてみたよね。

sleep 60;ansible-playbook -i inventory deploy.yml -e newhost

ちょっと聞いてくださいませ奥様。こうすると通るんですの。

……。
…………。

……コマンドの実行を遅延させるLinuxコマンド「Sleep」で60秒の遅延時間を与えると、普通に通りましたよ。
つまりユーザーデータの実行がすべて終わらないうちからWinRMに通信かけてるので通らなかっただけ。そりゃ通らないよ。開いてないんだから。
早まるな、コンピュータが早まるんならあいつらはバカなんだからこっちが指示してやれ。
まあつまりそういうことです。私のようになってはいけないとあの子に伝えてほしい(『朝日のあたる家』)。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?