Skip to content

Instantly share code, notes, and snippets.

@rsandhusdg
Forked from andreicristianpetcu/ansible-summary.md
Created March 25, 2021 00:58
Show Gist options
  • Save rsandhusdg/fd1caf6183bf9b27c804b120b8e57bcf to your computer and use it in GitHub Desktop.
Save rsandhusdg/fd1caf6183bf9b27c804b120b8e57bcf to your computer and use it in GitHub Desktop.

Revisions

  1. @carlessanagustin carlessanagustin renamed this gist Nov 19, 2015. 1 changed file with 8 additions and 82 deletions.
    90 changes: 8 additions & 82 deletions ANSIBLE-Cheat-Sheet.md → ansible-summary.md
    Original file line number Diff line number Diff line change
    @@ -1,17 +1,17 @@
    # Ansible Cheat Sheet
    # An Ansible summary

    [Jon Warbrick, July 2014, V3.2 (for Ansible 1.7)](http://www-uxsup.csx.cam.ac.uk/~jw35/docs/ansible/ansible-summary.html)
    Jon Warbrick, July 2014, V3.2 (for Ansible 1.7)

    # Configuration file

    [intro\_configuration.html](http://docs.ansible.com/intro_configuration.html)

    First one found from of

    1. Contents of `$ANSIBLE_CONFIG`
    2. `./ansible.cfg`
    3. `~/.ansible.cfg`
    4. `/etc/ansible/ansible.cfg`
    * 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.
    @@ -291,25 +291,6 @@ Show playbook snippet for specified module

    Names: letters, digits, underscores; starting with a letter.

    ## Variable Precedence

    1. extra vars
    2. task vars (only for the task)
    3. block vars (only for tasks in block)
    4. role and include vars
    5. play vars_files
    6. play vars_prompt
    7. play vars
    8. set_facts
    9. registered vars
    10. host facts
    11. playbook host_vars
    12. playbook group_vars
    13. inventory host_vars
    14. inventory group_vars
    15. inventory vars
    16. role defaults

    ## Substitution examples:

    * `{{ var }}`
    @@ -323,9 +304,6 @@ YAML requires an item starting with a variable substitution to be quoted.

    * Highest priority:
    * `--extra-vars` on the command line
    * demo: `--extra-vars "hosts=vipers user=starbuck`
    * demo: `--extra-vars '{"pacman":"mrs","ghosts":["inky","pinky","clyde","sue"]}'`
    * demo: `--extra-vars "@some_file.json"`
    * General:
    * `vars` component of a playbook
    * From files referenced by `vars_file` in a playbook
    @@ -350,8 +328,7 @@ YAML requires an item starting with a variable substitution to be quoted.
    * `inventory_hostname_short` (first component of inventory_hostname)
    * `play_hosts` (hostnames in scope for current play)
    * `inventory_dir` (location of the inventory)
    * `inventory_file` (name of the inventory)
    * `role_path` (role’s pathname)
    * `inventoty_file` (name of the inventory)

    ## Facts:

    @@ -367,22 +344,6 @@ Run `ansible hostname -m setup`, but in particular:
    * `ansible_default_ipv4.address`
    * `ansible_default_ipv6.address`

    ### Local Facts (Facts.d)

    If a remotely managed system has an `/etc/ansible/facts.d` directory, any files in this directory ending in .fact, can be JSON, INI, or executable files returning JSON, and these can supply local facts in Ansible.

    For instance assume a `/etc/ansible/facts.d/preferences.fact`:

    [general]
    asdf=1
    bar=2

    [More](http://docs.ansible.com/ansible/playbooks_variables.html#local-facts-facts-d)

    ### Fact Caching

    [More](http://docs.ansible.com/ansible/playbooks_variables.html#fact-caching)

    ## Content of 'registered' variables:

    [playbooks\_conditionals.html](http://docs.ansible.com/playbooks_conditionals.html),
    @@ -405,7 +366,7 @@ 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_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
    @@ -850,38 +811,3 @@ playbooks_vault.html
    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
  2. @carlessanagustin carlessanagustin revised this gist Oct 12, 2015. 1 changed file with 19 additions and 0 deletions.
    19 changes: 19 additions & 0 deletions ANSIBLE-Cheat-Sheet.md
    Original file line number Diff line number Diff line change
    @@ -291,6 +291,25 @@ Show playbook snippet for specified module

    Names: letters, digits, underscores; starting with a letter.

    ## Variable Precedence

    1. extra vars
    2. task vars (only for the task)
    3. block vars (only for tasks in block)
    4. role and include vars
    5. play vars_files
    6. play vars_prompt
    7. play vars
    8. set_facts
    9. registered vars
    10. host facts
    11. playbook host_vars
    12. playbook group_vars
    13. inventory host_vars
    14. inventory group_vars
    15. inventory vars
    16. role defaults

    ## Substitution examples:

    * `{{ var }}`
  3. @carlessanagustin carlessanagustin revised this gist Oct 12, 2015. 1 changed file with 3 additions and 2 deletions.
    5 changes: 3 additions & 2 deletions ANSIBLE-Cheat-Sheet.md
    Original file line number Diff line number Diff line change
    @@ -304,8 +304,9 @@ YAML requires an item starting with a variable substitution to be quoted.

    * Highest priority:
    * `--extra-vars` on the command line
    * demo: `$ ansible-playbook release.yml --extra-vars "hosts=vipers user=starbuck`
    * demo: `$ ansible-playbook release.yml --extra-vars '{"pacman":"mrs","ghosts":["inky","pinky","clyde","sue"]}'`
    * demo: `--extra-vars "hosts=vipers user=starbuck`
    * demo: `--extra-vars '{"pacman":"mrs","ghosts":["inky","pinky","clyde","sue"]}'`
    * demo: `--extra-vars "@some_file.json"`
    * General:
    * `vars` component of a playbook
    * From files referenced by `vars_file` in a playbook
  4. @carlessanagustin carlessanagustin revised this gist Oct 12, 2015. 1 changed file with 2 additions and 0 deletions.
    2 changes: 2 additions & 0 deletions ANSIBLE-Cheat-Sheet.md
    Original file line number Diff line number Diff line change
    @@ -304,6 +304,8 @@ YAML requires an item starting with a variable substitution to be quoted.

    * Highest priority:
    * `--extra-vars` on the command line
    * demo: `$ ansible-playbook release.yml --extra-vars "hosts=vipers user=starbuck`
    * demo: `$ ansible-playbook release.yml --extra-vars '{"pacman":"mrs","ghosts":["inky","pinky","clyde","sue"]}'`
    * General:
    * `vars` component of a playbook
    * From files referenced by `vars_file` in a playbook
  5. @carlessanagustin carlessanagustin revised this gist Oct 12, 2015. 1 changed file with 2 additions and 1 deletion.
    3 changes: 2 additions & 1 deletion ANSIBLE-Cheat-Sheet.md
    Original file line number Diff line number Diff line change
    @@ -328,7 +328,8 @@ YAML requires an item starting with a variable substitution to be quoted.
    * `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)
    * `inventory_file` (name of the inventory)
    * `role_path` (role’s pathname)

    ## Facts:

  6. @carlessanagustin carlessanagustin revised this gist Oct 12, 2015. 1 changed file with 4 additions and 4 deletions.
    8 changes: 4 additions & 4 deletions ANSIBLE-Cheat-Sheet.md
    Original file line number Diff line number Diff line change
    @@ -8,10 +8,10 @@

    First one found from of

    * Contents of `$ANSIBLE_CONFIG`
    * `./ansible.cfg`
    * `~/.ansible.cfg`
    * `/etc/ansible/ansible.cfg`
    1. Contents of `$ANSIBLE_CONFIG`
    2. `./ansible.cfg`
    3. `~/.ansible.cfg`
    4. `/etc/ansible/ansible.cfg`

    Configuration settings can be overridden by environment variables - see
    constants.py in the source tree for names.
  7. @carlessanagustin carlessanagustin revised this gist Oct 12, 2015. 1 changed file with 8 additions and 0 deletions.
    8 changes: 8 additions & 0 deletions ANSIBLE-Cheat-Sheet.md
    Original file line number Diff line number Diff line change
    @@ -346,6 +346,14 @@ Run `ansible hostname -m setup`, but in particular:

    ### Local Facts (Facts.d)

    If a remotely managed system has an `/etc/ansible/facts.d` directory, any files in this directory ending in .fact, can be JSON, INI, or executable files returning JSON, and these can supply local facts in Ansible.

    For instance assume a `/etc/ansible/facts.d/preferences.fact`:

    [general]
    asdf=1
    bar=2

    [More](http://docs.ansible.com/ansible/playbooks_variables.html#local-facts-facts-d)

    ### Fact Caching
  8. @carlessanagustin carlessanagustin revised this gist Oct 12, 2015. 1 changed file with 5 additions and 1 deletion.
    6 changes: 5 additions & 1 deletion ANSIBLE-Cheat-Sheet.md
    Original file line number Diff line number Diff line change
    @@ -344,10 +344,14 @@ Run `ansible hostname -m setup`, but in particular:
    * `ansible_default_ipv4.address`
    * `ansible_default_ipv6.address`

    ## Local Facts (Facts.d)
    ### Local Facts (Facts.d)

    [More](http://docs.ansible.com/ansible/playbooks_variables.html#local-facts-facts-d)

    ### Fact Caching

    [More](http://docs.ansible.com/ansible/playbooks_variables.html#fact-caching)

    ## Content of 'registered' variables:

    [playbooks\_conditionals.html](http://docs.ansible.com/playbooks_conditionals.html),
  9. @carlessanagustin carlessanagustin revised this gist Oct 12, 2015. 1 changed file with 4 additions and 0 deletions.
    4 changes: 4 additions & 0 deletions ANSIBLE-Cheat-Sheet.md
    Original file line number Diff line number Diff line change
    @@ -344,6 +344,10 @@ Run `ansible hostname -m setup`, but in particular:
    * `ansible_default_ipv4.address`
    * `ansible_default_ipv6.address`

    ## Local Facts (Facts.d)

    [More](http://docs.ansible.com/ansible/playbooks_variables.html#local-facts-facts-d)

    ## Content of 'registered' variables:

    [playbooks\_conditionals.html](http://docs.ansible.com/playbooks_conditionals.html),
  10. @carlessanagustin carlessanagustin created this gist Oct 12, 2015.
    848 changes: 848 additions & 0 deletions ANSIBLE-Cheat-Sheet.md
    Original file line number Diff line number Diff line change
    @@ -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