Я создаю сценарий для удаленной установки модуля 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?
Вы используете данные пользователя неправильно. Пожалуйста, смотрите документацию по облакам.
Ваш шаблон должен содержать нечто подобное (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, знайте, что он сломан с использованием неправильных отпечатков.
Похоже, это не совсем связано с терраформированием. Механизм userdata является функцией EC2.
Для отладки пользовательских данных можно проверить /var/log/
и поискать файлы с именем cloud-init
. По крайней мере, на изображениях, основанных на CentOS/AWS, есть файл с именемcloud-init-output
, который содержит stdout/stderr скрипта userdata.
Другим способом будет использование terraforms remotee-exec provisioner, который позволяет выполнять команды с терраформы на удаленной машине.
Для проверки содержимого визуализируемого сценария у вас есть несколько возможностей: