diff options
Diffstat (limited to 'src/talks')
| -rw-r--r-- | src/talks/ansible-openstack.hbs | 502 | ||||
| -rw-r--r-- | src/talks/global-interop.hbs | 250 |
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 >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 "my-citycloud"</li> | ||
| 284 | <li>Reference a well-known "named" 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"> | ||
| 290 | clouds: | ||
| 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"> | ||
| 319 | clouds: | ||
| 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"> | ||
| 334 | my-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"> | ||
| 360 | my-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>>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> | ||
| 167 | clouds: | ||
| 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> | ||
| 195 | cloud.create_image('image-name', filename='image-filename.qcow2') | ||
| 196 | cloud.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"> |
