<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40"><head><meta http-equiv=Content-Type content="text/html; charset=utf-8"><meta name=Generator content="Microsoft Word 12 (filtered medium)"><!--[if !mso]><style>v\:* {behavior:url(#default#VML);}
o\:* {behavior:url(#default#VML);}
w\:* {behavior:url(#default#VML);}
.shape {behavior:url(#default#VML);}
</style><![endif]--><style><!--
/* Font Definitions */
@font-face
        {font-family:SimSun;
        panose-1:2 1 6 0 3 1 1 1 1 1;}
@font-face
        {font-family:"Cambria Math";
        panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
@font-face
        {font-family:Tahoma;
        panose-1:2 11 6 4 3 5 4 4 2 4;}
@font-face
        {font-family:Consolas;
        panose-1:2 11 6 9 2 2 4 3 2 4;}
@font-face
        {font-family:"\@SimSun";
        panose-1:2 1 6 0 3 1 1 1 1 1;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0in;
        margin-bottom:.0001pt;
        font-size:12.0pt;
        font-family:"Times New Roman","serif";}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:blue;
        text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
        {mso-style-priority:99;
        color:purple;
        text-decoration:underline;}
code
        {mso-style-priority:99;
        font-family:"Courier New";}
pre
        {mso-style-priority:99;
        mso-style-link:"HTML Preformatted Char";
        margin:0in;
        margin-bottom:.0001pt;
        font-size:10.0pt;
        font-family:"Courier New";}
span.HTMLPreformattedChar
        {mso-style-name:"HTML Preformatted Char";
        mso-style-priority:99;
        mso-style-link:"HTML Preformatted";
        font-family:"Consolas","serif";}
span.EmailStyle20
        {mso-style-type:personal-reply;
        font-family:"Calibri","sans-serif";
        color:#1F497D;}
.MsoChpDefault
        {mso-style-type:export-only;}
@page WordSection1
        {size:8.5in 11.0in;
        margin:1.0in 1.0in 1.0in 1.0in;}
div.WordSection1
        {page:WordSection1;}
--></style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]--></head><body lang=EN-US link=blue vlink=purple><div class=WordSection1><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>Jason, thanks for the information! Very helpful. Andy<o:p></o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'><o:p> </o:p></span></p><div style='border:none;border-top:solid #B5C4DF 1.0pt;padding:3.0pt 0in 0in 0in'><p class=MsoNormal><b><span style='font-size:10.0pt;font-family:"Tahoma","sans-serif"'>From:</span></b><span style='font-size:10.0pt;font-family:"Tahoma","sans-serif"'> python-bounces@lists.noisebridge.net [mailto:python-bounces@lists.noisebridge.net] <b>On Behalf Of </b>Jason Monroe<br><b>Sent:</b> Tuesday, November 10, 2015 12:56 AM<br><b>To:</b> python@lists.noisebridge.net<br><b>Subject:</b> [Python] Basics on how to create instances with digitalocean<o:p></o:p></span></p></div><p class=MsoNormal><o:p> </o:p></p><div><div><p class=MsoNormal>Hello All,<o:p></o:p></p></div><div><p class=MsoNormal><o:p> </o:p></p></div><div><p class=MsoNormal>In the class tonight we didn't go over all of these various aspects but we got through some of them. <o:p></o:p></p></div><div><p class=MsoNormal><o:p> </o:p></p></div><div><p class=MsoNormal>I thought I would put together a sort of step by step to help those that didn't go who had an interest get through it. <o:p></o:p></p></div><div><p class=MsoNormal><o:p> </o:p></p></div><div><p class=MsoNormal><o:p> </o:p></p></div><div><p class=MsoNormal><o:p> </o:p></p></div><div><p class=MsoNormal>Step 1) Go to Digitalocean.com and sign up for an account<o:p></o:p></p></div><div><p class=MsoNormal><o:p> </o:p></p></div><div><p class=MsoNormal>2) Click on the API button the top of the screen and create yourself an API token <o:p></o:p></p></div><div><p class=MsoNormal>store the token in a safe place<o:p></o:p></p></div><div><p class=MsoNormal><o:p> </o:p></p></div><div><p class=MsoNormal>3) Create an ssh-key<o:p></o:p></p></div><div><p class=MsoNormal>you can do this with ssh-keygen from a unix terminal <o:p></o:p></p></div><div><p class=MsoNormal>command: ssh-keygen -t rsa -b 8192 -f ~/.ssh/do<o:p></o:p></p></div><div><p class=MsoNormal><o:p> </o:p></p></div><div><p class=MsoNormal>You can add a passphrase if you like<o:p></o:p></p></div><div><p class=MsoNormal><o:p> </o:p></p></div><div><p class=MsoNormal><o:p> </o:p></p></div><div><p class=MsoNormal>4) Go to Digital Ocean In the top on the right click the [ GEAR ICON ] -> Select Settings <o:p></o:p></p></div><div><p class=MsoNormal>then go to Security on the left hand side<o:p></o:p></p></div><div><p class=MsoNormal><o:p> </o:p></p></div><div><p class=MsoNormal>5) Select Add key <o:p></o:p></p></div><div><p class=MsoNormal>Paste in THE PUBLIC KEY <o:p></o:p></p></div><div><p class=MsoNormal>Which from the example above is ~/.ssh/do.pub <o:p></o:p></p></div><div><p class=MsoNormal><o:p> </o:p></p></div><div><p class=MsoNormal>6) Select "Create Key" <o:p></o:p></p></div><div><p class=MsoNormal><o:p> </o:p></p></div><div><p class=MsoNormal>7) Get the fingerprint for that key <o:p></o:p></p></div><div><p class=MsoNormal>curl -X GET -H 'Content-Type: application/json' -H 'Authorization: Bearer b7d03a6947b217efb6f3ec3bd3504582' "<a href="https://api.digitalocean.com/v2/account/keys">https://api.digitalocean.com/v2/account/keys</a>"<o:p></o:p></p></div><div><p class=MsoNormal><o:p> </o:p></p></div><div><p class=MsoNormal>The value b7XXX is your TOKEN <o:p></o:p></p></div><div><p class=MsoNormal><o:p> </o:p></p></div><div><p class=MsoNormal>CURL mostly available on Linux, Mac, or Cygwin <o:p></o:p></p></div><div><p class=MsoNormal><o:p> </o:p></p></div><div><p class=MsoNormal>8) You will get something like this: <o:p></o:p></p></div><div><pre style='background:#25323A;overflow:auto'><code><span style='font-size:10.5pt;color:#A7B3B8'>{<o:p></o:p></span></code></pre><pre style='background:#25323A'><code><span style='font-size:10.5pt;color:#A7B3B8'>  "</span></code><code><span style='font-size:10.5pt;color:#DFC267'>ssh_keys</span></code><code><span style='font-size:10.5pt;color:#A7B3B8'>": [<o:p></o:p></span></code></pre><pre style='background:#25323A'><code><span style='font-size:10.5pt;color:#A7B3B8'>    {<o:p></o:p></span></code></pre><pre style='background:#25323A'><code><span style='font-size:10.5pt;color:#A7B3B8'>      "</span></code><code><span style='font-size:10.5pt;color:#DFC267'>id</span></code><code><span style='font-size:10.5pt;color:#A7B3B8'>": </span></code><code><span style='font-size:10.5pt;color:#64C0B9'>512189</span></code><code><span style='font-size:10.5pt;color:#A7B3B8'>,<o:p></o:p></span></code></pre><pre style='background:#25323A'><code><span style='font-size:10.5pt;color:#A7B3B8'>      "</span></code><code><span style='font-size:10.5pt;color:#DFC267'>fingerprint</span></code><code><span style='font-size:10.5pt;color:#A7B3B8'>": </span></code><code><span style='font-size:10.5pt;color:#64C0B9'>"3b:16:bf:e4:8b:00:8b:b8:59:8c:a9:d3:f0:19:45:fa"</span></code><code><span style='font-size:10.5pt;color:#A7B3B8'>,<o:p></o:p></span></code></pre><pre style='background:#25323A'><code><span style='font-size:10.5pt;color:#A7B3B8'>      "</span></code><code><span style='font-size:10.5pt;color:#DFC267'>public_key</span></code><code><span style='font-size:10.5pt;color:#A7B3B8'>": </span></code><code><span style='font-size:10.5pt;color:#64C0B9'>"ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAAAQQDDHr/jh2Jy4yALcK4JyWbVkPRaWmhck3IgCoeOO3z1e2dBowLh64QAM+Qb72pxekALga2oi4GvT+TlWNhzPH4V example"</span></code><code><span style='font-size:10.5pt;color:#A7B3B8'>,<o:p></o:p></span></code></pre><pre style='background:#25323A'><code><span style='font-size:10.5pt;color:#A7B3B8'>      "</span></code><code><span style='font-size:10.5pt;color:#DFC267'>name</span></code><code><span style='font-size:10.5pt;color:#A7B3B8'>": </span></code><code><span style='font-size:10.5pt;color:#64C0B9'>"My SSH Public Key"</span></code><code><span style='font-size:10.5pt;color:#A7B3B8'><o:p></o:p></span></code></pre><pre style='background:#25323A'><code><span style='font-size:10.5pt;color:#A7B3B8'>    }<o:p></o:p></span></code></pre><pre style='background:#25323A'><code><span style='font-size:10.5pt;color:#A7B3B8'>  ],<o:p></o:p></span></code></pre><pre style='background:#25323A'><code><span style='font-size:10.5pt;color:#A7B3B8'>  "</span></code><code><span style='font-size:10.5pt;color:#DFC267'>links</span></code><code><span style='font-size:10.5pt;color:#A7B3B8'>": {<o:p></o:p></span></code></pre><pre style='background:#25323A'><code><span style='font-size:10.5pt;color:#A7B3B8'>  },<o:p></o:p></span></code></pre><pre style='background:#25323A'><code><span style='font-size:10.5pt;color:#A7B3B8'>  "</span></code><code><span style='font-size:10.5pt;color:#DFC267'>meta</span></code><code><span style='font-size:10.5pt;color:#A7B3B8'>": {<o:p></o:p></span></code></pre><pre style='background:#25323A'><code><span style='font-size:10.5pt;color:#A7B3B8'>    "</span></code><code><span style='font-size:10.5pt;color:#DFC267'>total</span></code><code><span style='font-size:10.5pt;color:#A7B3B8'>": </span></code><code><span style='font-size:10.5pt;color:#64C0B9'>1</span></code><code><span style='font-size:10.5pt;color:#A7B3B8'><o:p></o:p></span></code></pre><pre style='background:#25323A'><code><span style='font-size:10.5pt;color:#A7B3B8'>  }<o:p></o:p></span></code></pre><pre style='background:#25323A'><code><span style='font-size:10.5pt;color:#A7B3B8'>}</span></code><span style='font-size:1.0pt;color:white'><o:p></o:p></span></pre></div><div><p class=MsoNormal><o:p> </o:p></p></div><div><p class=MsoNormal>9)  Record the Fingerprint value<o:p></o:p></p></div><div><p class=MsoNormal><o:p> </o:p></p></div><div><p class=MsoNormal>10) Create a text file called myconfig.cfg <o:p></o:p></p></div><div><p class=MsoNormal><o:p> </o:p></p></div><div><p class=MsoNormal>11) In the file put the following values <o:p></o:p></p></div><div><div><p class=MsoNormal>[mysection]<o:p></o:p></p></div><div><p class=MsoNormal>stoken=    REPLACE_ME_WITH_YOUR_TOKEN_REMOVE_LEADING_SPACES<o:p></o:p></p></div></div><div><p class=MsoNormal><o:p> </o:p></p></div><div><p class=MsoNormal>12) The code to make it work <o:p></o:p></p></div><div><div><p class=MsoNormal><o:p> </o:p></p></div><div><p class=MsoNormal>import requests <o:p></o:p></p></div><div><p class=MsoNormal>import ConfigParser<o:p></o:p></p></div><div><p class=MsoNormal><o:p> </o:p></p></div><div><p class=MsoNormal>Config = ConfigParser.ConfigParser()<o:p></o:p></p></div><div><p class=MsoNormal>filename="myconfig.cfg"<o:p></o:p></p></div><div><p class=MsoNormal>Config.read(filename)<o:p></o:p></p></div><div><p class=MsoNormal>stoken=Config.get('mysection','stoken')<o:p></o:p></p></div><div><p class=MsoNormal><o:p> </o:p></p></div><div><p class=MsoNormal>mypayload = {"name":"<a href="http://example.com">example.com</a>","region":"nyc3","size":"512mb","image":"ubuntu-14-04-x64","backups":False,"ipv6":True,'ssh_keys':["e3:5f:6c:79:f4:3d:8f:2e:22:d3:59:c3:e1:59:4b:3c"]}<o:p></o:p></p></div><div><p class=MsoNormal>headers = { 'Content-Type':'application/json','Authorization':'Bearer ' + stoken }<o:p></o:p></p></div><div><p class=MsoNormal>endpoint= "<a href="https://api.digitalocean.com/v2/droplets">https://api.digitalocean.com/v2/droplets</a>"<o:p></o:p></p></div><div><p class=MsoNormal>r =requests.post(endpoint,json=mypayload,headers=headers)<o:p></o:p></p></div></div><div><p class=MsoNormal>print r.text<o:p></o:p></p></div><div><p class=MsoNormal><o:p> </o:p></p></div><div><p class=MsoNormal><o:p> </o:p></p></div><div><p class=MsoNormal>13) SEE THE ssh_keys VALUE? <o:p></o:p></p></div><div><p class=MsoNormal><o:p> </o:p></p></div><div><p class=MsoNormal>14) Change that to be the value from STEP 8 <o:p></o:p></p></div><div><p class=MsoNormal><o:p> </o:p></p></div><div><p class=MsoNormal>15) You should then see <o:p></o:p></p></div><div><p class=MsoNormal>A JSON output like: <o:p></o:p></p></div><div><p class=MsoNormal>{"droplet":{"id":8710128,"name":"<a href="http://example.com">example.com</a>","memory":512,"vcpus":1,"disk":20,"locked":true,"status":"new","kernel":{"id":5175,"name":"Ubuntu 14.04 x64 vmlinuz-3.13.0-57-generic","version":"3.13.0-57-generic"},"created_at":"2015-11-10T08:36:50Z","features":["virtio"],"backup_ids":[],"next_backup_window":null,"snapshot_ids":[],"image":{"id":13089493,"name":"14.04 x64","distribution":"Ubuntu","slug":"ubuntu-14-04-x64","public":true,"regions":["nyc1","ams1","sfo1","nyc2","ams2","sgp1","lon1","nyc3","ams3","fra1","tor1"],"created_at":"2015-08-10T21:30:19Z","min_disk_size":20,"type":"snapshot"},"size":{"slug":"512mb","memory":512,"vcpus":1,"disk":20,"transfer":1.0,"price_monthly":5.0,"price_hourly":0.00744,"regions":["nyc1","sgp1","sfo1","nyc2","lon1","nyc3","ams3","ams2","fra1","tor1"],"available":true},"size_slug":"512mb","networks":{"v4":[],"v6":[]},"region":{"name":"New York 3","slug":"nyc3","sizes":["512mb","1gb","2gb","4gb","8gb","16gb","32gb","48gb","64gb"],"features":["private_networking","backups","ipv6","metadata"],"available":true}},"links":{"actions":[{"id":71198937,"rel":"create","href":"<a href="https://api.digitalocean.com/v2/actions/71198937">https://api.digitalocean.com/v2/actions/71198937</a>"}]}<o:p></o:p></p></div><div><p class=MsoNormal><o:p> </o:p></p></div><div><p class=MsoNormal><o:p> </o:p></p></div><div><p class=MsoNormal><o:p> </o:p></p></div><div><p class=MsoNormal><o:p> </o:p></p></div><div><p class=MsoNormal>16) After 60 seconds you should see something like this in the console<o:p></o:p></p></div><div><p class=MsoNormal><img border=0 width=544 height=33 id="_x0000_i1025" src="cid:image001.png@01D11D18.08F612A0" alt="Inline image 1"><o:p></o:p></p></div><div><p class=MsoNormal>You can test the login with <o:p></o:p></p></div><div><p class=MsoNormal>ssh -i ~/.ssh/do <a href="mailto:root@159.203.140.36">root@159.203.140.36</a><o:p></o:p></p></div><div><p class=MsoNormal><o:p> </o:p></p></div><div><p class=MsoNormal>after a few seconds you should see the root login prompt<o:p></o:p></p></div><div><p class=MsoNormal><o:p> </o:p></p></div><div><p class=MsoNormal><o:p> </o:p></p></div><div><p class=MsoNormal><o:p> </o:p></p></div><div><p class=MsoNormal>DONE<o:p></o:p></p></div><div><p class=MsoNormal><o:p> </o:p></p></div><div><p class=MsoNormal><o:p> </o:p></p></div><div><p class=MsoNormal><o:p> </o:p></p></div><div><p class=MsoNormal>More information on the digitial ocean API <o:p></o:p></p></div><div><p class=MsoNormal><a href="https://developers.digitalocean.com/documentation/v2/">https://developers.digitalocean.com/documentation/v2/</a><o:p></o:p></p></div><div><p class=MsoNormal><o:p> </o:p></p></div><p class=MsoNormal>More information on python requests API and how to do more complicated stuff in that library<o:p></o:p></p><div><p class=MsoNormal><a href="http://docs.python-requests.org/en/latest/user/quickstart/#more-complicated-post-requests">http://docs.python-requests.org/en/latest/user/quickstart/#more-complicated-post-requests</a><o:p></o:p></p><div><p class=MsoNormal><o:p> </o:p></p></div><div><p class=MsoNormal><o:p> </o:p></p></div><div><p class=MsoNormal>More information on how to use ConfigParser: can be found at: <o:p></o:p></p></div><div><p class=MsoNormal><o:p> </o:p></p></div><div><p class=MsoNormal><a href="https://wiki.python.org/moin/ConfigParserExamples">https://wiki.python.org/moin/ConfigParserExamples</a><o:p></o:p></p></div></div></div></div></body></html>