Statistics
| Branch: | Tag: | Revision:

root / doc / hooks.rst @ 558fd122

History | View | Annotate | Download (15 kB)

1
Ganeti customisation using hooks
2
================================
3

    
4
Documents ganeti version 2.0
5

    
6
.. contents::
7

    
8
Introduction
9
------------
10

    
11

    
12
In order to allow customisation of operations, ganeti runs scripts
13
under ``/etc/ganeti/hooks`` based on certain rules.
14

    
15

    
16
This is similar to the ``/etc/network/`` structure present in Debian
17
for network interface handling.
18

    
19
Organisation
20
------------
21

    
22
For every operation, two sets of scripts are run:
23

    
24
- pre phase (for authorization/checking)
25
- post phase (for logging)
26

    
27
Also, for each operation, the scripts are run on one or more nodes,
28
depending on the operation type.
29

    
30
Note that, even though we call them scripts, we are actually talking
31
about any executable.
32

    
33
*pre* scripts
34
~~~~~~~~~~~~~
35

    
36
The *pre* scripts have a definite target: to check that the operation
37
is allowed given the site-specific constraints. You could have, for
38
example, a rule that says every new instance is required to exists in
39
a database; to implement this, you could write a script that checks
40
the new instance parameters against your database.
41

    
42
The objective of these scripts should be their return code (zero or
43
non-zero for success and failure). However, if they modify the
44
environment in any way, they should be idempotent, as failed
45
executions could be restarted and thus the script(s) run again with
46
exactly the same parameters.
47

    
48
Note that if a node is unreachable at the time a hooks is run, this
49
will not be interpreted as a deny for the execution. In other words,
50
only an actual error returned from a script will cause abort, and not
51
an unreachable node.
52

    
53
Therefore, if you want to guarantee that a hook script is run and
54
denies an action, it's best to put it on the master node.
55

    
56
*post* scripts
57
~~~~~~~~~~~~~~
58

    
59
These scripts should do whatever you need as a reaction to the
60
completion of an operation. Their return code is not checked (but
61
logged), and they should not depend on the fact that the *pre* scripts
62
have been run.
63

    
64
Naming
65
~~~~~~
66

    
67
The allowed names for the scripts consist of (similar to *run-parts* )
68
upper and lower case, digits, underscores and hyphens. In other words,
69
the regexp ``^[a-zA-Z0-9_-]+$``. Also, non-executable scripts will be
70
ignored.
71

    
72

    
73
Order of execution
74
~~~~~~~~~~~~~~~~~~
75

    
76
On a single node, the scripts in a directory are run in lexicographic
77
order (more exactly, the python string comparison order). It is
78
advisable to implement the usual *NN-name* convention where *NN* is a
79
two digit number.
80

    
81
For an operation whose hooks are run on multiple nodes, there is no
82
specific ordering of nodes with regard to hooks execution; you should
83
assume that the scripts are run in parallel on the target nodes
84
(keeping on each node the above specified ordering).  If you need any
85
kind of inter-node synchronisation, you have to implement it yourself
86
in the scripts.
87

    
88
Execution environment
89
~~~~~~~~~~~~~~~~~~~~~
90

    
91
The scripts will be run as follows:
92

    
93
- no command line arguments
94

    
95
- no controlling *tty*
96

    
97
- stdin is actually */dev/null*
98

    
99
- stdout and stderr are directed to files
100

    
101
- PATH is reset to ``/sbin:/bin:/usr/sbin:/usr/bin``
102

    
103
- the environment is cleared, and only ganeti-specific variables will
104
  be left
105

    
106

    
107
All information about the cluster is passed using environment
108
variables. Different operations will have sligthly different
109
environments, but most of the variables are common.
110

    
111
Operation list
112
--------------
113

    
114
Node operations
115
~~~~~~~~~~~~~~~
116

    
117
OP_ADD_NODE
118
+++++++++++
119

    
120
Adds a node to the cluster.
121

    
122
:directory: node-add
123
:env. vars: NODE_NAME, NODE_PIP, NODE_SIP
124
:pre-execution: all existing nodes
125
:post-execution: all nodes plus the new node
126

    
127

    
128
OP_REMOVE_NODE
129
++++++++++++++
130

    
131
Removes a node from the cluster. On the removed node the hooks are called
132
during the execution of the operation and not after its completion.
133

    
134
:directory: node-remove
135
:env. vars: NODE_NAME
136
:pre-execution: all existing nodes except the removed node
137
:post-execution: all existing nodes
138

    
139
OP_NODE_SET_PARAMS
140
++++++++++++++++++
141

    
142
Changes a node's parameters.
143

    
144
:directory: node-modify
145
:env. vars: MASTER_CANDIDATE, OFFLINE, DRAINED
146
:pre-execution: master node, the target node
147
:post-execution: master node, the target node
148

    
149
OP_NODE_EVACUATE
150
++++++++++++++++
151

    
152
Relocate secondary instances from a node.
153

    
154
:directory: node-evacuate
155
:env. vars: NEW_SECONDARY, NODE_NAME
156
:pre-execution: master node, target node
157
:post-execution: master node, target node
158

    
159
OP_NODE_MIGRATE
160
++++++++++++++++
161

    
162
Relocate secondary instances from a node.
163

    
164
:directory: node-migrate
165
:env. vars: NODE_NAME
166
:pre-execution: master node
167
:post-execution: master node
168

    
169

    
170
Instance operations
171
~~~~~~~~~~~~~~~~~~~
172

    
173
All instance operations take at least the following variables:
174
INSTANCE_NAME, INSTANCE_PRIMARY, INSTANCE_SECONDARIES,
175
INSTANCE_OS_TYPE, INSTANCE_DISK_TEMPLATE, INSTANCE_MEMORY,
176
INSTANCE_DISK_SIZES, INSTANCE_VCPUS, INSTANCE_NIC_COUNT,
177
INSTANCE_NICn_IP, INSTANCE_NICn_BRIDGE, INSTANCE_NICn_MAC,
178
INSTANCE_DISK_COUNT, INSTANCE_DISKn_SIZE, INSTANCE_DISKn_MODE.
179

    
180
The INSTANCE_NICn_* and INSTANCE_DISKn_* variables represent the
181
properties of the *n* -th NIC and disk, and are zero-indexed.
182

    
183

    
184
OP_INSTANCE_ADD
185
+++++++++++++++
186

    
187
Creates a new instance.
188

    
189
:directory: instance-add
190
:env. vars: ADD_MODE, SRC_NODE, SRC_PATH, SRC_IMAGES
191
:pre-execution: master node, primary and secondary nodes
192
:post-execution: master node, primary and secondary nodes
193

    
194
OP_INSTANCE_REINSTALL
195
+++++++++++++++++++++
196

    
197
Reinstalls an instance.
198

    
199
:directory: instance-reinstall
200
:env. vars: only the standard instance vars
201
:pre-execution: master node, primary and secondary nodes
202
:post-execution: master node, primary and secondary nodes
203

    
204
OP_BACKUP_EXPORT
205
++++++++++++++++
206

    
207
Exports the instance.
208

    
209

    
210
:directory: instance-export
211
:env. vars: EXPORT_NODE, EXPORT_DO_SHUTDOWN
212
:pre-execution: master node, primary and secondary nodes
213
:post-execution: master node, primary and secondary nodes
214

    
215
OP_INSTANCE_START
216
+++++++++++++++++
217

    
218
Starts an instance.
219

    
220
:directory: instance-start
221
:env. vars: INSTANCE_NAME, INSTANCE_PRIMARY, INSTANCE_SECONDARIES, FORCE
222
:pre-execution: master node, primary and secondary nodes
223
:post-execution: master node, primary and secondary nodes
224

    
225
OP_INSTANCE_SHUTDOWN
226
++++++++++++++++++++
227

    
228
Stops an instance.
229

    
230
:directory: instance-stop
231
:env. vars: INSTANCE_NAME, INSTANCE_PRIMARY, INSTANCE_SECONDARIES
232
:pre-execution: master node, primary and secondary nodes
233
:post-execution: master node, primary and secondary nodes
234

    
235
OP_INSTANCE_REBOOT
236
++++++++++++++++++
237

    
238
Reboots an instance.
239

    
240
:directory: instance-reboot
241
:env. vars: IGNORE_SECONDARIES, REBOOT_TYPE
242
:pre-execution: master node, primary and secondary nodes
243
:post-execution: master node, primary and secondary nodes
244

    
245
OP_INSTANCE_MODIFY
246
++++++++++++++++++
247

    
248
Modifies the instance parameters.
249

    
250
:directory: instance-modify
251
:env. vars: INSTANCE_NAME, MEM_SIZE, VCPUS, INSTANCE_IP
252
:pre-execution: master node, primary and secondary nodes
253
:post-execution: master node, primary and secondary nodes
254

    
255
OP_INSTANCE_FAILOVER
256
++++++++++++++++++++
257

    
258
Failovers an instance.
259

    
260
:directory: instance-failover
261
:env. vars: IGNORE_CONSISTENCY
262
:pre-execution: master node, secondary node
263
:post-execution: master node, secondary node
264

    
265
OP_INSTANCE_MIGRATE
266
++++++++++++++++++++
267

    
268
Migrates an instance.
269

    
270
:directory: instance-migrate
271
:env. vars: INSTANCE_MIGRATE_LIVE, INSTANCE_MIGRATE_CLEANUP
272
:pre-execution: master node, secondary node
273
:post-execution: master node, secondary node
274

    
275

    
276
OP_INSTANCE_REMOVE
277
++++++++++++++++++
278

    
279
Remove an instance.
280

    
281
:directory: instance-remove
282
:env. vars: INSTANCE_NAME, INSTANCE_PRIMARY, INSTANCE_SECONDARIES
283
:pre-execution: master node
284
:post-execution: master node
285

    
286
OP_INSTANCE_REPLACE_DISKS
287
+++++++++++++++++++++++++
288

    
289
Replace an instance's disks.
290

    
291
:directory: mirror-replace
292
:env. vars: MODE, NEW_SECONDARY, OLD_SECONDARY
293
:pre-execution: master node, primary and secondary nodes
294
:post-execution: master node, primary and secondary nodes
295

    
296
OP_INSTANCE_GROW_DISK
297
+++++++++++++++++++++
298

    
299
Grows the disk of an instance.
300

    
301
:directory: disk-grow
302
:env. vars: DISK, AMOUNT
303
:pre-execution: master node, primary node
304
:post-execution: master node, primary node
305

    
306
OP_INSTANCE_RENAME
307
++++++++++++++++++
308

    
309
Renames an instance.
310

    
311
:directory: instance-rename
312
:env. vars: INSTANCE_NEW_NAME
313
:pre-execution: master node, primary and secondary nodes
314
:post-execution: master node, primary and secondary nodes
315

    
316
OP_INSTANCE_MOVE
317
++++++++++++++++
318

    
319
Move an instance by data-copying.
320

    
321
:directory: instance-move
322
:env. vars: TARGET_NODE
323
:pre-execution: master node, primary and target nodes
324
:post-execution: master node, primary and target nodes
325

    
326
OP_INSTANCE_RECREATE_DISKS
327
++++++++++++++++++++++++++
328

    
329
Recreate an instance's missing disks.
330

    
331
:directory: instance-recreate-disks
332
:env. vars: only the standard instance vars
333
:pre-execution: master node, primary and secondary nodes
334
:post-execution: master node, primary and secondary nodes
335

    
336
OP_INSTANCE_REPLACE_DISKS
337
+++++++++++++++++++++++++
338

    
339
Replace the disks of an instance.
340

    
341
:directory: mirrors-replace
342
:env. vars: MODE, NEW_SECONDARY, OLD_SECONDARY
343
:pre-execution: master node, primary and new secondary nodes
344
:post-execution: master node, primary and new secondary nodes
345

    
346

    
347
Cluster operations
348
~~~~~~~~~~~~~~~~~~
349

    
350
OP_POST_INIT_CLUSTER
351
++++++++++++++++++++
352

    
353
This hook is called via a special "empty" LU right after cluster initialization.
354

    
355
:directory: cluster-init
356
:env. vars: none
357
:pre-execution: none
358
:post-execution: master node
359

    
360
OP_DESTROY_CLUSTER
361
++++++++++++++++++
362

    
363
The post phase of this hook is called during the execution of destroy operation
364
and not after its completion.
365

    
366
:directory: cluster-destroy
367
:env. vars: none
368
:pre-execution: none
369
:post-execution: master node
370

    
371
OP_CLUSTER_VERIFY
372
+++++++++++++++++
373

    
374
Verifies the cluster status. This is a special LU with regard to
375
hooks, as the result of the opcode will be combined with the result of
376
post-execution hooks, in order to allow administrators to enhance the
377
cluster verification procedure.
378

    
379
:directory: cluster-verify
380
:env. vars: CLUSTER, MASTER, CLUSTER_TAGS, NODE_TAGS_<name>
381
:pre-execution: none
382
:post-execution: all nodes
383

    
384
OP_CLUSTER_RENAME
385
+++++++++++++++++
386

    
387
Renames the cluster.
388

    
389
:directory: cluster-rename
390
:env. vars: NEW_NAME
391
:pre-execution: master-node
392
:post-execution: master-node
393

    
394
OP_CLUSTER_SET_PARAMS
395
+++++++++++++++++++++
396

    
397
Modifies the cluster parameters.
398

    
399
:directory: cluster-modify
400
:env. vars: NEW_VG_NAME
401
:pre-execution: master node
402
:post-execution: master node
403

    
404

    
405
Obsolete operations
406
~~~~~~~~~~~~~~~~~~~
407

    
408
The following operations are no longer present or don't execute hooks
409
anymore in Ganeti 2.0:
410

    
411
- OP_INIT_CLUSTER
412
- OP_MASTER_FAILOVER
413
- OP_INSTANCE_ADD_MDDRBD
414
- OP_INSTANCE_REMOVE_MDDRBD
415

    
416

    
417
Environment variables
418
---------------------
419

    
420
Note that all variables listed here are actually prefixed with
421
*GANETI_* in order to provide a clear namespace.
422

    
423
Common variables
424
~~~~~~~~~~~~~~~~
425

    
426
This is the list of environment variables supported by all operations:
427

    
428
HOOKS_VERSION
429
  Documents the hooks interface version. In case this doesnt match
430
  what the script expects, it should not run. The documents conforms
431
  to the version 2.
432

    
433
HOOKS_PHASE
434
  One of *PRE* or *POST* denoting which phase are we in.
435

    
436
CLUSTER
437
  The cluster name.
438

    
439
MASTER
440
  The master node.
441

    
442
OP_CODE
443
  One of the *OP_* values from the list of operations.
444

    
445
OBJECT_TYPE
446
  One of ``INSTANCE``, ``NODE``, ``CLUSTER``.
447

    
448
DATA_DIR
449
  The path to the Ganeti configuration directory (to read, for
450
  example, the *ssconf* files).
451

    
452

    
453
Specialised variables
454
~~~~~~~~~~~~~~~~~~~~~
455

    
456
This is the list of variables which are specific to one or more
457
operations.
458

    
459
INSTANCE_NAME
460
  The name of the instance which is the target of the operation.
461

    
462
INSTANCE_DISK_TEMPLATE
463
  The disk type for the instance.
464

    
465
INSTANCE_DISK_COUNT
466
  The number of disks for the instance.
467

    
468
INSTANCE_DISKn_SIZE
469
  The size of disk *n* for the instance.
470

    
471
INSTANCE_DISKn_MODE
472
  Either *rw* for a read-write disk or *ro* for a read-only one.
473

    
474
INSTANCE_NIC_COUNT
475
  The number of NICs for the instance.
476

    
477
INSTANCE_NICn_BRIDGE
478
  The bridge to which the *n* -th NIC of the instance is attached.
479

    
480
INSTANCE_NICn_IP
481
  The IP (if any) of the *n* -th NIC of the instance.
482

    
483
INSTANCE_NICn_MAC
484
  The MAC address of the *n* -th NIC of the instance.
485

    
486
INSTANCE_OS_TYPE
487
  The name of the instance OS.
488

    
489
INSTANCE_PRIMARY
490
  The name of the node which is the primary for the instance.
491

    
492
INSTANCE_SECONDARIES
493
  Space-separated list of secondary nodes for the instance.
494

    
495
INSTANCE_MEMORY
496
  The memory size (in MiBs) of the instance.
497

    
498
INSTANCE_VCPUS
499
  The number of virtual CPUs for the instance.
500

    
501
INSTANCE_STATUS
502
  The run status of the instance.
503

    
504
NODE_NAME
505
  The target node of this operation (not the node on which the hook
506
  runs).
507

    
508
NODE_PIP
509
  The primary IP of the target node (the one over which inter-node
510
  communication is done).
511

    
512
NODE_SIP
513
  The secondary IP of the target node (the one over which drbd
514
  replication is done). This can be equal to the primary ip, in case
515
  the cluster is not dual-homed.
516

    
517
FORCE
518
  This is provided by some operations when the user gave this flag.
519

    
520
IGNORE_CONSISTENCY
521
  The user has specified this flag. It is used when failing over
522
  instances in case the primary node is down.
523

    
524
ADD_MODE
525
  The mode of the instance create: either *create* for create from
526
  scratch or *import* for restoring from an exported image.
527

    
528
SRC_NODE, SRC_PATH, SRC_IMAGE
529
  In case the instance has been added by import, these variables are
530
  defined and point to the source node, source path (the directory
531
  containing the image and the config file) and the source disk image
532
  file.
533

    
534
NEW_SECONDARY
535
  The name of the node on which the new mirror component is being
536
  added. This can be the name of the current secondary, if the new
537
  mirror is on the same secondary.
538

    
539
OLD_SECONDARY
540
  The name of the old secondary in the replace-disks command Note that
541
  this can be equal to the new secondary if the secondary node hasn't
542
  actually changed.
543

    
544
EXPORT_NODE
545
  The node on which the exported image of the instance was done.
546

    
547
EXPORT_DO_SHUTDOWN
548
  This variable tells if the instance has been shutdown or not while
549
  doing the export. In the "was shutdown" case, it's likely that the
550
  filesystem is consistent, whereas in the "did not shutdown" case,
551
  the filesystem would need a check (journal replay or full fsck) in
552
  order to guarantee consistency.
553

    
554
CLUSTER_TAGS
555
  The list of cluster tags, space separated.
556

    
557
NODE_TAGS_<name>
558
  The list of tags for node *<name>*, space separated.
559

    
560
Examples
561
--------
562

    
563
The startup of an instance will pass this environment to the hook
564
script::
565

    
566
  GANETI_CLUSTER=cluster1.example.com
567
  GANETI_DATA_DIR=/var/lib/ganeti
568
  GANETI_FORCE=False
569
  GANETI_HOOKS_PATH=instance-start
570
  GANETI_HOOKS_PHASE=post
571
  GANETI_HOOKS_VERSION=2
572
  GANETI_INSTANCE_DISK0_MODE=rw
573
  GANETI_INSTANCE_DISK0_SIZE=128
574
  GANETI_INSTANCE_DISK_COUNT=1
575
  GANETI_INSTANCE_DISK_TEMPLATE=drbd
576
  GANETI_INSTANCE_MEMORY=128
577
  GANETI_INSTANCE_NAME=instance2.example.com
578
  GANETI_INSTANCE_NIC0_BRIDGE=xen-br0
579
  GANETI_INSTANCE_NIC0_IP=
580
  GANETI_INSTANCE_NIC0_MAC=aa:00:00:a5:91:58
581
  GANETI_INSTANCE_NIC_COUNT=1
582
  GANETI_INSTANCE_OS_TYPE=debootstrap
583
  GANETI_INSTANCE_PRIMARY=node3.example.com
584
  GANETI_INSTANCE_SECONDARIES=node5.example.com
585
  GANETI_INSTANCE_STATUS=down
586
  GANETI_INSTANCE_VCPUS=1
587
  GANETI_MASTER=node1.example.com
588
  GANETI_OBJECT_TYPE=INSTANCE
589
  GANETI_OP_CODE=OP_INSTANCE_STARTUP
590
  GANETI_OP_TARGET=instance2.example.com
591

    
592
.. vim: set textwidth=72 :