現在、AWS SSMコマンドを使用して多数のWindowsインスタンスにパッチを適用して再起動していますが、SSMエージェントが常にチェックインしないという問題があります。私の考えは、作業をスピードアップすることです。各パッチでwhileループグループを実行して、グループ内の各インスタンスの稼働時間をプルできます。すべてのインスタンスが2分間動作すると、次のグループが再起動します。これを行うためにwhileループを正しく作成する方法に関する簡単な質問を理解できないようです。
次のコマンドをbashスクリプトとして実行すると、ループで「無効な算術演算子」を使用しようとしているというエラーが表示されます。私は$ upTimeの値「18」を出力してそれをテストしました。
これは私があまりにも多くの時間を無駄にし、誰かが私が何を間違っているかを素早く指摘した小さな混乱の一つであるようです。 $ upTimeの出力が数値の場合、ループ内でより少ない値が機能すると仮定します。 18にハード設定すると正しく繰り返されるので、SSMコマンドに奇妙なフォーマットの問題があるようですが、プレーンテキストである必要があり、テストの結果、スペースは通過しません。
#!/bin/bash
aws ec2 reboot-instances --instance-ids `aws ec2 describe-instances --filters "Name=tag:RebootGroup,Values=01" --query 'Reservations[].Instances[].InstanceId' --output text`
sleep 30
upTime=1
while [[ $upTime -le 120 ]]
do
ssmID=$(aws ssm send-command --document-name "AWS-RunPowerShellScript" --document-version "1" --targets '[{"Key":"tag:RebootGroup","Values":["01"]}]' --parameters '{"commands":["$wmi = Get-WmiObject -Class Win32_OperatingSystem ","$uptimeSeconds = ($wmi.ConvertToDateTime($wmi.LocalDateTime)-$wmi.ConvertToDateTime($wmi.LastBootUpTime) | select-object -expandproperty \"TotalSeconds\")","[int]$uptimeSeconds"],"workingDirectory":[""],"executionTimeout":["3600"]}' --timeout-seconds 600 --max-concurrency "50" --max-errors "0" --region us-west-2 --output text --query "Command.CommandId")
echo "Value of ssmID = $ssmID"
echo "Value of upTime before sleep = $upTime"
sleep 15
upTime=$(aws ssm list-command-invocations --command-id "$ssmID" --details --query "CommandInvocations[].CommandPlugins[].{Output:Output}" --output text)
echo "Value of upTime after command invocation = $upTime"
echo "Waiting for instance uptime of 2 minutes before continuing"
done
答え1
そこに誤ったキャリッジリターンがあります。
$ upTime=$'42\r'
$ [[ $upTime -le 120 ]] && echo y || echo n
")syntax error: invalid arithmetic operator (error token is "
n
そして、[[
エラーはゼロ以外の値を返し、whileループは早すぎます。
この試み:
printf "Value of upTime after command invocation = %q\n" "$upTime"
私が正しい場合は、パラメータ拡張を使用してCRを削除できます。
upTime=${upTime%$'\r'}
またはsedを使用してください
upTime=$(aws ... | sed 's/\r$//')