2016-12-02 1 views
0

У меня есть сценарий оболочки, который я хочу запустить во время загрузки. В этом скрипте я использую aws cli для обновления набора записей IP до route53, если я запускаю скрипт из командной строки (как пользователь root), он работает. Если он запускается во время загрузки, он терпит неудачу. Я уже установил учетные данные aws для пользователя root. Мой update-route53-record.shЕсли я запускаю скрипт из командной строки (с правами root), он работает. Если он работает во время загрузки, он не работает

#!/bin/bash 

DOMAIN_NAME="mydomain.com" 
HOSTED_ZONE_ID="Z1986XXXXXXXXX" 

main(){ 
    UPDATED_IP_LIST=$(updated_ip_list)  
    update_route53_record "$UPDATED_IP_LIST" 
} 

# Get IP List of $DOMAIN_NAME from route53 
get_ip_list(){ 
    RECORD_SET_JSON=$(aws route53 list-resource-record-sets --hosted-zone-id Z1986QIYBBYSUJ --query "ResourceRecordSets[?Name == '$DOMAIN_NAME.']") 

    #Remove the first and last character in string to convert json array to json object 
    RECORD_SET_JSON=${RECORD_SET_JSON:1:-1} 

    # Need to install jq to parse json http://xmodulo.com/how-to-parse-json-string-via-command-line-on-linux.html 
    # Get value of ResourceRecords 
    RECORD_SET_JSON=$(echo $RECORD_SET_JSON | jq -r '.ResourceRecords') 

    echo $RECORD_SET_JSON 
} 

updated_ip_list(){ 
    # Get public IP of running instance 
    IP=$(curl http://169.254.169.254/latest/meta-data/public-ipv4) 
    # IP="192.168.10.1" 

    # Get IP list from Route53 by invoking get_ip_list 
    IP_LIST=$(get_ip_list)  

    # Get length of json array 
    LENGTH=$(echo $IP_LIST | jq '. | length') 

    # Add one element to last array 
    IP_LIST=$(echo $IP_LIST | jq '.['$LENGTH'].Value |= .+ '\"$IP\"'') 

    echo $IP_LIST 
} 

update_route53_record(){ 
    JSON_REQUEST='{ 
       "Comment": "Update the A record set", 
       "Changes": [ 
       { 
        "Action": "UPSERT", 
        "ResourceRecordSet": { 
        "Name": '\"$DOMAIN_NAME\"', 
        "Type": "A", 
        "TTL": 300, 
        "ResourceRecords": '$1' 
        } 
       } 
       ] 
      }' 
    #echo $JSON_REQUEST 
    #echo "Calling API..." 
    aws route53 change-resource-record-sets --hosted-zone-id "$HOSTED_ZONE_ID" --change-batch "$JSON_REQUEST" 

    # write to log file 
    echo "aws route53 change-resource-record-sets --hosted-zone-id \"$HOSTED_ZONE_ID\" --change-batch \"$JSON_REQUEST\"" | sudo tee /var/log/update-route53.log 
} 
main 
exit 0 

установить мой скрипт запускается во время загрузки

sudo cp update-route53-record.sh /etc/init.d 
sudo chmod +x /etc/init.d/update-route53-record.sh 
sudo update-rc.d update-route53-record.sh defaults 98 02 

Но если запустить скрипт из командной строки (как корень), он работает. Если он запускается во время загрузки, он терпит неудачу. Я уже установил учетные данные aws для пользователя root. Не могли бы вы помочь?

+0

диапазон 169. Обычно это адрес «неспособный получить IP». Правильно ли я предполагаю, что вы пытаетесь запустить сценарий до того, как драйверы сетевых карт полностью загружены? –

+0

@SteveMatthews Итак, как запустить скрипт во время загрузки, но после полной загрузки драйверов сетевой карты? –

+0

Возможно, вы можете добавить сон к началу своего сценария, чтобы он начинался, но потом ждал? –

ответ

2

Возможно, это связано с тем, что вы используете sudo в своих пользовательских данных. AWS запускает эти команды как root, а использование sudo не будет работать, потому что sudo требует tty.

От AWS Documentation:

Сценарии вводятся как пользовательские данные, выполняются в качестве корневого пользователя, поэтому не следует использовать команду Sudo в сценарии.

Попробуйте удалить sudo и посмотреть, как вы идете.

+0

Я не использовал команду sudo в скрипте –

Смежные вопросы