summaryrefslogtreecommitdiff
path: root/src/talks
diff options
context:
space:
mode:
authorMonty Taylor <mordred@inaugust.com>2017-08-31 12:32:23 -0500
committerMonty Taylor <mordred@inaugust.com>2017-08-31 12:32:23 -0500
commitbc1959ed31bb252f20ac085fc08c046836beffb3 (patch)
treede803a86b6aae105bc5864e830d5fa0aac40c256 /src/talks
parentfa70aa05d5679d72a312ce5a9207d4b70cd9725f (diff)
Add ansible openstack talk for Huawei Connect
Diffstat (limited to 'src/talks')
-rw-r--r--src/talks/ansible-openstack.hbs502
-rw-r--r--src/talks/global-interop.hbs250
2 files changed, 579 insertions, 173 deletions
diff --git a/src/talks/ansible-openstack.hbs b/src/talks/ansible-openstack.hbs
new file mode 100644
index 0000000..4b2af33
--- /dev/null
+++ b/src/talks/ansible-openstack.hbs
@@ -0,0 +1,502 @@
1<!doctype html>
2<html lang="en">
3
4 <head>
5 <meta charset="utf-8">
6
7 <title>Using Ansible with OpenStack</title>
8
9 </head>
10 <body>
11
12 <section id="who-am-i-redhat" class="slide level2">
13 <h1>Who am I?</h1>
14 <img style="float:right; margin:24pt" src="/images/Logo_RH_CMYK_Default.jpg" />
15 <p> Office of Technology </p>
16 <p> Zuul </p>
17 <p> Ansible </p>
18 </section>
19
20 <section id="who-am-i-openstack" class="slide level2">
21 <h1>Who am I?</h1>
22 <img style="float:right; margin-right:24pt; width:300px; height: auto" src="/images/openstack-cloud-software-vertical-large.png" />
23 <p>Technical Committee</p>
24 <p>Developer Infrastructure Core Team</p>
25 <p>Former Foundation Board of Directors</p>
26 <p>PTL of shade project</p>
27 </section>
28
29 <section id="ansible" class="slide level1">
30 <h1>Ansible</h1>
31 <p>Ansible is a radically simple IT automation engine that automates cloud provisioning, configuration management, application deployment, intra-service orchestration, and many other IT needs.</p>
32 </section>
33
34 <section id="why-ansible-is-great" class="slide level1">
35 <h1>Why Ansible is Great</h1>
36 <ul>
37 <li>simple declarative YAML syntax</li>
38 <li>list of tasks to perform - easy to debug</li>
39 <li>agentless - don't infect machines under management</li>
40 <li>Open Source - thousands of contributors worldwide</li>
41 </ul>
42 </section>
43
44 <section id="ansible-overview" class="slide level1">
45 <h1>Ansible Overview</h1>
46 <ul>
47 <li>task - an action to perform</li>
48 <li>module - code that exposes a type of action</li>
49 <li>role - reusable collection of tasks to acomplish a goal</li>
50 <li>play - tasks and roles run on a specific host or hosts</li>
51 <li>inventory - list of locations available to run plays on</li>
52 <li>playbook - file containing one or more plays</li>
53 </ul>
54 </section>
55
56 <section id="ansible-simple-example" class="slide level1">
57 <h1>Ansible Simple Example</h1>
58 <p><em>simple.yaml</em></p>
59 <pre><code>
60- hosts: all
61 tasks:
62 - name: Print hostname of server
63 command: hostname
64 </code></pre>
65 <p>A <em>playbook</em> containing a <em>play</em> that will run
66 against all hosts in the <em>inventory</em>. It has one <em>task</em>
67 that uses the <em>command</em> module to run the "hostname" command.
68 </p>
69 </section>
70
71 <section id="ansible-longer-example" class="slide level1">
72 <h1>Ansible Longer Example</h1>
73 <p><em>longer.yaml</em></p>
74 <pre><code>
75- hosts: git
76 roles:
77 - create-mirror-locations
78- hosts: code-review.example.com
79 roles:
80 - create-repositories
81 </code></pre>
82 <p>A <em>playboook</em> containing two <em>plays</em>. The first runs
83 a <em>role</em> called "create-mirror-locations" against a group of hosts
84 from the <em>inventory</em> called "git". Then it runs a <em>role</em>
85 called "create-repositories" against a host from the <em>inventory</em>
86 called "code-review.example.com".
87 </p>
88 </section>
89
90 <section id="ansible-modules" class="slide level1">
91 <h1>Ansible Modules</h1>
92 <ul>
93 <li>Usually written in Python</li>
94 <li>Can do anything, not limited to executing commands on a server</li>
95 <li>Manipulate Network Switch Config (ansible-network)</li>
96 <li>Build Containers (ansible-container)</li>
97 <li>Interact with REST APIs</li>
98 </ul>
99 </section>
100
101 <section id="ansible-openstack-modules" class="slide level1">
102 <h1>Ansible OpenStack Modules</h1>
103 <ul>
104 <li><a href="http://docs.ansible.com/ansible/list_of_cloud_modules.html#openstack" class="uri">http://docs.ansible.com/ansible/list_of_cloud_modules.html#openstack</a></li>
105 <li>Focused on consuming OpenStack APIs</li>
106 <li>Some are end-user focused</li>
107 <li>Some are deployer focused</li>
108 </ul>
109 </section>
110
111 <section id="interop---work-on-all-openstack-clouds" class="slide level1">
112 <h1>Interop - Work on All OpenStack Clouds</h1>
113 <ul>
114 <li>Ansible's OpenStack modules work the same on every OpenStack cloud</li>
115 </ul>
116 <p class='fragment'>
117 Don't let the existence of Rackspace modules confuse you.
118 The OpenStack modules work just great on Rackspace</p>
119 </section>
120
121 <section id="work-around-deployer-differences-...-to-a-point" class="slide level1">
122 <h1>Work Around Deployer Differences ... To a Point</h1>
123 <ul>
124 <li>Herculean effort is made to hide a giant amount of differences</li>
125 <li>Even so - some bugs are EWONTFIX</li>
126 </ul>
127 <p class='fragment'>
128 A provider decided to redefine the OpenStack Availability Zone concept
129 complete with incompatible API changes. That is unsupportable.</p>
130 <p class='fragment'>PS. Don't do that</p>
131 </section>
132
133 <section id="based-on-shade-library" class="slide level1">
134 <h1>Based on shade library</h1>
135 <ul>
136 <li>OpenStack python library to abstract deployment differences</li>
137 <li>designed for multi-cloud</li>
138 <li>simple to use</li>
139 <li>massive scale
140 <ul>
141 <li>optional advanced features to handle &gt;20k servers a day</li>
142 </ul></li>
143 <li>Initial logic/design extracted from OpenStack Infra's nodepool</li>
144 <li>Turned in to library for re-use in Ansible</li>
145 </ul>
146 </section>
147
148 <section id="integration-testing" class="slide level1">
149 <h1>Integration Testing</h1>
150 <ul>
151 <li>Every shade patch is integration tested in OpenStack Infra</li>
152 <li>Every shade patch tests the ansible modules in OpenStack Infra</li>
153 <li>Support coming very soon to test PRs to ansible modules in OpenStack Infra</li>
154 </ul>
155 </section>
156
157 <section id="lets-take-a-few-steps-back" class="slide level1">
158 <h1>Let's Take a Few Steps Back</h1>
159 <p>OpenStack in Ansible and Multi-cloud Operations are easy...</p>
160 <p>but you need to know a few things.</p>
161 <ul>
162 <li>Module structure</li>
163 <li>Terminology</li>
164 <li>Config</li>
165 </ul>
166 </section>
167
168 <section id="module-structure" class="slide level1">
169 <h1>Module Structure</h1>
170 <ul>
171 <li>All modules start with <code>os_</code></li>
172 <li>End-user oriented modules are named for the resource
173 <ul>
174 <li>os_image</li>
175 <li>os_sever</li>
176 </ul>
177 </li>
178 <li>Operator oriented modules are named for the service
179 <ul>
180 <li>os_nova_flavor</li>
181 <li>os_keystone_domain</li>
182 </ul>
183 </li>
184 <li>If it could go both ways, we prefer user orientation
185 <ul>
186 <li>os_user</li>
187 <li>os_group</li>
188 </ul>
189 </li>
190 <li>If more than one service provides a resource, they DTRT
191 <ul>
192 <li>os_security_group</li>
193 <li>os_floating_ip</li>
194 </ul>
195 </li>
196 </ul>
197 </section>
198
199 <section id="openstack-dynamic-inventory-script" class="slide level1">
200 <h1>OpenStack Dynamic Inventory Script</h1>
201 <ul>
202 <li>github.com/ansible/ansible/contrib/inventory/openstack.py</li>
203 <li>Uses all hosts in all clouds as one inventory</li>
204 <li>Excludes hosts without IPs</li>
205 <li>Makes a bunch of auto-groups (flavor, image, az, region, cloud)</li>
206 <li>Makes groups for metadata['groups']</li>
207 </ul>
208 <p>New inventory plugin coming in Ansible 2.4</p>
209 </section>
210
211 <section id="modules-for-all-openstack-resources-are-welcome-upstream" class="slide level1">
212 <h1>Modules for All OpenStack Resources are Welcome Upstream</h1>
213 <ul>
214 <li>If there is a thing you want to manage that doesn't have a module,
215 add one</li>
216 <li>We're very welcoming/accepting</li>
217 <li>Same goes for features to existing modules</li>
218 </ul>
219 </section>
220
221 <section id="to-serve-all-users-we-have-to-be-strict" class="slide level1">
222 <h1>To Serve All Users, We Have to be Strict</h1>
223 <ul>
224 <li>Modules that touch OpenStack APIs must do so via shade library</li>
225 <li>In user modules, vendor differences should be hidden</li>
226 <li>In operator modules, exposing them is ok</li>
227 </ul>
228 </section>
229
230 <section id="clouds.yaml" class="slide level1">
231 <h1>clouds.yaml</h1>
232 <ul>
233 <li>Information about the clouds you want to connect to is stored in a
234 file called clouds.yaml.</li>
235 <li>In OpenStack Pike release, Horizon provides downloadable clouds.yaml</li>
236 <li>Both yaml and yml are acceptable.</li>
237 <li>clouds.yaml can be in your homedir: ~/.config/openstack/clouds.yaml or system-wide: /etc/openstack/clouds.yaml.</li>
238 <li>Information in your homedir, if it exists, takes precedence.</li>
239 <li>Full docs on clouds.yaml are at <a href="https://docs.openstack.org/developer/os-client-config/" class="uri">https://docs.openstack.org/developer/os-client-config/</a></li>
240 </ul>
241 </section>
242
243 <section id="what-about-mac-and-windows" class="slide level1">
244 <h1>What about Mac and Windows?</h1>
245 <p>USER_CONFIG_DIR is different on Linux, OSX and Windows.</p>
246 <ul>
247 <li>Linux: ~/.config/openstack</li>
248 <li>OSX: ~/Library/Application Support/openstack</li>
249 <li>Windows: C:\\Users\\USERNAME\\AppData\\Local\\OpenStack\\openstack</li>
250 </ul>
251 <p>SITE_CONFIG_DIR is different on Linux, OSX and Windows.</p>
252 <ul>
253 <li>Linux: /etc/openstack</li>
254 <li>OSX: /Library/Application Support/openstack</li>
255 <li>Windows: C:\\ProgramData\\OpenStack\\openstack</li>
256 </ul>
257 </section>
258
259 <section id="config-terminology" class="slide level1">
260 <h1>Config Terminology</h1>
261 <p>For multi-cloud, think of two types:</p>
262 <ul>
263 <li>profile - Facts about the cloud that are true for everyone</li>
264 <li>cloud - Information specific to a given user</li>
265 </ul>
266 </section>
267
268 <section id="remember-your-execution-context" class="slide level1">
269 <h1>Remember your Execution Context!</h1>
270 <ul>
271 <li>ansible executes code on remote systems</li>
272 <li>clouds.yaml needs to be on the host where the modules run</li>
273 <li>auth information can be passed to modules directly</li>
274 <li>other config (currently) MUST go in clouds.yaml</li>
275 <li class='fragment'>Ability to pass entire cloud config to module coming soon</li>
276 </ul>
277 </section>
278
279 <section id="basic-clouds.yaml-for-the-example-code" class="slide level1">
280 <h1>basic clouds.yaml for the example code</h1>
281 <p>Simple example of a clouds.yaml</p>
282 <ul>
283 <li>Config for a named cloud &quot;my-citycloud&quot;</li>
284 <li>Reference a well-known &quot;named&quot; profile: citycloud</li>
285 <li>os-client-config has a built-in list of profiles at <a href="https://docs.openstack.org/developer/os-client-config/vendor-support.html" class="uri">https://docs.openstack.org/developer/os-client-config/vendor-support.html</a></li>
286 <li>Vendor profiles contain various advanced config</li>
287 <li>cloud name can match profile name (using different names for clarity)</li>
288 </ul>
289 <div class="sourceCode"><pre class="sourceCode yaml"><code class="sourceCode yaml">
290clouds:
291 my-citycloud:
292 profile: citycloud
293 auth:
294 username: mordred
295 project_id: 65222a4d09ea4c68934fa1028c77f394
296 user_domain_id: d0919bd5e8d74e49adf0e145807ffc38
297 project_domain_id: d0919bd5e8d74e49adf0e145807ffc38
298 </code></pre></div>
299 <p>Where's the password?</p>
300 </section>
301
302 <section id="secure.yaml" class="slide level1">
303 <h1>secure.yaml</h1>
304 <ul>
305 <li>Optional additional file just like clouds.yaml</li>
306 <li>Values overlaid on clouds.yaml</li>
307 <li>Useful if you want to protect secrets more stringently</li>
308 </ul>
309 </section>
310
311 <section id="example-secure.yaml" class="slide level1">
312 <h1>Example secure.yaml</h1>
313 <ul>
314 <li>No, my password isn't XXXXXXXX</li>
315 <li>cloud name should match clouds.yaml</li>
316 <li>Optional - I actually keep mine in my clouds.yaml</li>
317 </ul>
318 <div class="sourceCode"><pre class="sourceCode yaml"><code class="sourceCode yaml">
319clouds:
320 my-citycloud:
321 auth:
322 password: XXXXXXXX
323 </code></pre></div>
324 </section>
325
326 <section id="more-clouds.yaml" class="slide level1">
327 <h1>more clouds.yaml</h1>
328 <p>More information can be provided.</p>
329 <ul>
330 <li>Use v3 of the identity API - even if others are present</li>
331 <li>Use https://image-ca-ymq-1.vexxhost.net/v2 for image API instead of what's in the catalog</li>
332 </ul>
333 <div class="sourceCode"><pre class="sourceCode yaml"><code class="sourceCode yaml">
334my-vexxhost:
335 identity_api_version: 3
336 image_endpoint_override: https://image-ca-ymq-1.vexxhost.net/v2
337 profile: vexxhost
338 auth:
339 user_domain_id: default
340 project_domain_id: default
341 project_name: d8af8a8f-a573-48e6-898a-af333b970a2d
342 username: 0b8c435b-cc4d-4e05-8a47-a2ada0539af1
343 </code></pre></div>
344 </section>
345
346 <section id="much-more-complex-clouds.yaml-example" class="slide level1">
347 <h1>Much more complex clouds.yaml example</h1>
348 <ul>
349 <li>Not using a profile - all settings included</li>
350 <li>In the ams01 region there are two networks with undiscoverable qualities</li>
351 <li>Each one are labeled here so choices can be made</li>
352 <li>Any of the settings can be specific to a region if needed</li>
353 <li>region settings override cloud settings</li>
354 <li>cloud does not support floating-ips</li>
355 </ul>
356 </section>
357
358 <section id="much-more-complex-clouds.yaml-example-core" class="slide level1">
359 <div class="sourceCode"><pre class="sourceCode yaml"><code class="sourceCode yaml">
360my-internap:
361 auth:
362 auth_url: https://identity.api.cloud.iweb.com
363 username: api-55f9a00fb2619
364 project_name: inap-17037
365 identity_api_version: 3
366 floating_ip_source: None
367 regions:
368 - name: ams01
369 values:
370 networks:
371 - name: inap-17037-WAN1654
372 routes_externally: true
373 default_interface: true
374 - name: inap-17037-LAN3631
375 routes_externally: false</code></pre></div>
376 </section>
377
378 <section id="extra-variables-to-control-inventory-behavior" class="slide level1">
379 <h1>Extra Variables to Control Inventory Behavior</h1>
380 <ul>
381 <li>
382 <dl>
383 <dt>expand_hostvars</dt>
384 <dd>whether to make extra API calls to fill out additional
385 information about each server
386 </dd>
387 </dl>
388 </li>
389 <li>
390 <dl>
391 <dt>use_hostnames</dt>
392 <dd>changes the behavior from registering every host with its
393 UUID and making a group of its hostname to only doing this if the
394 hostname in question has more than one server
395 </dd>
396 </dl>
397 </li>
398 <li>
399 <dl>
400 <dt>fail_on_errors</dt>
401 <dd>causes the inventory to fail and return no hosts if one
402 cloud has failed</dd>
403 </dl>
404 </li>
405 </ul>
406
407 <div class="sourceCode"><pre class="sourceCode yaml"><code class="sourceCode yaml">ansible:
408 use_hostnames: False
409 expand_hostvars: True
410 fail_on_errors: True</code></pre></div>
411 </section>
412 <section id="test-your-config" class="slide level1">
413 <h1>Test Your Config</h1>
414 <div class="sourceCode"><pre class="sourceCode yaml"><code class="sourceCode yaml">---
415- hosts: localhost
416 tasks:
417 - os_auth:
418 cloud: "{{ item.cloud }}"
419 region_name: "{{ item.region }}"
420 with_items:
421 - cloud: my-vexxhost
422 region: ca-ymq-1
423 - cloud: my-citycloud
424 region: Buf1
425 - cloud: my-internap
426 region: ams01
427 </code></pre></div>
428 </section>
429
430 <section id="more-interesting" class="slide level1">
431 <h1>More Interesting</h1>
432 <div class="sourceCode"><pre class="sourceCode yaml"><code class="sourceCode yaml">
433- hosts: localhost
434 tasks:
435 - os_server:
436 name: "my-server"
437 cloud: "{{ item.cloud }}"
438 region_name: "{{ item.region }}"
439 image: "{{ item.image }}"
440 flavor: "{{ item.flavor }}"
441 auto_ip: true
442 with_items:
443 - cloud: my-vexxhost
444 region: ca-ymq-1
445 image: Ubuntu 16.04.1 LTS [2017-03-03]
446 flavor: v1-standard-4
447 - cloud: my-citycloud
448 region: Buf1
449 image: Ubuntu 16.04 Xenial Xerus
450 flavor: 4C-4GB-100GB
451 - cloud: my-internap
452 region: ams01
453 image: Ubuntu 16.04 LTS (Xenial Xerus)
454 flavor: A1.4</code></pre></div>
455 </section>
456
457 <section id="check-that-there-is-an-inventory" class="slide level1">
458 <h1>Check That There is an Inventory</h1>
459 <blockquote>
460 python ~/src/github.com/ansible/ansible/contrib/inventory/openstack.py --list
461 </blockquote>
462 </section>
463
464 <section id="cleanup-after-ourselves" class="slide level1">
465 <h1>Cleanup After Ourselves</h1>
466 <div class="sourceCode"><pre class="sourceCode yaml"><code class="sourceCode yaml">
467- hosts: localhost
468 tasks:
469 - os_server:
470 cloud: "{{ item.cloud }}"
471 region_name: "{{ item.region }}"
472 name: my-server
473 state: absent
474 with_items:
475 - cloud: my-vexxhost
476 region: ca-ymq-1
477 - cloud: my-citycloud
478 region: Buf1
479 - cloud: my-internap
480 region: ams01
481 </code></pre></div>
482 </section>
483
484 <section id="check-out-ansible-cloud-launcher" class="slide level1">
485 <h1>Check out Ansible Cloud Launcher</h1>
486 <p><a href="https://git.openstack.org/cgit/openstack/ansible-role-cloud-launcher" class="uri">https://git.openstack.org/cgit/openstack/ansible-role-cloud-launcher</a></p>
487 <ul>
488 <li>Role for launching resources on an OpenStack Cloud</li>
489 </ul>
490 </section>
491
492 <section id="check-out-linch-pin" class="slide level1">
493 <h1>Check out Linch-pin</h1>
494 <p><a href="http://linch-pin.readthedocs.io/en/develop/" class="uri">http://linch-pin.readthedocs.io/en/develop/</a></p>
495 <ul>
496 <li>From our friends in CentOS</li>
497 </ul>
498 <p>Linch-pin provides a collection of Ansible playbooks for provisioning, decommissioning, and managing resources across multiple infrastructures. The main goal of linch-pin is to facilitate provisioning and orchestration of resources in a multi-cloud environment through a topology file.</p>
499 </section>
500
501 </body>
502</html>
diff --git a/src/talks/global-interop.hbs b/src/talks/global-interop.hbs
index 90f17c6..52de08f 100644
--- a/src/talks/global-interop.hbs
+++ b/src/talks/global-interop.hbs
@@ -45,11 +45,22 @@
45 </section> 45 </section>
46 46
47 <section class="slide level2"> 47 <section class="slide level2">
48 <p>
49 I want to write some new Cloud Native applications while continuing
50 to make use of my existing investments.</p>
51 </section>
52
53 <section class="slide level2">
54 <p>
55 I need to move faster than before AND I need increased stability at
56 the same time.</p>
57 </section>
58
59 <section class="slide level2">
48 <h1>THIS WORKS</h1> 60 <h1>THIS WORKS</h1>
49 <h3>I'm doing it myself as we speak</h3> 61 <h3>I'm doing it myself as we speak</h3>
50 <img style="float:right; margin-right:24pt" src="/images/graphite.openstack.org.png"/> 62 <img style="float:right; margin-right:24pt" src="/images/graphite.openstack.org.png"/>
51 63
52
53 <p class='fragment'>20k VMs per-day</p> 64 <p class='fragment'>20k VMs per-day</p>
54 <p class='fragment'>20 Cloud Regions in 9 clouds</p> 65 <p class='fragment'>20 Cloud Regions in 9 clouds</p>
55 <p class='fragment'>Only using OpenStack APIs</p> 66 <p class='fragment'>Only using OpenStack APIs</p>
@@ -61,20 +72,27 @@
61 </section> 72 </section>
62 73
63 <section id="tooling-automation-and-ci-for-openstack-project" class="slide level2" data-transition='zoom'> 74 <section id="tooling-automation-and-ci-for-openstack-project" class="slide level2" data-transition='zoom'>
64 <h1>Tooling, Automation and CI for OpenStack Project</h1> 75 <h1>Tooling and Automation for the development of OpenStack Project</h1>
65 </section> 76 </section>
66 77
67 <section id="developers" class="slide level2" data-transition='zoom'> 78 <section id="developers" class="slide level2" data-transition='zoom'>
68 <h1>2000 Developers</h1> 79 <h1>&gt;2500 Developers</h1>
69 </section> 80 </section>
70 81
71 <section id="gated-commits" class="slide level2" data-transition='zoom'> 82 <section id="gated-commits" class="slide level2" data-transition='zoom'>
72 <h1>Gated Commits</h1> 83 <h1>Gated Changes</h1>
73 <p>Every commit is fully integration tested (twice) before landing</p> 84 <p>Every change goes through enforced automatic full integration testing
85 <em>(at least twice)</em> before landing</p>
74 </section> 86 </section>
75 87
76 <section id="each-test-runs-on-a-single-use-cloud-slave" class="slide level2" data-transition='zoom'> 88 <section id="integration-testing" class="slide level2" data-transition='zoom'>
77 <h1>Each Test Runs on a Single Use Cloud Slave</h1> 89 <h1>Integration Testing</h1>
90 <p>Install and run one or more clouds then validate that those clouds
91 work.</p>
92 </section>
93
94 <section id="each-test-runs-on-a-single-use-cloud-server" class="slide level2" data-transition='zoom'>
95 <h1>Each Test Job Runs on Single Use Cloud Servers</h1>
78 <p>This is that "cloud scale out" part</p> 96 <p>This is that "cloud scale out" part</p>
79 </section> 97 </section>
80 98
@@ -82,8 +100,8 @@
82 <h1>2 KJPH (kilo-jobs per hour)</h1> 100 <h1>2 KJPH (kilo-jobs per hour)</h1>
83 </section> 101 </section>
84 102
85 <section id="our-vms-are-everywhere" class="slide level2"> 103 <section id="our-cloud-servers-are-everywhere" class="slide level2">
86 <h1>Our VMs are everywhere</h1> 104 <h1>Our Cloud Servers are everywhere</h1>
87 <h3>Public Clouds</h3> 105 <h3>Public Clouds</h3>
88 <ul> 106 <ul>
89 <li>Rackspace: Dallas, Chicago, DC</li> 107 <li>Rackspace: Dallas, Chicago, DC</li>
@@ -115,9 +133,9 @@
115 <section class="slide level2"> 133 <section class="slide level2">
116 <h1>Gerrit</h1> 134 <h1>Gerrit</h1>
117 <ul> 135 <ul>
118 <li class="fragment"> 136 <li class="fragment">Code Review and Code Hosting</li>
119 Traditional 'Enterprise' Java Application</li> 137 <li class="fragment">Traditional 'Enterprise' Java Application</li>
120 <li class="fragment">Single Nova VM, Cinder Volume</li> 138 <li class="fragment">Single OpenStack Nova VM, Cinder Volume</li>
121 <li class="fragment">Scale out farm of git replicas</li> 139 <li class="fragment">Scale out farm of git replicas</li>
122 </ul> 140 </ul>
123 </section> 141 </section>
@@ -125,9 +143,8 @@
125 <section class="slide level2"> 143 <section class="slide level2">
126 <h1>nodepool</h1> 144 <h1>nodepool</h1>
127 <ul> 145 <ul>
128 <li class="fragment">Cloud Native</li> 146 <li class="fragment">Cloud Native resource manager</li>
129 <li class="fragment"> 147 <li class="fragment">Purpose built in Python</li>
130 Purpose built in Python</li>
131 <li class="fragment">Keeps a pool of ready to go nodes</li> 148 <li class="fragment">Keeps a pool of ready to go nodes</li>
132 <li class="fragment">Multi-cloud</li> 149 <li class="fragment">Multi-cloud</li>
133 <li class="fragment">Fully elastic - responds to demand</li> 150 <li class="fragment">Fully elastic - responds to demand</li>
@@ -135,129 +152,22 @@
135 </section> 152 </section>
136 153
137 <section class="slide level2"> 154 <section class="slide level2">
138 <h1>How do we do this?</h1> 155 <h1>zuul</h1>
139 </section>
140
141 <section class="slide level2">
142 <h1>Control plane</h1>
143 <h3>http://git.openstack.org/cgit/openstack-infra/system-config</h3>
144 <ul>
145 <li>All server config management in git</li>
146 <li>Puppet manages the servers: puppet apply</li>
147 <li>Ansible runs puppet: ansible puppet module</li>
148 <li>Ansible OpenStack Dynamic Inventory</li>
149 <li>Only thing not public are keys and secrets</li>
150 </ul>
151 </section>
152
153 <section class="slide level2">
154 <h1>os-client-config</h1>
155 <h3>http://git.openstack.org/cgit/openstack/os-client-config</h3>
156 <h3>https://docs.openstack.org/os-client-config/latest/</h3>
157 <p>A library to handle config information for openstack clients</p>
158 <p>Tracks differences in vendors that can't be discovered</p>
159 <p>In use in python-openstackclient, shade and ansible</p>
160 <h3 class='fragment'>https://docs.openstack.org/os-client-config/latest/user/vendor-support.html</h3>
161 </section>
162
163 <section class="slide level2">
164 <h1>os-client-config</h1>
165 <p>~/.config/openstack/clouds.yaml</p>
166 <pre>
167clouds:
168 citycloud:
169 profile: citycloud
170 auth:
171 username: mordred
172 password: XXXXXXXXXXXXXXXXXXXXX
173 project_id: 65222a4d09ea4c68934fa1028c77f394
174 user_domain_id: d0919bd5e8d74e49adf0e145807ffc38
175 project_domain_id: d0919bd5e8d74e49adf0e145807ffc38
176 regions:
177 - Kna1
178 - Sto2
179 - Lon1
180 dreamcompute:
181 profile: dreamhost
182 auth:
183 username: montay6
184 project_name: dhc2111978
185 password: XXXXXXXXXXXXX
186 region_name: RegionOne
187 </pre>
188 </section>
189
190 <section class="slide level2">
191 <h1>shade</h1>
192 <h3>http://git.openstack.org/cgit/openstack-infra/shade</h3>
193 <p>A library to wrap business logic around client libraries</p>
194 <pre>
195cloud.create_image('image-name', filename='image-filename.qcow2')
196cloud.create_server('my-server', image='immage-name', auto_ip=True)
197 </pre>
198 <p>In use in Infra Nodepool and ansible</p>
199 </section>
200
201 <section class="slide level2">
202 <h1>ansible</h1>
203 <p>Based on shade</p>
204 <pre>
205- os_keypair:
206 cloud: citycloud
207 name: mordred
208 public_key_file: ~/.ssh/id_rsa.pub
209- os_image:
210 cloud: citycloud
211 name: Monty Ubuntu
212 file: ubuntu.vhd
213- os_server:
214 cloud: citycloud
215 name: my-server
216 flavor_ram: 1024
217 image: Monty Ubuntu
218 </pre>
219 </section>
220
221 <section class="slide level2">
222 <h1>ansible</h1>
223 <h2>Add my keypair to 12 clouds<h2>
224 <pre><code>
225- os_keypair:
226 cloud: "{{ item.cloud }}"
227 region_name: "{{ item.region_name }}"
228 name: mordred
229 public_key_file: ~/.ssh/id_rsa.pub
230 with-items:
231 - {cloud: vexxhost, region_name: ca-ymq-1}
232 - {cloud: ovh, region_name: GRA1}
233 - {cloud: ustack, region_name: bj1}
234 - {cloud: citycloud, region_name: Sto2}
235 - {cloud: internap, region_name: sin01}
236 - {cloud: fuga, region_name: cystack}
237 - {cloud: datacentred, region_name: sal01}
238 - {cloud: rax, region_name: SYD}
239 - {cloud: clouda, region_name: regionOne}
240 - {cloud: auro, region_name: van1}
241 - {cloud: zetta, region_name: no-osl1}
242 - {cloud: kiss, region_name: region1}
243 </code></pre>
244 </section>
245
246 <section class="slide level2">
247 <h1>nodepool</h1>
248 <ul> 156 <ul>
249 <li>Use shade to treat all cloud regions as one giant cloud</li> 157 <li>"Test it like you deploy it"</li>
250 <li>diskimage-builder makes identical base images for each</li> 158 <li>The Gatekeeper</li>
251 <li>Pre-cache network artifacts in disk images</li> 159 <li class="fragment">Microservices but with a centralized scheduler</li>
252 <li>glean instead of cloud-init to handle no-DHCP on Rackspace</li> 160 <li class="fragment">Responds to code review events from Gerrit</li>
253 <li>Pre-spins warm pool - always keep min-ready number of nodes</li> 161 <li class="fragment">Runs Ansible content on nodes from nodepool</li>
162 <li class="fragment">Use production Ansible to test proposed changes</li>
163 <small>Talk about Zuul Tomorrow 15:50-16:15 on stage OP5</small>
254 </ul> 164 </ul>
255 </section> 165 </section>
256 166
257 <section class="slide level2"> 167 <section class="slide level2">
258 <h1>OpenStack Works!</h1> 168 <h1>OpenStack Works!</h1>
259 <p class='fragment'>Why should you care?</p> 169 <p class='fragment'>Why should you care?</p>
260 <p class='fragment'>Is interop really important?</p> 170 <p class='fragment'>Is interoperability really important?</p>
261 </section> 171 </section>
262 172
263 <section class="slide level2"> 173 <section class="slide level2">
@@ -270,30 +180,25 @@ cloud.create_server('my-server', image='immage-name', auto_ip=True)
270 <section class="slide level2"> 180 <section class="slide level2">
271 <h1>Run it where you want</h1> 181 <h1>Run it where you want</h1>
272 <ul> 182 <ul>
273 <li>Geography</li>
274 <li>Delivery Model</li>
275 </ul>
276
277 </section>
278
279 <section class="slide level2">
280 <h1>Geography</h1>
281 <ul>
282 <li>Put it near your users</li> 183 <li>Put it near your users</li>
283 <li>Don't put it in an US data center</li> 184 <li>Avoid putting it in an US data center</li>
284 <li>Locality Requirements</li> 185 <li>Locality Requirements</li>
285 <li class='fragment'>What if you have customers in China?</li> 186 <li class='fragment'>What if you have customers in China?</li>
286 <li class='fragment'>What if you also have customers in Sweden?</li> 187 <li class='fragment'>What if you also have customers in Sweden?
188 <span class='fragment'>New Zealand?</span>
189 <span class='fragment'>Brazil?</span>
190 </li>
287 </ul> 191 </ul>
288 </section> 192 </section>
289 193
290 <section class="slide level2"> 194 <section class="slide level2">
291 <h1>Delivery Model</h1> 195 <h1>Run it how you want</h1>
292 <ul> 196 <ul>
293 <li>Public</li> 197 <li>Public</li>
294 <li>Hosted Private</li> 198 <li>Hosted Private</li>
295 <li>Managed Private On-Premise</li> 199 <li>Managed Private On-Premise</li>
296 <li>Run your own</li> 200 <li>Run your own with a partner/vendor</li>
201 <li>Run your own on your own</li>
297 </ul> 202 </ul>
298 </section> 203 </section>
299 204
@@ -312,7 +217,7 @@ cloud.create_server('my-server', image='immage-name', auto_ip=True)
312 217
313 <section class="slide level2" data-transition='zoom'> 218 <section class="slide level2" data-transition='zoom'>
314 <h1>Anybody <em>REALLY</em> think that should run in a 219 <h1>Anybody <em>REALLY</em> think that should run in a
315 Public Cloud owned by a US company?</h1> 220 Public Cloud owned and operated by a US company?</h1>
316 </section> 221 </section>
317 222
318 <section class="slide level2" data-transition='zoom'> 223 <section class="slide level2" data-transition='zoom'>
@@ -328,34 +233,21 @@ cloud.create_server('my-server', image='immage-name', auto_ip=True)
328 </section> 233 </section>
329 234
330 <section class="slide level2"> 235 <section class="slide level2">
331 <h1>Chinese OpenStack</h1> 236 <h1>OpenStack in Asia</h1>
332 <h2>Huawei</h2> 237 <h2>Huawei: First Chinese Platinum Member of OpenStack Foundation</h2>
333 <div class='fragment'><p><small>sorted alphabetically</small></p> 238 <p class='fragment'>
334 <p>99 Cloud</p> 239 Only 8 of the 24 Gold Member Companies are non-Asian</p>
335 <p>China Mobile</p>
336 <p>China National Offshore Oil Corp</p>
337 <p>China Telecom</p>
338 <p>China Unicom</p>
339 <p>EasyStack</p>
340 <p>Inspur</p>
341 <p>Sinorail</p>
342 <p>State Grid of China</p>
343 <p>T2 Cloud</p>
344 <p>Tencent</p>
345 <p>UMCloud</p>
346 <p>UnitedStack</p>
347 <p>ZTE</p>
348 </section> 240 </section>
349 241
350 <section class="slide level2"> 242 <section class="slide level2">
351 <h1>European Public OpenStack</h1> 243 <h1>European OpenStack Public Clouds</h1>
352 <p>CityCloud: Sweden, UK, US</p> 244 <p>CityCloud: Sweden, UK, US</p>
353 <p>Datacentred: UK</p> 245 <p>Datacentred: UK</p>
354 <p>Elastx: Sweden</p> 246 <p>Elastx: Sweden</p>
355 <p>Enter Cloud Suite: Italy, Germany</p> 247 <p>Enter Cloud Suite: Italy, Germany</p>
356 <p>Fugo: Netherlands</p> 248 <p>Fugo: Netherlands</p>
357 <p>Internap: Netherlands, US, Singapore</p> 249 <p>Internap: Netherlands, US, Singapore</p>
358 <p>OTC: Frankfurt</p> 250 <p>OTC: Germany</p>
359 <p>OVH: France, US</p> 251 <p>OVH: France, US</p>
360 <p>Switch: Switzerland</p> 252 <p>Switch: Switzerland</p>
361 <p>Ultimum: Czech Republic</p> 253 <p>Ultimum: Czech Republic</p>
@@ -364,13 +256,15 @@ cloud.create_server('my-server', image='immage-name', auto_ip=True)
364 </section> 256 </section>
365 257
366 <section class="slide level2"> 258 <section class="slide level2">
367 <h1>Other Public OpenStack</h1> 259 <h1>Other Public OpenStack Clouds</h1>
260 <p><small>That I personally have an account on</small></p>
368 <p>Auro: Vancouver</p> 261 <p>Auro: Vancouver</p>
369 <p>Catalyst: New Zealand</p> 262 <p>Catalyst: New Zealand</p>
370 <p>Conoha: Japan, Singapore, US</p> 263 <p>Conoha: Japan, Singapore, US</p>
371 <p>Dreamhost: US</p> 264 <p>Dreamhost: US</p>
372 <p>Ormuco: Canada + Federated</p> 265 <p>Ormuco: Canada, Federated Worldwide</p>
373 <p>Vexxhost: Canada</p> 266 <p>Vexxhost: Canada</p>
267 <p>UnitedStack: China</p>
374 </section> 268 </section>
375 269
376 <section class="slide level2"> 270 <section class="slide level2">
@@ -379,13 +273,11 @@ cloud.create_server('my-server', image='immage-name', auto_ip=True)
379 273
380 <section class="slide level2"> 274 <section class="slide level2">
381 <h1>The OpenStack Project Believes all Participants are Equal</h1> 275 <h1>The OpenStack Project Believes all Participants are Equal</h1>
382 <p class='fragment'>Constant work in progress, help us when we get this
383 wrong</p>
384 </section> 276 </section>
385 277
386 <section class="slide level2"> 278 <section class="slide level2">
387 <h1><em>We</em> aren't going to remove something <em>you</em> need...</h1> 279 <h1><em>OpenStack</em> isn't going to remove something <em>you</em> need...</h1>
388 <p class='fragment'>because we <em>ARE</em> you.</p> 280 <p class='fragment'>because OpenStack <em>IS</em> you.</p>
389 </section> 281 </section>
390 282
391 <section class="slide level2"> 283 <section class="slide level2">
@@ -419,10 +311,22 @@ cloud.create_server('my-server', image='immage-name', auto_ip=True)
419 <h1>It's all about the tools</h1> 311 <h1>It's all about the tools</h1>
420 <ul> 312 <ul>
421 <li>Ansible</li> 313 <li>Ansible</li>
314 <li>OpenShift</li>
422 <li>Terraform</li> 315 <li>Terraform</li>
423 <li>Spinnaker</li> 316 <li>Spinnaker</li>
424 <li>Zuul<small class='fragment'> -- v3 is almost out and will blow your mind</small></li> 317 <li>Zuul</li>
318 </ul>
319 </section>
320
321 <section class="slide level2">
322 <h1>Ansible OpenStack Modules</h1>
323 <ul>
324 <li>Based on the API consumption code from nodepool: "shade"</li>
325 <li>Support all of the known OpenStack Public Clouds</li>
326 <li>Interoperable == you can use them with your cloud</li>
327 <li class='fragment'>Maintained by me</li>
425 </ul> 328 </ul>
329 <small class='fragment'>Talk about Ansible and OpenStack Today 16:00 - 17:00</small>
426 </section> 330 </section>
427 331
428 <section class="slide level2"> 332 <section class="slide level2">
@@ -442,8 +346,8 @@ cloud.create_server('my-server', image='immage-name', auto_ip=True)
442 </section> 346 </section>
443 347
444 <section class="slide level2"> 348 <section class="slide level2">
445 <h1>China, and the rest of our Global Community, understands the power 349 <h1>China understands the power of Open Collaboration on
446 of Open Collaboration on shared problems.</h1> 350 shared problems.</h1>
447 </section> 351 </section>
448 352
449 <section class="slide level2"> 353 <section class="slide level2">