diff options
Diffstat (limited to 'src/talks')
-rw-r--r-- | src/talks/zero-to-2500.hbs | 302 |
1 files changed, 302 insertions, 0 deletions
diff --git a/src/talks/zero-to-2500.hbs b/src/talks/zero-to-2500.hbs new file mode 100644 index 0000000..85130d6 --- /dev/null +++ b/src/talks/zero-to-2500.hbs | |||
@@ -0,0 +1,302 @@ | |||
1 | <!doctype html> | ||
2 | <html lang="en"> | ||
3 | |||
4 | <head> | ||
5 | <meta charset="utf-8"> | ||
6 | |||
7 | <title>From Zero to 2500: Managing Development for OpenStack Completely in | ||
8 | the Open</title> | ||
9 | |||
10 | </head> | ||
11 | <body> | ||
12 | |||
13 | <section id="who-am-i-redhat" class="slide level2"> | ||
14 | <h1>Who am I?</h1> | ||
15 | <img style="float:right; margin:24pt" src="/images/Logo_RH_CMYK_Default.jpg" /> | ||
16 | <p> Office of Technology </p> | ||
17 | <p> Zuul </p> | ||
18 | <p> Ansible </p> | ||
19 | </section> | ||
20 | |||
21 | <section id="who-am-i-openstack" class="slide level2"> | ||
22 | <h1>Who am I?</h1> | ||
23 | <img style="float:right; margin-right:24pt; width:300px; height: auto" src="/images/openstack-cloud-software-vertical-large.png" /> | ||
24 | <p>Technical Committee</p> | ||
25 | <p>Developer Infrastructure Core Team</p> | ||
26 | </section> | ||
27 | |||
28 | <section class="slide level2"> | ||
29 | <img src="/images/openstack-software-diagram.png" | ||
30 | style="width:800px; height: auto" | ||
31 | alt="OpenStack" /> | ||
32 | </section> | ||
33 | |||
34 | <section class="slide level2"> | ||
35 | <h1>The Four Opens</h1> | ||
36 | <ul> | ||
37 | <li>Open Source<br/> | ||
38 | <small>we don't hold back "Enterprise" features, we don't cripple things</small></li> | ||
39 | <li>Open Design<br/> | ||
40 | <small>design process open to all, decisions are not made inside company doors</small></li> | ||
41 | <li>Open Development<br/> | ||
42 | <small>public source code, public code review, all code is reviewed and gated</small></li> | ||
43 | <li>Open Community<br/> | ||
44 | <small>lazy consensus, democratic leadership from participants, | ||
45 | public logged meetings in IRC, public archived mailing lists</small></li> | ||
46 | </section> | ||
47 | |||
48 | <section id="openstack-infra" data-transition='zoom'> | ||
49 | <h1>OpenStack Infra</h1> | ||
50 | <p>Tooling, Automation and CI for OpenStack Project</p> | ||
51 | </section> | ||
52 | |||
53 | <section id="why" class="slide level2"> | ||
54 | <h1>Why?</h1> | ||
55 | <h2> The original OpenStack use case</h2> | ||
56 | <ul> | ||
57 | <li>Fully automated gated commits</li> | ||
58 | <li>Full end-to-end integration tests from scratch for every commit</li> | ||
59 | <li>Massive scale</li> | ||
60 | </ul> | ||
61 | </section> | ||
62 | |||
63 | <section id="kjph" class="slide level2" data-transition='zoom'> | ||
64 | <h1> OpenStack Scale by the numbers</h1> | ||
65 | <ul> | ||
66 | <li>2 KJPH (kilo-jobs / hour) (1/3 the total Travis job rate)</li> | ||
67 | <li>2376 arbitrary developers</li> | ||
68 | <li>1474 git repositories</li> | ||
69 | <li>11727 Jobs</li> | ||
70 | <li>Merge 10k Changes / Month</li> | ||
71 | </ul> | ||
72 | <p class='fragment'>ansible has <em>received</em> 13171 PRs (changes), | ||
73 | has merged 8190 of them and has 37788 commits in its entire lifetime</p> | ||
74 | </section> | ||
75 | |||
76 | <section id='runs-the-same' class="slide level2"> | ||
77 | <h1>Infra operates the same way as OpenStack</h1> | ||
78 | </section> | ||
79 | |||
80 | <section class="slide level2"> | ||
81 | <h1>How do we do this?</h1> | ||
82 | </section> | ||
83 | |||
84 | <section class="slide level2"> | ||
85 | <h1>Control plane</h1> | ||
86 | <h3>http://git.openstack.org/cgit/openstack-infra/system-config</h3> | ||
87 | <ul> | ||
88 | <li>All server config management in git</li> | ||
89 | <li>Puppet manages the servers: puppet apply</li> | ||
90 | <li>Ansible runs puppet: ansible puppet module</li> | ||
91 | <li>Ansible OpenStack Dynamic Inventory</li> | ||
92 | <li>Only thing not public are keys and secrets</li> | ||
93 | </ul> | ||
94 | </section> | ||
95 | |||
96 | <section class="slide level2"> | ||
97 | <h1>It wasn't always this way!</h1> | ||
98 | <p class='fragment'>Let me take you on a walk down memory lane ...</p> | ||
99 | </section> | ||
100 | |||
101 | <section class="slide level2"> | ||
102 | <h1>We started with 4 cloud servers in Rackspace</h1> | ||
103 | <ul> | ||
104 | <li>Hudson Master (https://launchpad.net/~hudson-openstack)</li> | ||
105 | <li>Nova Build Node</li> | ||
106 | <li>Swift Build Node</li> | ||
107 | <li>The other server (now known as old-wiki)</li> | ||
108 | </ul> | ||
109 | <p class='fragment'>old-wiki is still running! (On Ubuntu 10.04)</p> | ||
110 | <p class='fragment'>I didn't even have access to the cloud account!</p> | ||
111 | </section> | ||
112 | |||
113 | <section class="slide level2"> | ||
114 | <h1>The Setup</h1> | ||
115 | <ul> | ||
116 | <li>Hudson jobs ran Tarmac, which tested and merged Launchpad Merge Requests</li> | ||
117 | <li>Hudson ran Tarmac in a loop, published the build results</li> | ||
118 | <li>One Job per project</li> | ||
119 | <li>Three of us with direct Hudson Admin permissions</li> | ||
120 | </ul> | ||
121 | </section> | ||
122 | |||
123 | <section class="slide level2"> | ||
124 | <h1>This state persisted for the first year and first three OpenStack | ||
125 | releases</h1> | ||
126 | </section> | ||
127 | |||
128 | <section class="slide level2"> | ||
129 | <h1>Project Proliferation</h1> | ||
130 | <p>Each project got a node and a job. Configured by hand. By me.</p> | ||
131 | <p class='fragment'>It got annoying</p> | ||
132 | </section> | ||
133 | |||
134 | <section class="slide level2"> | ||
135 | <h1>Config Management!</h1> | ||
136 | <small>Please remember we're talking 2011 here</small> | ||
137 | </section> | ||
138 | |||
139 | <section class="slide level2"> | ||
140 | <h1>Puppet vs. Chef and git vs. bzr and humans pushing things</h1> | ||
141 | </section> | ||
142 | |||
143 | <section class="slide level2"> | ||
144 | <h1>We were so excited about sharing Ops best practices!</h1> | ||
145 | <p class='small'>We were so sad</p> | ||
146 | </section> | ||
147 | |||
148 | <section class="slide level2"> | ||
149 | <h1>Brief Rant - I do not want to write Apache configs in Puppet DSL</h1> | ||
150 | </section> | ||
151 | |||
152 | <section class="slide level2"> | ||
153 | <h1>So we introduced Puppet</h1> | ||
154 | <p><a href='http://git.openstack.org/cgit/openstack-infra/system-config/tree/?id=99540d91a75d2b021db01d815e46bd585f9235cd'>http://git.openstack.org/cgit/openstack-infra/system-config/tree/?id=99540d91a75d2b021db01d815e46bd585f9235cd</a></p> | ||
155 | </section> | ||
156 | |||
157 | <section class="slide level2"> | ||
158 | <h1>Open Development</h1> | ||
159 | <p>Our developers wanted to collaborate on test jobs.</p> | ||
160 | <p>Giving hundreds of people access to directly edit test jobs == sadness</p> | ||
161 | <p>Did I mention our test jobs implement captive gating?</p> | ||
162 | </section> | ||
163 | |||
164 | <section class="slide level2"> | ||
165 | <h1>Jenkins Job Builder</h1> | ||
166 | <p>YAML encoding of Jenkins Job definitions with templating</p> | ||
167 | <p>Allowed jobs to go through code review before being applied!</p> | ||
168 | <h4>Andreas Jaegar is OpenStack's all-time contributions leader. He works | ||
169 | on docs and test jobs</h4> | ||
170 | </section> | ||
171 | |||
172 | <section class="slide level2"> | ||
173 | <h1>Introduction of Puppetmaster</h1> | ||
174 | <ul> | ||
175 | <li>In cron job, config repo updated on puppetmaster</li> | ||
176 | <li>puppet agent ran on each node</li> | ||
177 | <li>Landing a commit == config running on hosts (eventually)</li> | ||
178 | <li>What to do with passwords and keys?</li> | ||
179 | </ul> | ||
180 | </section> | ||
181 | |||
182 | <section class="slide level2"> | ||
183 | <h1>Introduction of Hiera for Secrets</h1> | ||
184 | <p>Hiera let us store YAML files with only secrets. Reference secrets | ||
185 | by name in puppet manifests</p> | ||
186 | <p><a href='http://git.openstack.org/cgit/openstack-infra/system-config/tree/manifests/site.pp'>http://git.openstack.org/cgit/openstack-infra/system-config/tree/manifests/site.pp</a></p> | ||
187 | </section> | ||
188 | |||
189 | <section class="slide level2"> | ||
190 | <h1>Project Creation</h1> | ||
191 | <ul> | ||
192 | <li>Create replica repos on git farm (and on github I suppose)</li> | ||
193 | <li>Create repo in Gerrit</li> | ||
194 | <li>Push contents</li> | ||
195 | </ul> | ||
196 | <p>Too much clicking!</p> | ||
197 | </section> | ||
198 | |||
199 | <section class="slide level2"> | ||
200 | <h1>jeepyb - Gerrit Project Builder</h1> | ||
201 | <p>Lesson: Don't let Monty name things</p> | ||
202 | </section> | ||
203 | |||
204 | <section class="slide level2"> | ||
205 | <h1>Ansible to run Puppet</h1> | ||
206 | </section> | ||
207 | |||
208 | <section class="slide level2"> | ||
209 | <h1>Back up: Salt to run Puppet</h1> | ||
210 | </section> | ||
211 | |||
212 | <section class="slide level2"> | ||
213 | <h1>Ansible to run Puppet</h1> | ||
214 | <ul> | ||
215 | <li>puppet ansible module</li> | ||
216 | <li>openstack-infra/ansible-role-puppet</li> | ||
217 | <li>Role copies subset of hiera secrets to node before puppet</li> | ||
218 | <li>Moved from puppetmaster to puppet apply</li> | ||
219 | </section> | ||
220 | |||
221 | <section class="slide level2"> | ||
222 | <h1>Remaining manual human tasks</h1> | ||
223 | <ul> | ||
224 | <li>Adding new secrets to hiera</li> | ||
225 | <li>Launching new servers</li> | ||
226 | </ul> | ||
227 | </section> | ||
228 | |||
229 | <section class="slide level2"> | ||
230 | <h1>Ansible Role Cloud Launcher</h1> | ||
231 | <h2>http://git.openstack.org/cgit/openstack/ansible-role-cloud-launcher</h2> | ||
232 | <pre> | ||
233 | profiles: | ||
234 | - name: admin-clouds | ||
235 | flavors: | ||
236 | - name: aoclcompany.xlarge | ||
237 | ram: 128 | ||
238 | vcpus: 1 | ||
239 | - name: ops | ||
240 | images: | ||
241 | - name: ubuntu-trusty | ||
242 | filename: /home/ubuntu/trusty-server-cloudimg-amd64-disk1.img | ||
243 | - name: bootstrap-keypair | ||
244 | keypairs: | ||
245 | - name: bootstrap-key | ||
246 | public_key_file: /home/ubuntu/.ssh/id_rsa.pub | ||
247 | clouds: | ||
248 | - name: awesomecloud | ||
249 | profiles: | ||
250 | - admin-clouds | ||
251 | - bootstrap-keypair | ||
252 | - name: yaycloud-ops | ||
253 | oscc_cloud: yaycloud-opsuser | ||
254 | profiles: | ||
255 | - bootstrap-keypair | ||
256 | - ops | ||
257 | </pre> | ||
258 | </section> | ||
259 | |||
260 | <section class="slide level2"> | ||
261 | <h1>Problems depending on services</h1> | ||
262 | <p>Even when the service is Open Source, it can stop being</p> | ||
263 | </section> | ||
264 | |||
265 | <section class="slide level2"> | ||
266 | <h1>Transifex</h1> | ||
267 | <p><em>WAS</em> an Open Source translations system.</p> | ||
268 | </section> | ||
269 | |||
270 | <section class="slide level2"> | ||
271 | <h1>Zanata!</h1> | ||
272 | <p>We run Zanata ourselves now. (Thanks Lyz!)</p> | ||
273 | </section> | ||
274 | |||
275 | <section class="slide level2"> | ||
276 | <h1>Remaining external service dependencies</h1> | ||
277 | <ul> | ||
278 | <li>Rackspace Public Cloud</li> | ||
279 | <li>Launchpad</li> | ||
280 | </ul> | ||
281 | </section> | ||
282 | |||
283 | <section class="slide level2"> | ||
284 | <h1>Launchpad OpenID -> openstackid</h1> | ||
285 | </section> | ||
286 | |||
287 | <section class="slide level2"> | ||
288 | <h1>Launchpad Bugs -> storyboard</h1> | ||
289 | </section> | ||
290 | |||
291 | <section class="slide level2"> | ||
292 | <h1>The Multi-cloud OpenStack Story</h1> | ||
293 | <ul> | ||
294 | <li>Our build nodes already span 12 different OpenStack Public Clouds</li> | ||
295 | <li>Work starting on spreading the Control Plane out</li> | ||
296 | <li>Starting with Vexxhost</li> | ||
297 | </ul> | ||
298 | </section> | ||
299 | |||
300 | |||
301 | </body> | ||
302 | </html> | ||