|  |  | @@ -0,0 +1,848 @@ | 
    
    |  |  | # Ansible Cheat Sheet | 
    
    |  |  | 
 | 
    
    |  |  | [Jon Warbrick, July 2014, V3.2 (for Ansible 1.7)](http://www-uxsup.csx.cam.ac.uk/~jw35/docs/ansible/ansible-summary.html) | 
    
    |  |  | 
 | 
    
    |  |  | # Configuration file | 
    
    |  |  | 
 | 
    
    |  |  | [intro\_configuration.html](http://docs.ansible.com/intro_configuration.html) | 
    
    |  |  | 
 | 
    
    |  |  | First one found from of | 
    
    |  |  | 
 | 
    
    |  |  | * Contents of `$ANSIBLE_CONFIG` | 
    
    |  |  | * `./ansible.cfg` | 
    
    |  |  | * `~/.ansible.cfg` | 
    
    |  |  | * `/etc/ansible/ansible.cfg` | 
    
    |  |  | 
 | 
    
    |  |  | Configuration settings can be overridden by environment variables - see | 
    
    |  |  | constants.py in the source tree for names. | 
    
    |  |  | 
 | 
    
    |  |  | # Patterns | 
    
    |  |  | 
 | 
    
    |  |  | [intro\_patterns.html](http://docs.ansible.com/intro_patterns.html) | 
    
    |  |  | 
 | 
    
    |  |  | Used on the `ansible` command line, or in playbooks. | 
    
    |  |  | 
 | 
    
    |  |  | * `all` (or `*`) | 
    
    |  |  | * hostname: `foo.example.com` | 
    
    |  |  | * groupname: `webservers` | 
    
    |  |  | * or: `webservers:dbserver` | 
    
    |  |  | * exclude: `webserver:!phoenix` | 
    
    |  |  | * intersection: `webservers:&staging` | 
    
    |  |  | 
 | 
    
    |  |  | Operators can be chained: `webservers:dbservers:&staging:!phoenix` | 
    
    |  |  | 
 | 
    
    |  |  | Patterns can include variable substitutions: `{{foo}}`, wildcards: | 
    
    |  |  | `*.example.com` or 192.168.1.*, and regular expressions: | 
    
    |  |  | `~(web|db).*\.example\.com` | 
    
    |  |  | 
 | 
    
    |  |  | # Inventory files | 
    
    |  |  | 
 | 
    
    |  |  | [intro\_inventory.html](http://docs.ansible.com/intro_inventory.html), | 
    
    |  |  | [intro\_dynamic\_inventory.html](http://docs.ansible.com/intro_dynamic_inventory.html) | 
    
    |  |  | 
 | 
    
    |  |  | 'INI-file' structure, blocks define groups. Hosts allowed in more than | 
    
    |  |  | one group. Non-standard SSH port can follow hostname separated by ':' | 
    
    |  |  | (but see also `ansible_ssh_port` below). | 
    
    |  |  | 
 | 
    
    |  |  | Hostname ranges: `www[01:50].example.com`, `db-[a:f].example.com` | 
    
    |  |  | 
 | 
    
    |  |  | Per-host variables: `foo.example.com foo=bar baz=wibble` | 
    
    |  |  | 
 | 
    
    |  |  | * `[foo:children]`: new group `foo` containing all members if included groups | 
    
    |  |  | * `[foo:vars]`: variable definitions for all members of group `foo` | 
    
    |  |  | 
 | 
    
    |  |  | Inventory file defaults to `/etc/ansible/hosts`. Veritable with `-i` | 
    
    |  |  | or in the configuration file. The 'file' can also be a dynamic | 
    
    |  |  | inventory script. If a directory, all contained files are processed. | 
    
    |  |  | 
 | 
    
    |  |  | # Variable files: | 
    
    |  |  | 
 | 
    
    |  |  | [intro\_inventory.html](http://docs.ansible.com/intro_inventory.html) | 
    
    |  |  | 
 | 
    
    |  |  | YAML; given inventory file at `./hosts`: | 
    
    |  |  | 
 | 
    
    |  |  | * `./group_vars/foo`: variable definitions for all members of group `foo` | 
    
    |  |  | * `./host_vars/foo.example.com`: variable definitions for foo.example.com | 
    
    |  |  | 
 | 
    
    |  |  | `group_vars` and `host_vars` directories can also exist in the playbook | 
    
    |  |  | directory. If both paths exist, variables in the playbook directory | 
    
    |  |  | will be loaded second. | 
    
    |  |  | 
 | 
    
    |  |  | # Behavioral inventory parameters: | 
    
    |  |  | 
 | 
    
    |  |  | [intro\_inventory.html](http://docs.ansible.com/intro_inventory.html) | 
    
    |  |  | 
 | 
    
    |  |  | * `ansible_ssh_host` | 
    
    |  |  | * `ansible_ssh_port` | 
    
    |  |  | * `ansible_ssh_user` | 
    
    |  |  | * `ansible_ssh_pass` | 
    
    |  |  | * `ansible_sudo_pass` | 
    
    |  |  | * `ansible_connection` | 
    
    |  |  | * `ansible_ssh_private_key_file` | 
    
    |  |  | * `ansible_python_interpreter` | 
    
    |  |  | * `ansible_*_interpreter` | 
    
    |  |  | 
 | 
    
    |  |  | # Playbooks | 
    
    |  |  | 
 | 
    
    |  |  | [playbooks\_intro.html](http://docs.ansible.com/playbooks_intro.html), | 
    
    |  |  | [playbooks\_roles.html](http://docs.ansible.com/playbooks_roles.html) | 
    
    |  |  | 
 | 
    
    |  |  | Playbooks are a YAML list of one or more plays. Most (all?) keys are | 
    
    |  |  | optional. Lines can be broken on space with continuation lines | 
    
    |  |  | indented. | 
    
    |  |  | 
 | 
    
    |  |  | Playbooks consist of a list of one or more 'plays' and/or inclusions: | 
    
    |  |  | 
 | 
    
    |  |  | --- | 
    
    |  |  | - include: playbook.yml | 
    
    |  |  | - <play> | 
    
    |  |  | - ... | 
    
    |  |  | 
 | 
    
    |  |  | ## Plays | 
    
    |  |  | 
 | 
    
    |  |  | [playbooks\_intro.html](http://docs.ansible.com/playbooks_intro.html), | 
    
    |  |  | [playbooks\_roles.html](http://docs.ansible.com/playbooks_roles.htm), | 
    
    |  |  | [playbooks\_variables.html](http://docs.ansible.com/playbooks_variables.html), | 
    
    |  |  | [playbooks\_conditionals.html](http://docs.ansible.com/playbooks_conditionals.html), | 
    
    |  |  | [playbooks\_acceleration.html](http://docs.ansible.com/playbooks_acceleration.html), | 
    
    |  |  | [playbooks\_delegation.html](http://docs.ansible.com/playbooks_delegation.html), | 
    
    |  |  | [playbooks\_prompts.html](http://docs.ansible.com/playbooks_prompts.html), | 
    
    |  |  | [playbooks\_tags.html](http://docs.ansible.com/playbooks_tags.htm) | 
    
    |  |  | [Forum posting](https://groups.google.com/forum/#!topic/ansible-project/F9mIAfo6orc) | 
    
    |  |  | [Forum postinb](https://groups.google.com/forum/#!topic/Ansible-project/MU_ws7zynnI) | 
    
    |  |  | 
 | 
    
    |  |  | Plays consist of play metadata and a sequence of task and handler | 
    
    |  |  | definitions, and roles. | 
    
    |  |  | 
 | 
    
    |  |  | - hosts: webservers | 
    
    |  |  | remote_user: root | 
    
    |  |  | sudo: yes | 
    
    |  |  | sudo_user: postgress | 
    
    |  |  | su: yes | 
    
    |  |  | su_user: exim | 
    
    |  |  | gather_facts: no | 
    
    |  |  | accelerate: no | 
    
    |  |  | accelerate_port: 5099 | 
    
    |  |  | any_errors_fatal: yes | 
    
    |  |  | max_fail_percentage: 30 | 
    
    |  |  | connection: local | 
    
    |  |  | serial: 5 | 
    
    |  |  | vars: | 
    
    |  |  | http_port: 80 | 
    
    |  |  | vars_files: | 
    
    |  |  | - "vars.yml" | 
    
    |  |  | - [ "try-first.yml", "try-second-.yml" ] | 
    
    |  |  | vars_prompt: | 
    
    |  |  | - name: "my_password2" | 
    
    |  |  | prompt: "Enter password2" | 
    
    |  |  | default: "secret" | 
    
    |  |  | private: yes | 
    
    |  |  | encrypt: "md5_crypt" | 
    
    |  |  | confirm: yes | 
    
    |  |  | salt: 1234 | 
    
    |  |  | salt_size: 8 | 
    
    |  |  | tags: | 
    
    |  |  | - stuff | 
    
    |  |  | - nonsence | 
    
    |  |  | pre_tasks: | 
    
    |  |  | - <task> | 
    
    |  |  | - ... | 
    
    |  |  | roles: | 
    
    |  |  | - common | 
    
    |  |  | - { role: common, port: 5000, when: "bar == 'Baz'", tags :[one, two] } | 
    
    |  |  | - { role: common, when: month == 'Jan' } | 
    
    |  |  | - ... | 
    
    |  |  | tasks: | 
    
    |  |  | - include: tasks.yaml | 
    
    |  |  | - include: tasks.yaml foo=bar baz=wibble | 
    
    |  |  | - include: tasks.yaml | 
    
    |  |  | vars: | 
    
    |  |  | foo: aaa | 
    
    |  |  | baz: | 
    
    |  |  | - z | 
    
    |  |  | - y | 
    
    |  |  | - { include: tasks.yaml, foo: zzz, baz: [a,b]} | 
    
    |  |  | - include: tasks.yaml | 
    
    |  |  | when: day == 'Thursday' | 
    
    |  |  | - <task> | 
    
    |  |  | - ... | 
    
    |  |  | post_tasks: | 
    
    |  |  | - <task> | 
    
    |  |  | - ... | 
    
    |  |  | handlers: | 
    
    |  |  | - include: handlers.yml | 
    
    |  |  | - <task> | 
    
    |  |  | - ... | 
    
    |  |  | 
 | 
    
    |  |  | Using `encrypt` with `vars_prompt` requires that | 
    
    |  |  | [Passlib](http://pythonhosted.org/passlib/) is installed. | 
    
    |  |  | 
 | 
    
    |  |  | In addition the source code implies the availability of the following | 
    
    |  |  | which don't *seem* to be mentioned in the documentation: `name`, `user` (deprecated), `port`, `accelerate_ipv6`, `role_names`, and `vault_password`. | 
    
    |  |  | 
 | 
    
    |  |  | ## Task definitions | 
    
    |  |  | 
 | 
    
    |  |  | [playbooks\_intro.html](http://docs.ansible.com/playbooks_intro.html), | 
    
    |  |  | [playbooks\_roles.html](http://docs.ansible.com/playbooks_roles.html), | 
    
    |  |  | [playbooks\_async.html](http://docs.ansible.com/playbooks_async.html), | 
    
    |  |  | [playbooks\_checkmode.html](http://docs.ansible.com/[playbooks_checkmode.html), | 
    
    |  |  | [playbooks\_delegation.html](http://docs.ansible.com/playbooks_delegation.html), | 
    
    |  |  | [playbooks\_environment.html](http://docs.ansible.com/playbooks_environment.html), | 
    
    |  |  | [playbooks\_error_handling.html](http://docs.ansible.com/playbooks_error_handling.html), | 
    
    |  |  | [playbooks\_tags.html](http://docs.ansible.com/playbooks_tags.html) | 
    
    |  |  | [ansible-1-5-released](http://www.ansible.com/blog/2014/02/28/ansible-1-5-released) | 
    
    |  |  | [Forum posting](https://groups.google.com/forum/#!topic/ansible-project/F9mIAfo6orc) | 
    
    |  |  | [Ansible examples](https://github.com/ansible/ansible-examples/blob/master/language_features/complex_args.yml) | 
    
    |  |  | 
 | 
    
    |  |  | Each task definition is a list of items, normally including at least a | 
    
    |  |  | name and a module invocation: | 
    
    |  |  | 
 | 
    
    |  |  | - name: task | 
    
    |  |  | remote_user: apache | 
    
    |  |  | sudo: yes | 
    
    |  |  | sudo_user: postgress | 
    
    |  |  | sudo_pass: wibble | 
    
    |  |  | su: yes | 
    
    |  |  | su_user: exim | 
    
    |  |  | ignore_errors: True | 
    
    |  |  | delegate_to: 127.0.0.1 | 
    
    |  |  | async: 45 | 
    
    |  |  | poll: 5 | 
    
    |  |  | always_run: no | 
    
    |  |  | run_once: false | 
    
    |  |  | meta: flush_handlers | 
    
    |  |  | no_log: true | 
    
    |  |  | environment: <hash> | 
    
    |  |  | environment: | 
    
    |  |  | var1: val1 | 
    
    |  |  | var2: val2 | 
    
    |  |  | tags: | 
    
    |  |  | - stuff | 
    
    |  |  | - nonsence | 
    
    |  |  | <module>: src=template.j2 dest=/etc/foo.conf | 
    
    |  |  | action: <module>, src=template.j2 dest=/etc/foo.conf | 
    
    |  |  | action: <module> | 
    
    |  |  | args: | 
    
    |  |  | src=template.j2 | 
    
    |  |  | dest=/etc/foo.conf | 
    
    |  |  | local_action: <module> /usr/bin/take_out_of_pool {{ inventory_hostname }} | 
    
    |  |  | when: ansible_os_family == "Debian" | 
    
    |  |  | register: result | 
    
    |  |  | failed_when: "'FAILED' in result.stderr" | 
    
    |  |  | changed_when: result.rc != 2 | 
    
    |  |  | notify: | 
    
    |  |  | - restart apache | 
    
    |  |  | 
 | 
    
    |  |  | `delegate_to: 127.0.0.1` is implied by `local_action:` | 
    
    |  |  | 
 | 
    
    |  |  | The forms `<module>: <args>`, `action: <module> <args>`, and `local_action: <module> <args>` are mutually-exclusive. | 
    
    |  |  | 
 | 
    
    |  |  | Additional keys `when_*`, `until`, `retries` and `delay` are documented below under 'Loops'. | 
    
    |  |  | 
 | 
    
    |  |  | In addition the source code implies the availability of the following | 
    
    |  |  | which don't *seem* to be mentioned in the documentation: | 
    
    |  |  | `first_available_file` (deprecated), `transport`, | 
    
    |  |  | `connection`, `any_errors_fatal`. | 
    
    |  |  | 
 | 
    
    |  |  | # Roles | 
    
    |  |  | 
 | 
    
    |  |  | [playbooks\_roles.html](http://docs.ansible.com/playbooks_roles.html) | 
    
    |  |  | 
 | 
    
    |  |  | Directory structure: | 
    
    |  |  | 
 | 
    
    |  |  | playbook.yml | 
    
    |  |  | roles/ | 
    
    |  |  | common/ | 
    
    |  |  | tasks/ | 
    
    |  |  | main.yml | 
    
    |  |  | handlers/ | 
    
    |  |  | main.yml | 
    
    |  |  | vars/ | 
    
    |  |  | main.yml | 
    
    |  |  | meta/ | 
    
    |  |  | main.yml | 
    
    |  |  | defaults/ | 
    
    |  |  | main.yml | 
    
    |  |  | files/ | 
    
    |  |  | templates/ | 
    
    |  |  | library/ | 
    
    |  |  | 
 | 
    
    |  |  | # Modules | 
    
    |  |  | 
 | 
    
    |  |  | [modules.htm](http://docs.ansible.com/modules.htm), | 
    
    |  |  | [modules\_by\_category.html](http://docs.ansible.com/modules_by_category.html) | 
    
    |  |  | 
 | 
    
    |  |  | List all installed modules with | 
    
    |  |  | 
 | 
    
    |  |  | ansible-doc --list | 
    
    |  |  | 
 | 
    
    |  |  | Document a particular module with | 
    
    |  |  | 
 | 
    
    |  |  | ansible-doc <module> | 
    
    |  |  | 
 | 
    
    |  |  | Show playbook snippet for specified module | 
    
    |  |  | 
 | 
    
    |  |  | ansible-doc -i <module> | 
    
    |  |  | 
 | 
    
    |  |  | # Variables | 
    
    |  |  | 
 | 
    
    |  |  | [playbooks\_roles.html](http://docs.ansible.com/playbooks_roles.html), | 
    
    |  |  | [playbooks\_variables.html](http://docs.ansible.com/playbooks_variables.html) | 
    
    |  |  | 
 | 
    
    |  |  | Names: letters, digits, underscores; starting with a letter. | 
    
    |  |  | 
 | 
    
    |  |  | ## Substitution examples: | 
    
    |  |  | 
 | 
    
    |  |  | * `{{ var }}` | 
    
    |  |  | * `{{ var["key1"]["key2"]}}` | 
    
    |  |  | * `{{ var.key1.key2 }}` | 
    
    |  |  | * `{{ list[0] }}` | 
    
    |  |  | 
 | 
    
    |  |  | YAML requires an item starting with a variable substitution to be quoted. | 
    
    |  |  | 
 | 
    
    |  |  | ## Sources: | 
    
    |  |  | 
 | 
    
    |  |  | * Highest priority: | 
    
    |  |  | * `--extra-vars` on the command line | 
    
    |  |  | * General: | 
    
    |  |  | * `vars` component of a playbook | 
    
    |  |  | * From files referenced by `vars_file` in a playbook | 
    
    |  |  | * From included files (incl. roles) | 
    
    |  |  | * Parameters passed to includes | 
    
    |  |  | * `register:` in tasks | 
    
    |  |  | * Lower priority: | 
    
    |  |  | * Inventory (set on host or group) | 
    
    |  |  | * Lower priority: | 
    
    |  |  | * Facts (see below) | 
    
    |  |  | * Any `/etc/ansible/facts.d/filename.fact` on managed machines | 
    
    |  |  | (sets variables with `ansible_local.filename. prefix) | 
    
    |  |  | * Lowest priority | 
    
    |  |  | * Role defaults (from defaults/main.yml) | 
    
    |  |  | 
 | 
    
    |  |  | ## Built-in: | 
    
    |  |  | 
 | 
    
    |  |  | * `hostvars` (e.g. `hostvars[other.example.com][...]`) | 
    
    |  |  | * `group_names` (groups containing current host) | 
    
    |  |  | * `groups` (all groups and hosts in the inventory) | 
    
    |  |  | * `inventory_hostname` (current host as in inventory) | 
    
    |  |  | * `inventory_hostname_short` (first component of inventory_hostname) | 
    
    |  |  | * `play_hosts` (hostnames in scope for current play) | 
    
    |  |  | * `inventory_dir` (location of the inventory) | 
    
    |  |  | * `inventoty_file` (name of the inventory) | 
    
    |  |  | 
 | 
    
    |  |  | ## Facts: | 
    
    |  |  | 
 | 
    
    |  |  | Run `ansible hostname -m setup`, but in particular: | 
    
    |  |  | 
 | 
    
    |  |  | * `ansible_distribution` | 
    
    |  |  | * `ansible_distribution_release` | 
    
    |  |  | * `ansible_distribution_version` | 
    
    |  |  | * `ansible_fqdn` | 
    
    |  |  | * `ansible_hostname` | 
    
    |  |  | * `ansible_os_family` | 
    
    |  |  | * `ansible_pkg_mgr` | 
    
    |  |  | * `ansible_default_ipv4.address` | 
    
    |  |  | * `ansible_default_ipv6.address` | 
    
    |  |  | 
 | 
    
    |  |  | ## Content of 'registered' variables: | 
    
    |  |  | 
 | 
    
    |  |  | [playbooks\_conditionals.html](http://docs.ansible.com/playbooks_conditionals.html), | 
    
    |  |  | [playbooks\_loops.html](http://docs.ansible.com/playbooks_loops.html) | 
    
    |  |  | 
 | 
    
    |  |  | Depends on module. Typically includes: | 
    
    |  |  | 
 | 
    
    |  |  | * `.rc` | 
    
    |  |  | * `.stdout` | 
    
    |  |  | * `.stdout_lines` | 
    
    |  |  | * `.changed` | 
    
    |  |  | * `.msg` (following failure) | 
    
    |  |  | * `.results` (when used in a loop) | 
    
    |  |  | 
 | 
    
    |  |  | See also `failed`, `changed`, etc filters. | 
    
    |  |  | 
 | 
    
    |  |  | When used in a loop the `result` element is a list containing all | 
    
    |  |  | responses from the module. | 
    
    |  |  | 
 | 
    
    |  |  | ## Additionally available in templates: | 
    
    |  |  | 
 | 
    
    |  |  | * `ansible_managed`: string containing the information below | 
    
    |  |  | * `template_host`: node name of the template’s machine | 
    
    |  |  | * `template_uid`: the owner | 
    
    |  |  | * `template_path`: absolute path of the template | 
    
    |  |  | * `template_fullpath`: the absolute path of the template | 
    
    |  |  | * `template_run_date`: the date that the template was rendered | 
    
    |  |  | 
 | 
    
    |  |  | # Filters | 
    
    |  |  | 
 | 
    
    |  |  | [playbooks\_variables.html](http://docs.ansible.com/playbooks_variables.html) | 
    
    |  |  | 
 | 
    
    |  |  | * `{{ var | to_nice_json }}` | 
    
    |  |  | * `{{ var | to_json }}` | 
    
    |  |  | * `{{ var | from_json }}` | 
    
    |  |  | * `{{ var | to_nice_yml }}` | 
    
    |  |  | * `{{ var | to_yml }}` | 
    
    |  |  | * `{{ var | from_yml }}` | 
    
    |  |  | * `{{ result | failed }}` | 
    
    |  |  | * `{{ result | changed }}` | 
    
    |  |  | * `{{ result | success }}` | 
    
    |  |  | * `{{ result | skipped }}` | 
    
    |  |  | * `{{ var | manditory }}` | 
    
    |  |  | * `{{ var | default(5) }}` | 
    
    |  |  | * `{{ list1 | unique }}` | 
    
    |  |  | * `{{ list1 | union(list2) }}` | 
    
    |  |  | * `{{ list1 | intersect(list2) }}` | 
    
    |  |  | * `{{ list1 | difference(list2) }}` | 
    
    |  |  | * `{{ list1 | symmetric_difference(list2) }}` | 
    
    |  |  | * `{{ ver1 | version_compare(ver2, operator='>=', strict=True }}` | 
    
    |  |  | * `{{ list | random }}` | 
    
    |  |  | * `{{ number | random }}` | 
    
    |  |  | * `{{ number | random(start=1, step=10) }}` | 
    
    |  |  | * `{{ list | join(" ") }}` | 
    
    |  |  | * `{{ path | basename }}` | 
    
    |  |  | * `{{ path | dirname }}` | 
    
    |  |  | * `{{ path | expanduser }}` | 
    
    |  |  | * `{{ path | realpath }}` | 
    
    |  |  | * `{{ var | b64decode }}` | 
    
    |  |  | * `{{ var | b64encode }}` | 
    
    |  |  | * `{{ filename | md5 }}` | 
    
    |  |  | * `{{ var | bool }}` | 
    
    |  |  | * `{{ var | int }}` | 
    
    |  |  | * `{{ var | quote }}` | 
    
    |  |  | * `{{ var | md5 }}` | 
    
    |  |  | * `{{ var | fileglob }}` | 
    
    |  |  | * `{{ var | match }}` | 
    
    |  |  | * `{{ var | search }}` | 
    
    |  |  | * `{{ var | regex }}` | 
    
    |  |  | * `{{ var | regexp_replace('from', 'to' )}}` | 
    
    |  |  | 
 | 
    
    |  |  | See also [default jinja2 | 
    
    |  |  | filters](http://jinja.pocoo.org/docs/templates/#builtin-filters). In | 
    
    |  |  | YAML, values starting `{` must be quoted. | 
    
    |  |  | 
 | 
    
    |  |  | # Lookups | 
    
    |  |  | 
 | 
    
    |  |  | [playbooks\_lookups.html](http://docs.ansible.com/playbooks_lookups.html) | 
    
    |  |  | 
 | 
    
    |  |  | Lookups are evaluated on the control machine. | 
    
    |  |  | 
 | 
    
    |  |  | * `{{ lookup('file', '/etc/foo.txt') }}` | 
    
    |  |  | * `{{ lookup('password', '/tmp/passwordfile length=20 chars=ascii_letters,digits') }}` | 
    
    |  |  | * `{{ lookup('env','HOME') }}` | 
    
    |  |  | * `{{ lookup('pipe','date') }}` | 
    
    |  |  | * `{{ lookup('redis_kv', 'redis://localhost:6379,somekey') }}` | 
    
    |  |  | * `{{ lookup('dnstxt', 'example.com') }}` | 
    
    |  |  | * `{{ lookup('template', './some_template.j2') }}` | 
    
    |  |  | 
 | 
    
    |  |  | Lookups can be assigned to variables and will be evaluated each time | 
    
    |  |  | the variable is used. | 
    
    |  |  | 
 | 
    
    |  |  | Lookup plugins also support loop iteration (see below). | 
    
    |  |  | 
 | 
    
    |  |  | # Conditions | 
    
    |  |  | 
 | 
    
    |  |  | [playbooks\_conditionals.html](http://docs.ansible.com/playbooks_conditionals.html) | 
    
    |  |  | 
 | 
    
    |  |  | `when: <condition>`, where condition is: | 
    
    |  |  | 
 | 
    
    |  |  | * `var == "Vaue"`, `var >= 5`, etc. | 
    
    |  |  | * `var`, where `var` coreces to boolean (yes, true, True, TRUE) | 
    
    |  |  | * `var is defined`, `var is not defined` | 
    
    |  |  | * `<condition1> and <condition2>` (also `or`?) | 
    
    |  |  | 
 | 
    
    |  |  | Combined with `with_items`, the when statement is processed for each item. | 
    
    |  |  | 
 | 
    
    |  |  | `when` can also be applied to includes and roles. Conditional Imports | 
    
    |  |  | and variable substitution in file and template names can avoid the | 
    
    |  |  | need for explicit conditionals. | 
    
    |  |  | 
 | 
    
    |  |  | # Loops | 
    
    |  |  | 
 | 
    
    |  |  | [playbooks\_loops.html](http://docs.ansible.com/playbooks_loops.html) | 
    
    |  |  | 
 | 
    
    |  |  | In addition the source code implies the availability of the following | 
    
    |  |  | which don't *seem* to be mentioned in the documentation: `csvfile`, `etcd`, `inventory_hostname`. | 
    
    |  |  | 
 | 
    
    |  |  | ## Standard: | 
    
    |  |  | 
 | 
    
    |  |  | - user: name={{ item }} state=present groups=wheel | 
    
    |  |  | with_items: | 
    
    |  |  | - testuser1 | 
    
    |  |  | - testuser2 | 
    
    |  |  |  | 
    
    |  |  | - name: add several users | 
    
    |  |  | user: name={{ item.name }} state=present groups={{ item.groups }} | 
    
    |  |  | with_items: | 
    
    |  |  | - { name: 'testuser1', groups: 'wheel' } | 
    
    |  |  | - { name: 'testuser2', groups: 'root' } | 
    
    |  |  | 
 | 
    
    |  |  | with_items: somelist | 
    
    |  |  | 
 | 
    
    |  |  | ## Nested: | 
    
    |  |  | 
 | 
    
    |  |  | - mysql_user: name={{ item[0] }} priv={{ item[1] }}.*:ALL | 
    
    |  |  | append_privs=yes password=foo | 
    
    |  |  | with_nested: | 
    
    |  |  | - [ 'alice', 'bob', 'eve' ] | 
    
    |  |  | - [ 'clientdb', 'employeedb', 'providerdb' ] | 
    
    |  |  |  | 
    
    |  |  | ## Over hashes: | 
    
    |  |  | 
 | 
    
    |  |  | Given | 
    
    |  |  | 
 | 
    
    |  |  | --- | 
    
    |  |  | users: | 
    
    |  |  | alice: | 
    
    |  |  | name: Alice Appleworth | 
    
    |  |  | telephone: 123-456-7890 | 
    
    |  |  | bob: | 
    
    |  |  | name: Bob Bananarama | 
    
    |  |  | telephone: 987-654-3210 | 
    
    |  |  |  | 
    
    |  |  | tasks: | 
    
    |  |  | - name: Print phone records | 
    
    |  |  | debug: msg="User {{ item.key }} is {{ item.value.name }} | 
    
    |  |  | ({{ item.value.telephone }})" | 
    
    |  |  | with_dict: users | 
    
    |  |  | 
 | 
    
    |  |  | ## Fileglob: | 
    
    |  |  | 
 | 
    
    |  |  | - copy: src={{ item }} dest=/etc/fooapp/ owner=root mode=600 | 
    
    |  |  | with_fileglob: | 
    
    |  |  | - /playbooks/files/fooapp/* | 
    
    |  |  | 
 | 
    
    |  |  | In a role, relative paths resolve relative to the | 
    
    |  |  | `roles/<rolename>/files` directory. | 
    
    |  |  | 
 | 
    
    |  |  | ## With content of file: | 
    
    |  |  | 
 | 
    
    |  |  | (see example for `authorized_key` module) | 
    
    |  |  | 
 | 
    
    |  |  | - authorized_key: user=deploy key="{{ item }}" | 
    
    |  |  | with_file: | 
    
    |  |  | - public_keys/doe-jane | 
    
    |  |  | - public_keys/doe-john | 
    
    |  |  | 
 | 
    
    |  |  | See also the `file` lookup when the content of a file is needed. | 
    
    |  |  | 
 | 
    
    |  |  | ## Parallel sets of data: | 
    
    |  |  | 
 | 
    
    |  |  | Given | 
    
    |  |  | 
 | 
    
    |  |  | --- | 
    
    |  |  | alpha: [ 'a', 'b', 'c', 'd' ] | 
    
    |  |  | numbers:  [ 1, 2, 3, 4 ] | 
    
    |  |  | 
 | 
    
    |  |  | - debug: msg="{{ item.0 }} and {{ item.1 }}" | 
    
    |  |  | with_together: | 
    
    |  |  | - alpha | 
    
    |  |  | - numbers | 
    
    |  |  | 
 | 
    
    |  |  | ## Subelements: | 
    
    |  |  | 
 | 
    
    |  |  | Given | 
    
    |  |  | 
 | 
    
    |  |  | --- | 
    
    |  |  | users: | 
    
    |  |  | - name: alice | 
    
    |  |  | authorized: | 
    
    |  |  | - /tmp/alice/onekey.pub | 
    
    |  |  | - /tmp/alice/twokey.pub | 
    
    |  |  | - name: bob | 
    
    |  |  | authorized: | 
    
    |  |  | - /tmp/bob/id_rsa.pub | 
    
    |  |  | 
 | 
    
    |  |  | - authorized_key: "user={{ item.0.name }} | 
    
    |  |  | key='{{ lookup('file', item.1) }}'" | 
    
    |  |  | with_subelements: | 
    
    |  |  | - users | 
    
    |  |  | - authorized | 
    
    |  |  |  | 
    
    |  |  | ## Integer sequence: | 
    
    |  |  | 
 | 
    
    |  |  | Decimal, hexadecimal (0x3f8) or octal (0600) | 
    
    |  |  | 
 | 
    
    |  |  | - user: name={{ item }} state=present groups=evens | 
    
    |  |  | with_sequence: start=0 end=32 format=testuser%02x | 
    
    |  |  |  | 
    
    |  |  | with_sequence: start=4 end=16 stride=2 | 
    
    |  |  |  | 
    
    |  |  | with_sequence: count=4 | 
    
    |  |  |  | 
    
    |  |  | ## Random choice: | 
    
    |  |  | 
 | 
    
    |  |  | - debug: msg={{ item }} | 
    
    |  |  | with_random_choice: | 
    
    |  |  | - "go through the door" | 
    
    |  |  | - "drink from the goblet" | 
    
    |  |  | - "press the red button" | 
    
    |  |  | - "do nothing" | 
    
    |  |  |  | 
    
    |  |  | ## Do-Until: | 
    
    |  |  | 
 | 
    
    |  |  | - action: shell /usr/bin/foo | 
    
    |  |  | register: result | 
    
    |  |  | until: result.stdout.find("all systems go") != -1 | 
    
    |  |  | retries: 5 | 
    
    |  |  | delay: 10 | 
    
    |  |  | 
 | 
    
    |  |  | ## Results of a local program: | 
    
    |  |  | 
 | 
    
    |  |  | - name: Example of looping over a command result | 
    
    |  |  | shell: /usr/bin/frobnicate {{ item }} | 
    
    |  |  | with_lines: /usr/bin/frobnications_per_host | 
    
    |  |  | --param {{ inventory_hostname }} | 
    
    |  |  |  | 
    
    |  |  | To loop over the results of a remote program, use `register: result` | 
    
    |  |  | and then `with_items: result.stdout_lines` in a subsequent | 
    
    |  |  | task. | 
    
    |  |  | 
 | 
    
    |  |  | ## Indexed list: | 
    
    |  |  | 
 | 
    
    |  |  | - name: indexed loop demo | 
    
    |  |  | debug: msg="at array position {{ item.0 }} there is | 
    
    |  |  | a value {{ item.1 }}" | 
    
    |  |  | with_indexed_items: some_list | 
    
    |  |  |  | 
    
    |  |  | ## Flattened list: | 
    
    |  |  | 
 | 
    
    |  |  | --- | 
    
    |  |  | # file: roles/foo/vars/main.yml | 
    
    |  |  | packages_base: | 
    
    |  |  | - [ 'foo-package', 'bar-package' ] | 
    
    |  |  | packages_apps: | 
    
    |  |  | - [ ['one-package', 'two-package' ]] | 
    
    |  |  | - [ ['red-package'], ['blue-package']] | 
    
    |  |  |  | 
    
    |  |  | - name: flattened loop demo | 
    
    |  |  | yum: name={{ item }} state=installed | 
    
    |  |  | with_flattened: | 
    
    |  |  | - packages_base | 
    
    |  |  | - packages_apps | 
    
    |  |  | 
 | 
    
    |  |  | ## First found: | 
    
    |  |  | 
 | 
    
    |  |  | - name: template a file | 
    
    |  |  | template: src={{ item }} dest=/etc/myapp/foo.conf | 
    
    |  |  | with_first_found: | 
    
    |  |  | - files: | 
    
    |  |  | - {{ ansible_distribution }}.conf | 
    
    |  |  | - default.conf | 
    
    |  |  | paths: | 
    
    |  |  | - search_location_one/somedir/ | 
    
    |  |  | - /opt/other_location/somedir/ | 
    
    |  |  |  | 
    
    |  |  | # Tags | 
    
    |  |  | 
 | 
    
    |  |  | Both plays and tasks support a `tags:` attribute. | 
    
    |  |  | 
 | 
    
    |  |  | - template: src=templates/src.j2 dest=/etc/foo.conf | 
    
    |  |  | tags: | 
    
    |  |  | - configuration | 
    
    |  |  | 
 | 
    
    |  |  | Tags can be applied to roles and includes (effectively tagging all | 
    
    |  |  | included tasks) | 
    
    |  |  | 
 | 
    
    |  |  | roles: | 
    
    |  |  | - { role: webserver, port: 5000, tags: [ 'web', 'foo' ] } | 
    
    |  |  | 
 | 
    
    |  |  | - include: foo.yml tags=web,foo | 
    
    |  |  | 
 | 
    
    |  |  | To select by tag: | 
    
    |  |  | 
 | 
    
    |  |  | ansible-playbook example.yml --tags "configuration,packages" | 
    
    |  |  | ansible-playbook example.yml --skip-tags "notification" | 
    
    |  |  | 
 | 
    
    |  |  | # Command lines | 
    
    |  |  | 
 | 
    
    |  |  | ## ansible | 
    
    |  |  | 
 | 
    
    |  |  | Usage: ansible <host-pattern> [options] | 
    
    |  |  | 
 | 
    
    |  |  | Options: | 
    
    |  |  | -a MODULE_ARGS, --args=MODULE_ARGS | 
    
    |  |  | module arguments | 
    
    |  |  | -k, --ask-pass        ask for SSH password | 
    
    |  |  | --ask-su-pass         ask for su password | 
    
    |  |  | -K, --ask-sudo-pass   ask for sudo password | 
    
    |  |  | --ask-vault-pass      ask for vault password | 
    
    |  |  | -B SECONDS, --background=SECONDS | 
    
    |  |  | run asynchronously, failing after X seconds | 
    
    |  |  | (default=N/A) | 
    
    |  |  | -C, --check           don't make any changes; instead, try to predict some | 
    
    |  |  | of the changes that may occur | 
    
    |  |  | -c CONNECTION, --connection=CONNECTION | 
    
    |  |  | connection type to use (default=smart) | 
    
    |  |  | -f FORKS, --forks=FORKS | 
    
    |  |  | specify number of parallel processes to use | 
    
    |  |  | (default=5) | 
    
    |  |  | -h, --help            show this help message and exit | 
    
    |  |  | -i INVENTORY, --inventory-file=INVENTORY | 
    
    |  |  | specify inventory host file | 
    
    |  |  | (default=/etc/ansible/hosts) | 
    
    |  |  | -l SUBSET, --limit=SUBSET | 
    
    |  |  | further limit selected hosts to an additional pattern | 
    
    |  |  | --list-hosts          outputs a list of matching hosts; does not execute | 
    
    |  |  | anything else | 
    
    |  |  | -m MODULE_NAME, --module-name=MODULE_NAME | 
    
    |  |  | module name to execute (default=command) | 
    
    |  |  | -M MODULE_PATH, --module-path=MODULE_PATH | 
    
    |  |  | specify path(s) to module library | 
    
    |  |  | (default=/usr/share/ansible) | 
    
    |  |  | -o, --one-line        condense output | 
    
    |  |  | -P POLL_INTERVAL, --poll=POLL_INTERVAL | 
    
    |  |  | set the poll interval if using -B (default=15) | 
    
    |  |  | --private-key=PRIVATE_KEY_FILE | 
    
    |  |  | use this file to authenticate the connection | 
    
    |  |  | -S, --su              run operations with su | 
    
    |  |  | -R SU_USER, --su-user=SU_USER | 
    
    |  |  | run operations with su as this user (default=root) | 
    
    |  |  | -s, --sudo            run operations with sudo (nopasswd) | 
    
    |  |  | -U SUDO_USER, --sudo-user=SUDO_USER | 
    
    |  |  | desired sudo user (default=root) | 
    
    |  |  | -T TIMEOUT, --timeout=TIMEOUT | 
    
    |  |  | override the SSH timeout in seconds (default=10) | 
    
    |  |  | -t TREE, --tree=TREE  log output to this directory | 
    
    |  |  | -u REMOTE_USER, --user=REMOTE_USER | 
    
    |  |  | connect as this user (default=jw35) | 
    
    |  |  | --vault-password-file=VAULT_PASSWORD_FILE | 
    
    |  |  | vault password file | 
    
    |  |  | -v, --verbose         verbose mode (-vvv for more, -vvvv to enable | 
    
    |  |  | connection debugging) | 
    
    |  |  | --version             show program's version number and exit | 
    
    |  |  | 
 | 
    
    |  |  | ##  ansible-playbook | 
    
    |  |  | 
 | 
    
    |  |  | Usage: ansible-playbook playbook.yml | 
    
    |  |  | 
 | 
    
    |  |  | Options: | 
    
    |  |  | -k, --ask-pass        ask for SSH password | 
    
    |  |  | --ask-su-pass         ask for su password | 
    
    |  |  | -K, --ask-sudo-pass   ask for sudo password | 
    
    |  |  | --ask-vault-pass      ask for vault password | 
    
    |  |  | -C, --check           don't make any changes; instead, try to predict some | 
    
    |  |  | of the changes that may occur | 
    
    |  |  | -c CONNECTION, --connection=CONNECTION | 
    
    |  |  | connection type to use (default=smart) | 
    
    |  |  | -D, --diff            when changing (small) files and templates, show the | 
    
    |  |  | differences in those files; works great with --check | 
    
    |  |  | -e EXTRA_VARS, --extra-vars=EXTRA_VARS | 
    
    |  |  | set additional variables as key=value or YAML/JSON | 
    
    |  |  | -f FORKS, --forks=FORKS | 
    
    |  |  | specify number of parallel processes to use | 
    
    |  |  | (default=5) | 
    
    |  |  | -h, --help            show this help message and exit | 
    
    |  |  | -i INVENTORY, --inventory-file=INVENTORY | 
    
    |  |  | specify inventory host file | 
    
    |  |  | (default=/etc/ansible/hosts) | 
    
    |  |  | -l SUBSET, --limit=SUBSET | 
    
    |  |  | further limit selected hosts to an additional pattern | 
    
    |  |  | --list-hosts          outputs a list of matching hosts; does not execute | 
    
    |  |  | anything else | 
    
    |  |  | --list-tasks          list all tasks that would be executed | 
    
    |  |  | -M MODULE_PATH, --module-path=MODULE_PATH | 
    
    |  |  | specify path(s) to module library | 
    
    |  |  | (default=/usr/share/ansible) | 
    
    |  |  | --private-key=PRIVATE_KEY_FILE | 
    
    |  |  | use this file to authenticate the connection | 
    
    |  |  | --skip-tags=SKIP_TAGS | 
    
    |  |  | only run plays and tasks whose tags do not match these | 
    
    |  |  | values | 
    
    |  |  | --start-at-task=START_AT | 
    
    |  |  | start the playbook at the task matching this name | 
    
    |  |  | --step                one-step-at-a-time: confirm each task before running | 
    
    |  |  | -S, --su              run operations with su | 
    
    |  |  | -R SU_USER, --su-user=SU_USER | 
    
    |  |  | run operations with su as this user (default=root) | 
    
    |  |  | -s, --sudo            run operations with sudo (nopasswd) | 
    
    |  |  | -U SUDO_USER, --sudo-user=SUDO_USER | 
    
    |  |  | desired sudo user (default=root) | 
    
    |  |  | --syntax-check        perform a syntax check on the playbook, but do not | 
    
    |  |  | execute it | 
    
    |  |  | -t TAGS, --tags=TAGS  only run plays and tasks tagged with these values | 
    
    |  |  | -T TIMEOUT, --timeout=TIMEOUT | 
    
    |  |  | override the SSH timeout in seconds (default=10) | 
    
    |  |  | -u REMOTE_USER, --user=REMOTE_USER | 
    
    |  |  | connect as this user (default=jw35) | 
    
    |  |  | --vault-password-file=VAULT_PASSWORD_FILE | 
    
    |  |  | vault password file | 
    
    |  |  | -v, --verbose         verbose mode (-vvv for more, -vvvv to enable | 
    
    |  |  | connection debugging) | 
    
    |  |  | --version             show program's version number and exit | 
    
    |  |  | 
 | 
    
    |  |  | ## ansible-vault | 
    
    |  |  | 
 | 
    
    |  |  | 
 | 
    
    |  |  | playbooks_vault.html | 
    
    |  |  | 
 | 
    
    |  |  | Usage: ansible-vault [create|decrypt|edit|encrypt|rekey] [--help] [options] file_name | 
    
    |  |  | 
 | 
    
    |  |  | Options: | 
    
    |  |  | -h, --help  show this help message and exit | 
    
    |  |  | 
 | 
    
    |  |  | See 'ansible-vault <command> --help' for more information on a specific command. | 
    
    |  |  | 
 | 
    
    |  |  | ## ansible-doc | 
    
    |  |  | 
 | 
    
    |  |  | Usage: ansible-doc [options] [module...] | 
    
    |  |  | 
 | 
    
    |  |  | Show Ansible module documentation | 
    
    |  |  | 
 | 
    
    |  |  | Options: | 
    
    |  |  | --version             show program's version number and exit | 
    
    |  |  | -h, --help            show this help message and exit | 
    
    |  |  | -M MODULE_PATH, --module-path=MODULE_PATH | 
    
    |  |  | Ansible modules/ directory | 
    
    |  |  | -l, --list            List available modules | 
    
    |  |  | -s, --snippet         Show playbook snippet for specified module(s) | 
    
    |  |  | -v                    Show version number and exit | 
    
    |  |  | 
 | 
    
    |  |  | ## ansible-galaxy | 
    
    |  |  | 
 | 
    
    |  |  | Usage: ansible-galaxy [init|info|install|list|remove] [--help] [options] ... | 
    
    |  |  | 
 | 
    
    |  |  | Options: | 
    
    |  |  | -h, --help  show this help message and exit | 
    
    |  |  | 
 | 
    
    |  |  | See 'ansible-galaxy <command> --help' for more information on a | 
    
    |  |  | specific command | 
    
    |  |  | 
 | 
    
    |  |  | ## ansible-pull | 
    
    |  |  | 
 | 
    
    |  |  | Usage: ansible-pull [options] [playbook.yml] | 
    
    |  |  | 
 | 
    
    |  |  | ansible-pull: error: URL for repository not specified, use -h for help | 
    
    |  |  | 
 | 
    
    |  |  | 
 | 
    
    |  |  | # Best Practices | 
    
    |  |  | 
 | 
    
    |  |  | Ansible default folder structure from http://docs.ansible.com/playbooks_best_practices.html | 
    
    |  |  | 
 | 
    
    |  |  | Examples: | 
    
    |  |  | 
 | 
    
    |  |  | Now what sort of use cases does this layout enable? Lots! If I want to reconfigure my whole infrastructure, it’s just: | 
    
    |  |  | 
 | 
    
    |  |  | * ansible-playbook -i production site.yml | 
    
    |  |  | 
 | 
    
    |  |  | What about just reconfiguring NTP on everything? Easy.: | 
    
    |  |  | 
 | 
    
    |  |  | * ansible-playbook -i production site.yml --tags ntp | 
    
    |  |  | 
 | 
    
    |  |  | What about just reconfiguring my webservers?: | 
    
    |  |  | 
 | 
    
    |  |  | * ansible-playbook -i production webservers.yml | 
    
    |  |  | 
 | 
    
    |  |  | What about just my webservers in Boston?: | 
    
    |  |  | 
 | 
    
    |  |  | * ansible-playbook -i production webservers.yml --limit boston | 
    
    |  |  | 
 | 
    
    |  |  | What about just the first 10, and then the next 10?: | 
    
    |  |  | 
 | 
    
    |  |  | * ansible-playbook -i production webservers.yml --limit boston[0-10] | 
    
    |  |  | * ansible-playbook -i production webservers.yml --limit boston[10-20] | 
    
    |  |  | 
 | 
    
    |  |  | And of course just basic ad-hoc stuff is also possible.: | 
    
    |  |  | 
 | 
    
    |  |  | * ansible boston -i production -m ping | 
    
    |  |  | * ansible boston -i production -m command -a '/sbin/reboot' | 
    
    |  |  | 
 | 
    
    |  |  | Continue: https://github.com/ansible/ansible-examples |