Statistics
| Branch: | Tag: | Revision:

root / doc / hooks.rst @ 454fe3cd

History | View | Annotate | Download (14.9 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
132
called during the execution of the operation and not after its
133
completion.
134

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

    
140
OP_NODE_SET_PARAMS
141
++++++++++++++++++
142

    
143
Changes a node's parameters.
144

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

    
150
OP_NODE_EVACUATE
151
++++++++++++++++
152

    
153
Relocate secondary instances from a node.
154

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

    
160
OP_NODE_MIGRATE
161
++++++++++++++++
162

    
163
Relocate secondary instances from a node.
164

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

    
170

    
171
Instance operations
172
~~~~~~~~~~~~~~~~~~~
173

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

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

    
184

    
185
OP_INSTANCE_ADD
186
+++++++++++++++
187

    
188
Creates a new instance.
189

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

    
195
OP_INSTANCE_REINSTALL
196
+++++++++++++++++++++
197

    
198
Reinstalls an instance.
199

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

    
205
OP_BACKUP_EXPORT
206
++++++++++++++++
207

    
208
Exports the instance.
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: 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: only the standard instance vars
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: only the standard instance vars
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: MIGRATE_LIVE, 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: only the standard instance vars
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
354
initialization.
355

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

    
361
OP_DESTROY_CLUSTER
362
++++++++++++++++++
363

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

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

    
372
OP_CLUSTER_VERIFY
373
+++++++++++++++++
374

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

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

    
385
OP_CLUSTER_RENAME
386
+++++++++++++++++
387

    
388
Renames the cluster.
389

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

    
395
OP_CLUSTER_SET_PARAMS
396
+++++++++++++++++++++
397

    
398
Modifies the cluster parameters.
399

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

    
405

    
406
Obsolete operations
407
~~~~~~~~~~~~~~~~~~~
408

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

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

    
417

    
418
Environment variables
419
---------------------
420

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

    
424
Common variables
425
~~~~~~~~~~~~~~~~
426

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

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

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

    
437
CLUSTER
438
  The cluster name.
439

    
440
MASTER
441
  The master node.
442

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

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

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

    
453

    
454
Specialised variables
455
~~~~~~~~~~~~~~~~~~~~~
456

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

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

    
463
INSTANCE_DISK_TEMPLATE
464
  The disk type for the instance.
465

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

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

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

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

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

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

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

    
487
INSTANCE_OS_TYPE
488
  The name of the instance OS.
489

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

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

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

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

    
502
INSTANCE_STATUS
503
  The run status of the instance.
504

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

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

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

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

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

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

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

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

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

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

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

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

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

    
561
Examples
562
--------
563

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

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

    
593
.. vim: set textwidth=72 :