Ansibleの設定が残ったままDCに移動したとき、再度Ansibleと同じようなことがしたくて緊急でベタ書きして使えるInvoke-Command

# はじめに
これは、現在私が従事しているある企業のシステム構築のお話。
大袈裟な話をすると、期限ギリギリで仕様が変わっていくやばい案件で起こったことです。

# 戦いの火蓋が切られる
？？？「構成が変更になりました、対応お願いします。」
私　　「は？クソ。」

どうやら、メテオフォールが始まったとのことで...自動化していなければ構成まばらだったんじゃないかこれ...

担当　「とはいえ、DCに搬送してしまったのでAnsibleが使える端末も持ち込みができないんです。」
私　　「そりゃもうどうしようもないですね...」


人海戦術大好きなんだろ勝手にやっててくれ...

# とりあえずなんとかならんか考えてみる
やばいどころじゃないぞこの案件...とりあえず整理してみよう。  

 * 搬送したサーバにはAnsible設定を外す前の状態が残っている
   * GOサイン出るまでやらないルールでいたら搬送終わっててこの時点で詰んでるぞこれ...
   * 設定が残っているのでAnsibleと同様コマンドをリモートで発行できる（これは救い）
 * こちらから持っていけるPCが無い
   * そりゃDCだしね...持っていけるわけ無いか。 
 * 固定値を全台に当て直す作業しかない
   * これが一番の救いだった。変数当て込むとなるとカオスになるのでこれほんとありがとう。いや、そもそも変更入れるなよって怒ってるんだけど。

# Ansibleみたいなwin_commandっぽい何かを実装しよう

あほくさいけれど、もうこれしか期限考えてやれるのが無い...ということで、これをやってみようと思う。
とりあえず、ansible-playbook的な何かを作った。
インベントリ作ってる暇？毛頭ないな！！実行時に範囲攻撃だ！！

```{pseudo-ansible.ps1}
function ansible-playbook() {
    $network          = Read-Host "Input network (ex.192.168.1)"
    [int]$starthost   = Read-Host "Input start-host(ex.1)"
    [int]$endhost     = Read-Host "Input end-host(ex.254)"
    $user             = Read-Host "Input user"
    $pass             = Read-Host "Input pass"
    $secure           = ConvertTo-SecureString -AsPlainText -Force $pass
    $psc              = New-Object System.Management.Automation.PSCredential($user,$secure)
    for ( $x = $starthost; $x -le $endhost; $x++){
        $inventory = (Write-Output "${network}.${x}")
        Write-Output "###########################"
        Write-Output "[HOST:$inventory]"
        Invoke-Command -ComputerName $inventory -FilePath $args[0] -ArgumentList $file -Credential $psc
    }
}
Set-Item WSMan:\localhost\Client\TrustedHosts -Value "*" -Force
ansible-playbook($args[0])
Clear-Item WSMan:\localhost\Client\TrustedHosts -Force
```

# playbook的ななにかを実装しなければ...

疑似的なAnsible-Playbookができた、あとはPlaybookだ。
これでなんとか凌げればいいか...動けばいいのだよ動けば！！


```{playboook.ps1}
Write-Output "[Task1:Return OK]"
Write-Host "OK" 
```

# 試しにやってみた
自分のマシンに向けてやってみようと思う。
つながらなければエラー吐いて終わる。

```{result.stdout}

PS C:\> .\pseudo-ansible.ps1 .\playbook.ps1 
Input network (ex.192.168.1): 192.168.10
Input start-host(ex.1): 110
Input end-host(ex.254): 115
Input user: Administrator
Input pass: PA$$word <= ここあんまりよろしくないね

[HOST:192.168.10.110]
[192.168.10.110] リモート サーバー 192.168.10.110 への接続に失敗し、次のエラー メッセージが返されました: WinRM は処理を完了できません
。 指定したコンピューター名が有効であること、コンピューターにネットワーク経由でアクセスできること、および WinRM サービスのファイアウ
ォールの例外が有効になっていてこのコンピューターからアクセスできることを確認してください。 既定では、パブリック プロファイルの WinRM
ファイウォールの例外によって、同一のローカル サブネット内のリモート コンピューターへのアクセスは制限されます。詳細については、about_R
emote_Troubleshooting のヘルプ トピックを参照してください。
    + CategoryInfo          : OpenError: (192.168.10.110:String) [], PSRemotingTransportException
    + FullyQualifiedErrorId : WinRMOperationTimeout,PSSessionStateBroken
###########################
[HOST:192.168.10.111]
[192.168.10.111] リモート サーバー 192.168.10.111 への接続に失敗し、次のエラー メッセージが返されました: WinRM は処理を完了できません
。 指定したコンピューター名が有効であること、コンピューターにネットワーク経由でアクセスできること、および WinRM サービスのファイアウ
ォールの例外が有効になっていてこのコンピューターからアクセスできることを確認してください。 既定では、パブリック プロファイルの WinRM
ファイウォールの例外によって、同一のローカル サブネット内のリモート コンピューターへのアクセスは制限されます。詳細については、about_R
emote_Troubleshooting のヘルプ トピックを参照してください。
    + CategoryInfo          : OpenError: (192.168.10.111:String) [], PSRemotingTransportException
    + FullyQualifiedErrorId : WinRMOperationTimeout,PSSessionStateBroken
###########################
[HOST:192.168.10.112]
[192.168.10.112] リモート サーバー 192.168.10.112 への接続に失敗し、次のエラー メッセージが返されました: WinRM は処理を完了できません
。 指定したコンピューター名が有効であること、コンピューターにネットワーク経由でアクセスできること、および WinRM サービスのファイアウ
ォールの例外が有効になっていてこのコンピューターからアクセスできることを確認してください。 既定では、パブリック プロファイルの WinRM
ファイウォールの例外によって、同一のローカル サブネット内のリモート コンピューターへのアクセスは制限されます。詳細については、about_R
emote_Troubleshooting のヘルプ トピックを参照してください。
    + CategoryInfo          : OpenError: (192.168.10.112:String) [], PSRemotingTransportException
    + FullyQualifiedErrorId : WinRMOperationTimeout,PSSessionStateBroken
###########################
[HOST:192.168.10.113]
[192.168.10.113] リモート サーバー 192.168.10.113 への接続に失敗し、次のエラー メッセージが返されました: WinRM は処理を完了できません
。 指定したコンピューター名が有効であること、コンピューターにネットワーク経由でアクセスできること、および WinRM サービスのファイアウ
ォールの例外が有効になっていてこのコンピューターからアクセスできることを確認してください。 既定では、パブリック プロファイルの WinRM
ファイウォールの例外によって、同一のローカル サブネット内のリモート コンピューターへのアクセスは制限されます。詳細については、about_R
emote_Troubleshooting のヘルプ トピックを参照してください。
    + CategoryInfo          : OpenError: (192.168.10.113:String) [], PSRemotingTransportException
    + FullyQualifiedErrorId : WinRMOperationTimeout,PSSessionStateBroken
###########################
[HOST:192.168.10.114]
[Task1:Return OK]
OK
###########################
[HOST:192.168.10.115]
[192.168.10.115] リモート サーバー 192.168.10.115 への接続に失敗し、次のエラー メッセージが返されました: WinRM は処理を完了できません
。 指定したコンピューター名が有効であること、コンピューターにネットワーク経由でアクセスできること、および WinRM サービスのファイアウ
ォールの例外が有効になっていてこのコンピューターからアクセスできることを確認してください。 既定では、パブリック プロファイルの WinRM
ファイウォールの例外によって、同一のローカル サブネット内のリモート コンピューターへのアクセスは制限されます。詳細については、about_R
emote_Troubleshooting のヘルプ トピックを参照してください。
    + CategoryInfo          : OpenError: (192.168.10.115:String) [], PSRemotingTransportException
    + FullyQualifiedErrorId : WinRMOperationTimeout,PSSessionStateBroken

```

# 最後に
こんなことやらなくてもいいような環境で開発したいものだとしみじみ感じた...
多分、自分いなかったら人間の数で討とうとしてるのわかっているからまぁ...とはいえ自動化して浮いた分が自分に返ってくるわけではない...こんな会社辞めてやる！！！（今ボーナス待ちで転職活動してる）