Powershell Invoke-Command работает при запуске вручную, но не в сценарии

Я создаю сценарий для удаленной установки модуля PSWindowsUpdate PowerShell, открываю правильные порты межсетевого экрана, а затем запускаю команду для установки ожидающих обновлений. Чтобы установить модуль PSWindowsUpdate, мне нужно установить MSI на некоторых из моих компьютеров, чтобы включить командлет «Install-Module».

Если я запустил следующий код вручную, в сеансе администрирования PowerShell на моем локальном компьютере, он отлично работает:

$RemoteMachine = "DCSvrRDS16"
write-host "Server Name is: $RemoteMachine"

#Copy the MSI Local to the computer
Write-Host "Copying MSI locally"
Copy "\\dcsvrstorage2\software\microsoft\powershell\PackageManagement_x64.msi" \\$RemoteMachine\c$\

#Run the MSI remotely
Write-Host "Running MSI"
Invoke-Command -ComputerName $RemoteMachine -Credential $domaincredentials -ScriptBlock { c:\windows\system32\msiexec /i c:\PackageManagement_x64.msi /quiet /lvx* c:\PackageManagement.log } 4>&1

Но если я запустил ЭТОЙ полный скрипт В ТОЧНО ЖЕ УЖЕ ОТКРЫТОЙ СЕССИИ PowerShell, MSI не установится и файл журнала не будет создан:

Import-Module PSWindowsUpdate
$domaincredentials = Get-Credential


Function ProcessMachine($RemoteMachine) {

    write-host "Server Name is: $RemoteMachine"

    #Copy the MSI Local to the computer
    Write-Host "Copying MSI locally"
    Copy "\\dcsvrstorage2\software\microsoft\powershell\PackageManagement_x64.msi" \\$RemoteMachine\c$\

    #Run the MSI remotely
    Write-Host "Running MSI"
    Invoke-Command -ComputerName $RemoteMachine -Credential $domaincredentials -ScriptBlock { c:\windows\system32\msiexec /i c:\PackageManagement_x64.msi /quiet /lvx* c:\PackageManagement.log } 4>&1

    #Install the module
    Invoke-Command -ComputerName $RemoteMachine -Credential $domaincredentials -ScriptBlock { Install-Module PSWindowsUpdate -Force }

    #Turn on the firewall rules
    Invoke-Command -ComputerName $RemoteMachine -Credential $domaincredentials -ScriptBlock { Set-NetFirewallRule -DisplayName "COM+ Network Access (DCOM-In)" -Enabled True }
    Invoke-Command -ComputerName $RemoteMachine -Credential $domaincredentials -ScriptBlock { Set-NetFirewallRule -DisplayName "COM+ Remote Administration (DCOM-In)" -Enabled True }
    Invoke-Command -ComputerName $RemoteMachine -Credential $domaincredentials -ScriptBlock { Remove-NetFirewallRule -DisplayName "Remote WSUS Install" }
    Invoke-Command -ComputerName $RemoteMachine -Credential $domaincredentials -ScriptBlock { New-NetFirewallRule -DisplayName "Remote WSUS Install" -Profile Domain -Enabled True -Direction Inbound -Action Allow -Protocol TCP -LocalPort RPC }

    #Try the update
    Install-WindowsUpdate -ComputerName $RemoteMachine -AcceptAll
}

foreach ($machine in (Get-Content NeedsWSUS.txt)) {

    ProcessMachine $machine

}

Это сводит меня с ума. Я запустил ProcessMonitor на удаленном компьютере, и я вижу запуск и остановку msiexec, не обращаясь к MSI в корне диска C: и не пытаясь открыть файл журнала для записи.

Кто-нибудь видел что-нибудь подобное? Клиентская машина - это Windows 7 pro, Powershell 4, а конечная машина - Windows 2012 R2, а также PowerShell 4.

Заранее благодарим. Я создал ami с некоторыми файлами в каталоге для выполнения, если я войду через ssh, я могу выполнить файл как ...

Каким образом выполняется сценарий sh в экземпляре ec2, когда terraform создает ресурсы? Я создал ami с некоторыми файлами в каталоге для выполнения, если я войду через ssh, я могу выполнить файл следующим образом:

sh /home/resources/wso/bin/wso.sh

У меня есть файл start.tpl со следующим содержимым:

#!/bin/bash

# update ubuntu
sudo apt-get update
# install nginx
sudo apt-get install nginx -y
sudo service nginx start

#start wso2
sh /home/resources/wso/bin/wso.sh

В моем main.tf у меня есть следующее:

data "template_file" "start" {
  template = "${file("start.tpl")}"  
}

resource "aws_instance" "wnginx" {
  ami                    = "${var.instance_ami}"
  instance_type          = "${var.instance_type}"    
  user_data = "${data.template_file.start.rendered}"
}

Nginx запускается нормально, но мой стартовый скрипт wso.sh не запускается.

Существует ли какая-то конфигурация terraform для отладки моего start.tpl?

1
задан 21 October 2018 в 09:57
3 ответа

Вы используете данные пользователя неправильно. Пожалуйста, смотрите документацию по облакам.

Ваш шаблон должен содержать нечто подобное (YAML Format):

#cloud-config
write_files:
- path: /home/resources/wso/bin/wso.sh
    content: |
    #!/bin/bash

    # update ubuntu
    sudo apt-get update
    # install nginx
    sudo apt-get install nginx -y
    sudo service nginx start
runcmd:
- ["sh", "/home/resources/wso/bin/wso.sh"]

Так как это может быть улучшено с небольшими усилиями, я бы предложил использовать это в качестве шаблона:

#cloud-config
packages:
  - nginx
package_update: true
runcmd:
  - [systemctl, daemon-reload]
  - [systemctl, enable, nginx]
  - [systemctl, start, nginx]

Это позволит получить то же самое, что и ваш скрипт, но использовать Систему, предоставляемую для обеспечения машины, а также удалить необходимость e. g. для поддержки вашего собственного AMI, так как в этом случае вы можете просто применить конфигурацию cloudd-init через данные пользователя и положиться на образы Debian/Ubuntu.

Если это не сработало, вы можете проверить /var/log/cloud-init.log. Так как формат файла YAML, знайте, что он сломан с использованием неправильных отпечатков.

.
0
ответ дан 4 December 2019 в 03:36

Похоже, это не совсем связано с терраформированием. Механизм userdata является функцией EC2. Для отладки пользовательских данных можно проверить /var/log/ и поискать файлы с именем cloud-init. По крайней мере, на изображениях, основанных на CentOS/AWS, есть файл с именемcloud-init-output, который содержит stdout/stderr скрипта userdata.

Другим способом будет использование terraforms remotee-exec provisioner, который позволяет выполнять команды с терраформы на удаленной машине.

https://www.terraform.io/docs/provisioners/remote-exec.html

0
ответ дан 4 December 2019 в 03:36

Для проверки содержимого визуализируемого сценария у вас есть несколько возможностей:

  • запустить терраформальный план и проверить результаты
  • проверить пользовательские данные из консоли EC2
  • использовать e. Например, null_ressource с локальным провайдером, который выводит шаблон с помощью, например, echo или cat.
0
ответ дан 4 December 2019 в 03:36

Теги

Похожие вопросы