modules.rst 16.5 KB
Newer Older
Michael DeHaan committed
1 2 3
Ansible Modules
===============

4 5 6 7 8
Ansible ships with a number of modules (called the 'module library') 
that can be executed directly on remote hosts or through :doc:`playbooks`.
Users can also write their own modules.   These modules can control system
resources, like services, packages, or files (anything really), or 
handle executing system commands.  
9

10 11 12 13 14 15 16 17 18
Let's review how we execute three different modules from the command line::

    ansible webservers -m service -a "name=httpd state=running"
    ansible webservers -m ping
    ansible webservers -m command -a "/sbin/reboot -t now"

Each module supports taking arguments.  Nearly all modules take ``key=value`` 
arguments, space delimited.  Some modules take
no arguments, and the command/shell modules simply take the string
19
of the command you want to run.
Michael DeHaan committed
20

21 22 23 24 25 26
From playbooks, Ansible modules are executed in a very similar way::

    - name: reboot the servers
      action: command /sbin/reboot -t now 

All modules technically return JSON format data, though if you are using the
27
command line or playbooks, you don't really need to know much about
28 29
that.  If you're writing your own module, you care, and this means you do
not have to write modules in any particular language -- you get tho choose.
Michael DeHaan committed
30

31
Most modules other than command are `idempotent`, meaning they will seek
32
to avoid changes to the system unless a change needs to be made.  When using Ansible
33 34
playbooks, these modules can trigger 'change events'.  Unless otherwise
noted, any given module does support change hooks.
Michael DeHaan committed
35

36
Let's see what's available in the Ansible module library, out of the box:
Michael DeHaan committed
37

Michael DeHaan committed
38
.. _apt:
39

40 41 42 43 44 45 46 47 48 49 50
apt
```

Manages apt-packages (such as for Debian/Ubuntu).

*pkg*:

* A package name or package specifier with version, like name-1.0

*state*:

51
* Can be either 'installed', 'removed', or 'latest'.  The default is 'installed'.
52

53 54
*update-cache*:

Michel Blanc committed
55
* Whether apt cache must be updated prior operation. Optional, and can be
Michael DeHaan committed
56 57
  'yes', or 'no'. The default is 'no'.  This can be done as the part of a
  package operation or as a seperate step.
58 59 60 61 62 63

*purge*:

* Will force purge of configuration file for when ensure is set to 'removed'.
  Defaults to 'no'.

64 65
Example action from Ansible :doc:`playbooks`::

Michael DeHaan committed
66
    apt pkg=foo update-cache=yes
67 68
    apt pkg=foo ensure=removed
    apt pkg=foo ensure=installed
69 70
    apt pkg=foo ensure=latest update-cache=yes

Michael DeHaan committed
71 72 73

NOTE: the apt module cannot currently request installation of a specific software version, as the yum
module can.  This should be available in a future release.
74

Michael DeHaan committed
75
.. _command:
76

Michael DeHaan committed
77 78 79
command
```````

80
The command module takes the command name followed by a list of
81 82 83 84 85
arguments, space delimited.  

If you want to run a command through the shell (say you are using
'<', '>', '|', etc), you actually want the 'shell' module instead.  
The 'command' module is much more secure as it's not affected by the user's environment.
Michael DeHaan committed
86

87 88 89 90
The given command will be executed on all selected nodes.  It will not
be processed through the shell, so variables like "$HOME" and 
operations like "<", ">", "|", and "&" will not work.  As such, all
paths to commands must be fully qualified.
Michael DeHaan committed
91

92 93 94
This module does not support change hooks and returns the return code
from the program as well as timing information about how long the
command was running for.
Michael DeHaan committed
95

96
Example action from Ansible :doc:`playbooks`::
97 98 99

    command /sbin/shutdown -t now

Michael DeHaan committed
100 101 102 103 104 105 106
If you only want to run a command if a certain file does not exist, you can do the
following::

    command /usr/bin/make_database.sh arg1 arg2 creates=/path/to/database

The `creates=` option will not be passed to the executable.

107

108
.. _copy:
Michael DeHaan committed
109 110 111 112

copy
````

113 114 115
The copy module moves a file on the local box to remote locations.  In addition to the options
listed below, the arguments available to the `file` module can also be passed to the copy
module.
Michael DeHaan committed
116

117
*src*:
Michael DeHaan committed
118

119 120
* Local path to a file to copy to the remote server.  This can be an
  absolute or relative path.
Michael DeHaan committed
121 122


123
*dest*:
Michael DeHaan committed
124

125
* Remote absolute path where the file should end up.
Michael DeHaan committed
126 127 128

This module also returns md5sum information about the resultant file.

129
Example action from Ansible :doc:`playbooks`::
130 131 132

    copy src=/srv/myfiles/foo.conf dest=/etc/foo.conf owner=foo group=foo mode=0644

Michael DeHaan committed
133

134 135
.. _facter:

Michael DeHaan committed
136 137 138 139
facter
``````

Runs the discovery program 'facter' on the remote system, returning
Michael DeHaan committed
140
JSON data that can be useful for inventory purposes.  
Michael DeHaan committed
141 142 143

Requires that 'facter' and 'ruby-json' be installed on the remote end.

144 145 146 147
This module is informative only - it takes no parameters & does not
support change hooks, nor does it make any changes on the system.
Playbooks do not actually use this module, they use the :ref:`setup`
module behind the scenes.
Michael DeHaan committed
148

149 150 151 152 153 154 155 156 157 158 159 160 161

fetch
`````

This module works like 'copy', but in reverse.  It is used for fetching files
from remote machines and storing them locally in a file tree, organized by hostname.

*src*:

* The file on the remote system to fetch.  This needs to be a file, not a directory. Recursive fetching may be supported later.

*dest*:

Michael DeHaan committed
162
* A directory to save the file into.  For example, if the 'dest' directory is '/foo', a src file named '/tmp/bar' on host 'host.example.com', would be saved into '/foo/host.example.com/tmp/bar' (in Ansible 0.0.3 and later).
163 164 165 166 167

The fetch module is a useful way to gather log files from remote systems.  If you require
fetching multiple files from remote systems, you may wish to execute a tar command and
then fetch the tarball.

Michael DeHaan committed
168 169 170 171
Example::

    fetch src=/var/log/messages dest=/home/logtree

Michael DeHaan committed
172

173 174 175
file
````

176 177 178
Sets attributes of files, symlinks, and directories, or removes files/symlinks/directories. 
All parameters available to the file module are also available when running the `copy` or 
`template` modules.
179 180 181 182 183 184 185

*dest*:

* absolute path to a file on the filesystem.

*state*:

186
* either 'file', 'link', 'directory', or 'absent'.  The default is 'file'.  If 'directory', the directory and all immediate subdirectories will be created if they do not exist.  If 'file', the file will NOT be created if it does not exist, specify `copy` or `template` for the module name instead if you need to put content at the specified location.  If 'link', the symbolic link will be created or changed.  If 'absent', directories will be recursively deleted, and files or symlinks will be unlinked.
187 188 189 190 191 192 193 194 195 196 197 198 199

*mode*:

* the mode the file or directory should be, such as 644, as would be given to `chmod`.  English modes like "g+x" are not yet supported.

*owner*:

* name of user that should own the file or directory, as would be given to `chown`.

*group*:

* name of group that should own the file or directory, as would be given to `chgrp`

200 201
*src*:

202
* path of the file to link to (applies only to 'link' state)
203 204 205

*dest*:

206
* location where the symlink will be created for 'link' state, also an alias for 'path'.
207

208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223
*seuser*:

* 'user' part of SELinux file context.  Will default to what is provided by system policy, if available.  Only used on systems with SELinux present.

*serole*:

* 'role' part of SELinux file context.  Will default to what is provided by system policy, if available.  Only used on systems with SELinux present.

*setype*:

* 'type' part of SELinux file context.  Will default to what is provided by system policy, if available.  Only used on systems with SELinux present.

*selevel*:

* 'level' part of SELinux file context.  This is the MLS and MCS attribute of the file context.  It defaults to 's0'.  Only used only used on hosts with SELinux present.

224

225 226 227 228
Example action from Ansible :doc:`playbooks`::

    file path=/etc/foo.conf owner=foo group=foo mode=0644
    file path=/some/path owner=foo group=foo state=directory
229
    file path=/path/to/delete state=absent
230
    file src=/file/to/link/to dest=/path/to/symlink owner=foo group=foo state=link
231
    file path=/some/path state=directory setype=httpd_sys_content_t
232

Michael DeHaan committed
233 234
.. _git:

Michael DeHaan committed
235 236 237
git
```

Michael DeHaan committed
238
Deploys software (or files) from git checkouts.
Michael DeHaan committed
239

240
*repo*:
Michael DeHaan committed
241

242
* git or http protocol address of the repo to checkout.
Michael DeHaan committed
243

244
*dest*:
Michael DeHaan committed
245

246
* Where to check it out, an absolute directory path.
Michael DeHaan committed
247

248
*version*:
Michael DeHaan committed
249

250 251
* What version to check out -- either the git SHA, the literal string
  ``HEAD``, or a tag name.
Michael DeHaan committed
252

253
Example action from Ansible :doc:`playbooks`::
254 255 256

    git repo=git://foosball.example.org/path/to/repo.git dest=/srv/checkout version=release-0.22

Michael DeHaan committed
257
.. _group:
Michael DeHaan committed
258

259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281
group
`````

Adds or removes groups.

*name*:

* name of the group

*gid*:

* optional gid to set for the group

*state*:

* either 'absent', or 'present'.  'present' is the default.

To control members of the group, see the users resource.

Example action from Ansible :doc:`playbooks`::

   group name=somegroup state=present

Michael DeHaan committed
282 283
.. _ohai:

Michael DeHaan committed
284 285 286
ohai
````

287 288
Similar to the :ref:`facter` module, this returns JSON inventory data.
Ohai data is a bit more verbose and nested than facter.
Michael DeHaan committed
289 290 291 292 293 294

Requires that 'ohai' be installed on the remote end.

This module is information only - it takes no parameters & does not
support change hooks, nor does it make any changes on the system.

295 296
Playbooks should not call the ohai module, playbooks call the
:ref:`setup` module behind the scenes instead.
Michael DeHaan committed
297

Michael DeHaan committed
298 299
.. _ping:

Michael DeHaan committed
300 301 302
ping
````

303
A trivial test module, this module always returns the integer ``1`` on
Michael DeHaan committed
304 305
successful contact.

306 307 308
This module does not support change hooks and is informative only - it
takes no parameters & does not support change hooks, nor does it make
any changes on the system.
Michael DeHaan committed
309

Michael DeHaan committed
310
.. _service:
Michael DeHaan committed
311 312 313 314 315 316

service
```````

Controls services on remote machines.

317
*state*:
Michael DeHaan committed
318

319 320 321
* Values are ``started``, ``stopped``, or ``restarted``.
  Started/stopped are idempotent actions that will not run commands
  unless necessary.  ``restarted`` will always bounce the service.
Michael DeHaan committed
322

323
*name*:
Michael DeHaan committed
324

325
* The name of the service.
Michael DeHaan committed
326

327
Example action from Ansible :doc:`playbooks`::
328 329 330 331 332

    service name=httpd state=started
    service name=httpd state=stopped
    service name=httpd state=restarted

Michael DeHaan committed
333

334 335
.. _setup:

Michael DeHaan committed
336 337 338 339
setup
`````

Writes a JSON file containing key/value data, for use in templating.
340 341 342 343 344 345 346 347
Call this once before using the :ref:`template` module.  Playbooks
will execute this module automatically as the first step in each play
using the variables section, so it is unnecessary to make explicit
calls to setup within a playbook.

If facter or ohai are installed, variables from these programs will
also be snapshotted into the JSON file for usage in templating. These
variables are prefixed with ``facter_`` and ``ohai_`` so it's easy to
Michael DeHaan committed
348 349 350 351 352
tell their source.  Ansible also provides it's own 'facts' about the
remote system, which are prefixed with ``ansible_``.  All variables are 
then bubbled up to the caller.  Using the ansible facts and chosing
to not install facter and ohai means you can avoid ruby-dependencies
on your remote systems.
Michael DeHaan committed
353

354
*anything*:
Michael DeHaan committed
355

356 357
 * Any other parameters can be named basically anything, and set a
   ``key=value`` pair in the JSON file for use in templating.
Michael DeHaan committed
358

359
Example action from Ansible :doc:`playbooks`::
360 361 362 363 364

    vars:
        ntpserver: 'ntp.example.com'
        xyz: 1234

Martijn Koster committed
365
Example action from `/usr/bin/ansible`::
366

Martijn Koster committed
367
    ansible all -m setup -a "ntpserver=ntp.example.com xyz=1234"
368

Michael DeHaan committed
369

370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390
.. _shell:

shell
`````

The shell module takes the command name followed by a list of
arguments, space delimited.  It is almost exactly like the command module
but runs the command through the shell rather than directly.

The given command will be executed on all selected nodes.  

If you want to execute a command securely and predicably, it may
be better to use the 'command' module instead.  Best practices
when writing playbooks will follow the trend of using 'command'
unless 'shell' is explicitly required.  When running ad-hoc commands,
use your best judgement.

This module does not support change hooks and returns the return code
from the program as well as timing information about how long the
command was running for.

391 392 393 394
Example action from a playbook::

    shell somescript.sh >> somelog.txt

395

396
.. _template:
Michael DeHaan committed
397 398 399 400

template
````````

401
Templates a file out to a remote server.  Call the :ref:`setup` module
402 403 404
prior to usage if you are not running from a playbook.   In addition to the options
listed below, the arguments available to the `file` module can also be passed to the copy
module.   
Michael DeHaan committed
405

406
*src*:
Michael DeHaan committed
407

408 409
* Path of a Jinja2 formatted template on the local server.  This can
  be a relative or absolute path.
Michael DeHaan committed
410

411
*dest*:
Michael DeHaan committed
412

413
* Location to render the template on the remote server.
Michael DeHaan committed
414 415 416

This module also returns md5sum information about the resultant file.

417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436
Example action from a playbook::

    template src=/srv/mytemplates/foo.j2 dest=/etc/foo.conf owner=foo group=foo mode=0644


.. _user:

user
````

Creates user accounts, manipulates existing user accounts, and removes user accounts.

*name*:

* Name of the user to create, remove, or edit

*comment*:

* Optionally sets the description of the user

Michael DeHaan committed
437
*group*:
438

Michael DeHaan committed
439
* Optionally sets the user's primary group, takes a group name.
440

441 442 443 444 445 446 447 448
*groups*:

* Put the user in the specified groups, takes comma delimited group names.

*append*:

* If true, will only add additional groups to the user listed in 'groups', rather than making the user only be in those specified groups.

449 450 451 452 453 454 455 456 457 458
*shell*:

* Optionally sets the user's shell.

*createhome*:

* Whether to create the user's home directory.  Takes 'yes', or 'no'.  The default is 'yes'.
    
*password*:

459
* Sets the user's password to this crypted value.  Pass in a result from crypt.  See the users example in the github examples directory for what this looks like in a playbook.
460 461 462

*state*:

463 464 465 466 467 468 469 470 471
* Defaults to 'present'.  When 'absent', the user account will be removed if present.  Optionally additional removal behaviors can be set with the 'force' or 'remove' parameter values (see below).

*force*:

* When used with a state of 'absent', the behavior denoted in the 'userdel' manpage for --force is also used when removing the user.  Value is 'yes' or 'no', default is 'no'.

*remove*:

* When used with a state of 'absent', the behavior denoted in the 'userdel' manpage for --remove is also used when removing the user.  Value is 'yes' or 'no', default is 'no'.
472

473
Example action from Ansible :doc:`playbooks`::
474 475

    user name=mdehaan comment=awesome passwd=awWxVV.JvmdHw createhome=yes
476 477
    user name=mdehaan groups=wheel,skynet
    user name=mdehaan state=absent force=yes
478

Michael DeHaan committed
479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515
.. _virt:

virt
````

Manages virtual machines supported by libvirt.  Requires that libvirt be installed
on the managed machine.

*guest*:

* The name of the guest VM being managed

*state*

* Desired state of the VM.  Either `running`, `shutdown`, `destroyed`, or `undefined`.  Note that there may be some lag for state requests like 'shutdown', and these states only refer to the virtual machine states.  After starting a guest, the guest OS may not be immediately accessible.

*command*:

* In addition to state management, various non-idempotent commands are available for API and script usage (but don't make much sense in a playbook).  These mostly return information, though some also affect state.  See examples below.

Example action from Ansible :doc:`playbooks`::

    virt guest=alpha state=running
    virt guest=alpha state=shutdown
    virt guest=alpha state=destroyed
    virt guest=alpha state=undefined

Example guest management commands from /usr/bin/ansible::

    ansible host -m virt -a "guest=foo command=status"
    ansible host -m virt -a "guest=foo command=pause"
    ansible host -m virt -a "guest=foo command=unpause"
    ansible host -m virt -a "guest=foo command=get_xml"
    ansible host -m virt -a "guest=foo command=autostart"

Example host (hypervisor) management commands from /usr/bin/ansible::

Michael DeHaan committed
516 517 518 519 520
    ansible host -m virt -a "command=freemem"
    ansible host -m virt -a "command=list_vms"
    ansible host -m virt -a "command=info"
    ansible host -m virt -a "command=nodeinfo"
    ansible host -m virt -a "command=virttype"
Michael DeHaan committed
521

522 523 524 525 526 527 528 529 530 531 532 533 534
.. _yum:

yum
```

Will install, upgrade, remove, and list packages with the yum package manager.

*pkg*:

* A package name or package specifier with version, like name-1.0

*state*:

535
* Can be either 'installed', 'latest', or 'removed'.  The default is 'installed'.
536 537 538 539 540 541

*list*:

* When 'list' is supplied instead of 'state', the yum module can list
  various configuration attributes.  Values include 'installed', 'updates',
  'available', 'repos', or any package specifier.
Michael DeHaan committed
542

543
Example action from Ansible :doc:`playbooks`::
544

Tim Bielawa committed
545 546 547
    yum pkg=httpd state=latest
    yum pkg=httpd state=removed
    yum pkg=httpd state=installed
548 549


Michael DeHaan committed
550 551
Writing your own modules
````````````````````````
Michael DeHaan committed
552

553
See :doc:`moduledev`.
554 555 556 557

.. seealso::

   :doc:`examples`
Martijn Koster committed
558
       Examples of using modules in /usr/bin/ansible
559
   :doc:`playbooks`
Martijn Koster committed
560
       Examples of using modules with /usr/bin/ansible-playbook
561 562
   :doc:`moduledev`
       How to write your own modules
563 564
   :doc:`api`
       Examples of using modules with the Python API
Martijn Koster committed
565
   `Mailing List <http://groups.google.com/group/ansible-project>`_
566 567 568 569
       Questions? Help? Ideas?  Stop by the list on Google Groups
   `irc.freenode.net <http://irc.freenode.net>`_
       #ansible IRC chat channel