patterns.rst 5.55 KB
Newer Older
1 2
.. _patterns:

3 4
Inventory & Patterns
====================
Tim Bielawa committed
5

6 7 8
Ansible works against multiple systems in your infrastructure at the
same time.  It does this by selecting portions of systems listed in
Ansible's inventory file, which defaults to /etc/ansible/hosts.
9

10 11 12 13
.. contents:: `Table of contents`
   :depth: 2
   :backlinks: top

14 15
.. _inventoryformat:

16 17
Hosts and Groups
++++++++++++++++
18

19
The format for /etc/ansible/hosts is an INI format and looks like this::
Michael DeHaan committed
20 21 22 23 24 25 26 27 28 29 30 31

    mail.example.com

    [webservers]
    foo.example.com
    bar.example.com

    [dbservers]
    one.example.com
    two.example.com
    three.example.com

32
The things in brackets are group names. You don't have to have them,
33
but they are useful.
Michael DeHaan committed
34

Michael DeHaan committed
35
If you have hosts that run on non-standard SSH ports you can put the port number
36
after the hostname with a colon.  
Michael DeHaan committed
37 38 39

    four.example.com:5309

40 41 42 43 44 45 46
In 0.6 and later, if you have a lot of hosts following similar patterns you can do this::

    [webservers]
    www[01-50].example.com

Leading zeros can be included or removed, as desired, and the ranges are inclusive.

47 48 49
Selecting Targets
+++++++++++++++++

50 51 52 53 54 55 56 57
We'll go over how to use the command line in :doc:`examples` section, however, basically it looks like this::

    ansible <pattern_goes_here> -m <module_name> -a <arguments>
    
Such as::

    ansible webservers -m service -a "name=httpd state=restarted"

58
Within :doc:`playbooks`, these patterns can be used for even greater purposes.
59 60 61 62 63

Anyway, to use Ansible, you'll first need to know how to tell Ansible which hosts in your inventory file to talk to.
This is done by designating particular host names or groups of hosts.

The following patterns target all hosts in the inventory file::
64 65 66

    all
    *    
Michael DeHaan committed
67

68
Basically 'all' is an alias for '*'.  It is also possible to address a specific host or hosts::
Michael DeHaan committed
69 70 71

    one.example.com
    one.example.com:two.example.com
72 73
    192.168.1.50
    192.168.1.*
Michael DeHaan committed
74
 
75
The following patterns address one or more groups, which are denoted
76
with the aforementioned bracket headers in the inventory file::
Michael DeHaan committed
77 78 79 80

    webservers
    webservers:dbservers

81
You can exclude groups as well, for instance, all webservers not in Phoenix::
82 83 84

    webservers:!phoenix

85
Individual host names (or IPs), but not groups, can also be referenced using
86
wildcards::
Michael DeHaan committed
87

88 89
    *.example.com
    *.com
Michael DeHaan committed
90

91
It's also ok to mix wildcard patterns and groups at the same time::
Michael DeHaan committed
92

93
    one*.com:dbservers
Michael DeHaan committed
94

95 96
Easy enough.  See :doc:`examples` and then :doc:`playbooks` for how to do things to selected hosts.

97 98 99
Host Variables
++++++++++++++

100
It is easy to assign variables to hosts that will be used later in playbooks::
101 102 103 104 105 106 107 108 109
 
   [atlanta]
   host1 http_port=80 maxRequestsPerChild=808
   host2 http_port=303 maxRequestsPerChild=909


Group Variables
+++++++++++++++

110
Variables can also be applied to an entire group at once::
111 112 113 114 115 116 117 118 119

   [atlanta]
   host1
   host2

   [atlanta:vars]
   ntp_server=ntp.atlanta.example.com
   proxy=proxy.atlanta.example.com

Michael DeHaan committed
120 121
Groups of Groups, and Group Variables
+++++++++++++++++++++++++++++++++++++
122

123
It is also possible to make groups of groups and assign
Michael DeHaan committed
124
variables to groups.  These variables can be used by /usr/bin/ansible-playbook, but not
Michael DeHaan committed
125
/usr/bin/ansible::
126 127 128 129 130 131 132 133 134 135

   [atlanta]
   host1
   host2

   [raleigh]
   host2
   host3

   [southeast:children]
136 137
   atlanta
   raleigh
138 139 140

   [southeast:vars]
   some_server=foo.southeast.example.com
Michael DeHaan committed
141 142 143
   halon_system_timeout=30
   self_destruct_countdown=60
   escape_pods=2
144 145 146 147 148 149 150

   [usa:children]
   southeast
   northeast
   southwest
   southeast

151 152
If you need to store lists or hash data, or prefer to keep host and group specific variables
seperate from the inventory file, see the next section.
153

154 155 156
Splitting Out Host and Group Specific Data
++++++++++++++++++++++++++++++++++++++++++

157 158 159 160 161
.. versionadded:: 0.6

In addition to the storing variables directly in the INI file, host
and group variables can be stored in individual files relative to the
inventory file.  These variable files are in YAML format.
162 163 164 165 166 167 168 169 170 171 172 173 174 175 176

Assuming the inventory file path is::

    /etc/ansible/hosts

If the host is named 'foosball', and in groups 'raleigh' and 'webservers', variables
in YAML files at the following locations will be made available to the host::

    /etc/ansible/group_vars/raleigh
    /etc/ansible/group_vars/webservers
    /etc/ansible/host_vars/foosball

For instance, suppose you have hosts grouped by datacenter, and each datacenter
uses some different servers.  The data in the groupfile '/etc/ansible/group_vars/raleigh' for
the 'raleigh' group might look like::
177 178

    ---
179 180 181 182 183 184 185
    ntp_server: acme.example.org
    database_server: storage.example.org

It is ok if these files do not exist, this is an optional feature.

Tip: Keeping your inventory file and variables in a git repo (or other version control) 
is an excellent way to track changes to your inventory and host variables.
186

187 188 189 190
.. versionadded:: 0.5
   If you ever have two python interpreters on a system, set a
   variable called 'ansible_python_interpreter' to the Python
   interpreter path you would like to use.
191 192 193 194

YAML Inventory
++++++++++++++

195 196 197 198 199
.. deprecated:: 0.7

Ansible's YAML inventory format is deprecated and will be removed in
Ansible 0.7.  Ansible 0.6 includes a `conversion script
<https://github.com/ansible/ansible/blob/devel/examples/scripts/yaml_to_ini.py>`_.
200 201

Usage::
202

203
    yaml_to_ini.py /etc/ansible/hosts
204

205 206 207 208 209 210
.. seealso::

   :doc:`examples`
       Examples of basic commands
   :doc:`playbooks`
       Learning ansible's configuration management language
211 212 213 214
   `Mailing List <http://groups.google.com/group/ansible-project>`_
       Questions? Help? Ideas?  Stop by the list on Google Groups
   `irc.freenode.net <http://irc.freenode.net>`_
       #ansible IRC chat channel
215