2017-02-08 3 views
0

der Befehl ausgeführt wird Parsen und die Instanz schafft, kann ich mich einloggen, führen Sie Updates, etc. aber die Userdata-Datei in nicht bestandenAWS Boto3 Python run_instances Methode nicht Userdata Parameter

Hier mein Skript ist.

#!/usr/bin/python 

import boto3 



def main(): 


    dev_server_ami_id = 'ami-0b33d91d' # This is currently the Amazon Linux base AMI. 
    dev_server_sec_group = 'xxxxxxxxxx' 
    dev_server_az = 'us-east-1a' 
    dev_server_subnet_id = 'xxxxxxxxxxx' 
    dev_server_name = 'test_server_name' 
    dev_instance_type = 't2.large' 
    slash_sites_size = 16 
    slash_scratch_size = 5 

    ec2client = boto3.client('ec2',aws_access_key_id='asdfasdfasdf',aws_secret_access_key='asdfasdfasdfasdf') 

    creation_response = ec2client.run_instances(DryRun=False,MinCount=1,ImageId=dev_server_ami_id, 
     MaxCount=1,KeyName='mcp_demo_dev',SecurityGroupIds=[dev_server_sec_group], 
     InstanceType=dev_instance_type,Placement={'AvailabilityZone': dev_server_az},SubnetId=dev_server_subnet_id,UserData="file://C:\\Users\\xxxxx\\Dev\\Site Where My Script Is\\base_server_bootstrap.sh", 
     BlockDeviceMappings=[{'DeviceName':'/dev/xvdb','Ebs':{'VolumeSize':slash_sites_size,'DeleteOnTermination':True}}, 
      {'DeviceName':'/dev/xvdc','Ebs':{'VolumeSize':slash_scratch_size,'DeleteOnTermination':True}}]) 
    instance_id = creation_response['Instances'][0]['InstanceId'] 
    ec2client.create_tags(Resources=[instance_id,],Tags=[{'Key':'Name','Value': dev_server_name,},],) 



if __name__ == "__main__": main() 

das ist alles noch in Arbeit, so weit das Skript angeht und ich habe ein paar verschiedene Möglichkeiten versucht, einschließlich da den python-Skript nur die Dateinamen in der Datei vorbei und meinem Shell-Skript in den gleichen Verzeichnis, übergibt nur den Namen des Shell-Skripts ohne den vollständigen Pfad mit der Datei "//" davor, sowie den vollständigen Pfad und den Skriptnamen mit Nein "file: //" davor.

Alle Tricks würden geschätzt werden, es scheint, dass die run_instances-Methode ignoriert nur diesen Parameter.

Als Referenz hier ist das Shell-Skript Ich versuche, in die run_instance() -Methode übergeben. Es wird nicht angerufen.

#!/bin/bash 

# 
# These variables will be used to create directories and name everything client specific. 
# All files that are pulled from S3 have to follow the naming convention and are client specific. 
# 

clientName="demo" 
# If both author and public are true then we are in DEV. 
magnoliaPublic=true 
magnoliaAuthor=true 
# Set this if the client is doing light-module development work. 
lightModule=true 
lightModuleFileName="one-pager-module.zip" 

# build the additional filesytems and mount points 
sudo mkfs -t ext4 /dev/xvdb 
sudo mkfs -t ext4 /dev/xvdc 
sudo mkdir /sites 
sudo mkdir /scratch 
sudo mount /dev/xvdb /sites 
sudo mount /dev/xvdc /scratch 

# add them to the fstab so that they will be there after a reboot 
sudo cat /etc/fstab > /home/ec2-user/fstab_temp 
sudo echo -e "/dev/xvdb\t/sites\text4\tdefaults,nofail\t0\t2" >> /home/ec2-user/fstab_temp 
sudo echo -e "/dev/xvdc\t/scratch\text4\tdefaults,nofail\t0\t2" >> /home/ec2-user/fstab_temp 
sudo cp /home/ec2-user/fstab_temp /etc/fstab 
sudo rm /home/ec2-user/fstab_temp 

# Set up of the base environment with Java and Tomcat. 

# Need to figure out how to set the specific version of the JDK that we install. Either copy it to S3 or direct it through yum. 
sudo yum -y install java-1.8.0-openjdk 
sudo groupadd tomcat 
sudo useradd -g tomcat tomcat 
sudo wget -O /home/tomcat/apache-tomcat-8.5.9.tar.gz http://mirror.stjschools.org/public/apache/tomcat/tomcat-8/v8.5.9/bin/apache-tomcat-8.5.9.tar.gz 
sudo tar -xf /home/tomcat/apache-tomcat-8.5.9.tar.gz -C /opt 
sudo rm /home/tomcat/apache-tomcat-8.5.9.tar.gz 
sudo chown -R tomcat:tomcat /opt/apache-tomcat-8.5.9/ 

# Create our individual JVM directory structure. 
sudo mkdir /sites/ 
sudo mkdir /sites/${clientName} 
sudo mkdir /sites/${clientName}/magnolia-base/ 
sudo mkdir /sites/${clientName}/light-module/ 
# If there is content to deploy to the light-module directory then grab it. 
if $lightModule; then 
    sudo aws s3 cp s3://mcp-${clientName}-light-module/${lightModuleFileName} /sites/${clientName}/light-module 
    sudo unzip /sites/${clientName}/light-module/${lightModuleFileName} -d /sites/${clientName}/light-module/ 
fi 
# Build the base tomcat directories for this client. 
sudo mkdir /sites/${clientName}/magnolia-base/common /sites/${clientName}/magnolia-base/conf /sites/${clientName}/magnolia-base/logs /sites/${clientName}/magnolia-base/server /sites/${clientName}/magnolia-base/shared /sites/${clientName}/magnolia-base/temp /sites/${clientName}/magnolia-base/work 
# Copy configs down from S3. mcp-demo-configs 
sudo aws s3 cp s3://mcp-${clientName}-configs/${clientName}_conf.zip /sites/${clientName}/magnolia-base/ 
sudo unzip /sites/${clientName}/magnolia-base/${clientName}_conf.zip -d /sites/${clientName}/magnolia-base/ 

# Set one or more appBase directories and copy our Magnolia WAR files in. 
if $magnoliaPublic; then 
    sudo mkdir /sites/${clientName}/magnolia-base/webapps_public 
    sudo aws s3 cp s3://mcp-${clientName}-magnolia-wars/demo-mcpLive-2.3.war /sites/${clientName}/magnolia-base/webapps_public 
fi 
if $magnoliaAuthor; then 
    sudo mkdir /sites/${clientName}/magnolia-base/webapps_author 
    sudo aws s3 cp s3://mcp-${clientName}-magnolia-wars/demo-mcpEdit-2.3.war /sites/${clientName}/magnolia-base/webapps_author 
fi 

sudo chown -R tomcat:tomcat /sites 

# From here on out everything is done as the tomcat user. 
sudo su - tomcat 

# Set up the environment variables. 
echo export "JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.121-0.b13.29.amzn1.x86_64" >> /home/tomcat/.bash_profile 
echo export JRE_HOME=\$JAVA_HOME/jre >> /home/tomcat/.bash_profile 

# Create our Tomcat setenv.sh file 
touch /opt/apache-tomcat-8.5.9/bin/setenv.sh 
echo export CATALINA_OPTS="$CATALINA_OPTS -XX:MaxPermSize=256m -Xms64M -Xmx1024M -Djava.awt.headless=true" >> /opt/apache-tomcat-8.5.9/bin/setenv.sh 
echo export CATALINA_HOME=/opt/apache-tomcat-8.5.9 >> /opt/apache-tomcat-8.5.9/bin/setenv.sh 
echo export CATALINA_BASE=/sites/${clientName}/magnolia-base >> /opt/apache-tomcat-8.5.9/bin/setenv.sh 
chmod 755 /opt/apache-tomcat-8.5.9/bin/setenv.sh 

sudo -S -u tomcat -i /bin/bash -l -c '/opt/apache-tomcat-8.5.9/bin/startup.sh' 

Vielen Dank im Voraus.

+0

Und diese Skriptdatei von 'run_instances auf die Instanz kopiert auf()'? Überprüfen Sie, ob es in '/ var/lib/cloud/instance-id/user-data.txt' verfügbar ist. – franklinsijo

+0

Danke für den Kommentar. Nein, diese Datei ist leer. Das ist mein Problem. Ich kann nicht herausfinden, wie man den Befehl formatiert, damit ich eine Datei mit meinen Benutzerdaten übergeben kann. Theoretisch kann es mit der Anweisung "file: //" ausgeführt werden, wenn es über die Befehlszeile ausgeführt wird. Ich kann keine Dokumente finden, die zeigen, wie man es in Python macht. –

+0

Können Sie es so übergeben 'Datei: /// C:/Benutzer/xxxxx/Dev/Site% 20 Wo% 20My Skript% 20Is/base_server_bootstrap.sh' und sehen, ob es funktioniert – franklinsijo

Antwort

0

Ihre Benutzerdaten sind falsch angegeben. In der ersten Zeile Ihrer Benutzerdaten sollte angegeben werden, ob es sich um ein Shell-Skript oder ein Cloud-Init-Skript handelt.

For a bash script, the first line should be:

#!/bin/bash 

Daten Shell Benutzer Skripte müssen mit der # beginnen! Zeichen und der Pfad zu dem Interpreter, den Sie das Skript lesen möchten (häufig/bin/bash). Eine großartige Einführung in das Shell-Scripting finden Sie in der BASH-Programmieranleitung im Linux-Dokumentationsprojekt (tldp.org).

Für cloud init

#cloud-config 

Die cloud-init Benutzerrichtlinien können auf die gleiche Weise bei der Einführung zu einer Instanz übergeben werden, dass ein Skript übergeben wird, obwohl die Syntax abweicht. Weitere Informationen zu cloud-init finden Sie unter http://cloudinit.readthedocs.org/en/latest/index.html.

+0

Danke für den Kommentar, aber das Skript, das ich in die Frage eingefügt habe, ist nicht das UserData-Skript, es ist ein Python-Skript, das "run_instances()" aufruft.Ich habe nicht mein UserData-Skript eingefügt, das tatsächlich ein Shell-Skript ist und oben die #!/Bin/bash-Zeile hat. Dieses Skript funktioniert perfekt, wenn ich eine Instanz über die Konsole starte. Ich kann das Python-Skript, das "run_instances()" aufruft, einfach nicht in einer Datei übergeben. –

+0

Es ist für uns unmöglich, Hilfe zu einem Skript anzubieten, das nicht wirklich veröffentlicht wurde. Viel Glück! – 2ps

+0

Leute, darum bitte ich nicht. Ich werde es jetzt hinzufügen, aber ich bitte um Hilfe zu einem Python-Befehl aus der Bibliothek boto3. –

0

Führen Sie den Skriptinhalt als String Userdata

zB:

ec2client.run_instances(,...,UserData=open("C:\\Users\\xxxxx\\Dev\\Site Where My Script Is\\base_server_bootstrap.sh").read(),...) 
Verwandte Themen