---
# System prepended metadata

title: Playbooks - Tips and Tricks

---

# Playbooks - Tips and Tricks

[toc]

### Ansible Playbooks [Tips and Tricks]

#### Running part of a playbook (Typically for troubleshooting) [Syntax]
````yaml=1
List all tags in the specified playbook:
ansible-playbook <playbookname> --list-tags

Run only specified tags:
ansible-playbook <playbookname> --tags <tag1,tag2> 

Run everything except specified tags:
ansible-playbook <playbookname> --skip-tags <tag1,tag2> 

Run from a specific play/task:
ansible-playbook:<playbookname> --start-at-task 

Step-by-step execution of the playbook:
ansible-playbook <playbookname> --step 
## This will cause ansible to stop on each task, and ask if it should execute that task. (y/n/c)
````
#### Running part of a playbook (Typically for troubleshooting) [Examples]
````yaml=1
#### tags.yaml

--- ## Using tags to run selective tasks 
- name: create user
  hosts: nodes
  become: yes
  tasks:
  - name: create multiple users listed
    user:
      name: "{{item}}"
      state: present
    loop:
    - sk12k
    - saif
    - hari
    - juarez
    - dani
  tags:
    - users
    - user

## Play to install multiple packages
- name: install packages
  hosts: nodes
  become: yes
  tasks:
    - name: install packages mentioned below
      apt:
        name: "{{item}}"
        state: latest
      loop:
      - tree
      - git
      - elinks
      - telnet
  tags:
     - pkgs


List all tags in playbook:
ansible-playbook tags.yaml --list-tags

run tasks with specific tags:
ansible-playbook tags.yaml --tags users,pkgs

skip specified tags:
ansible-playbook tags.yaml --skip-tags users,pkgs

start at a particular task:
ansible-playbook tags.yaml --start-at-task 'install packages mentioned below'

step by step execution of the playbook:
ansible-playbook tags.yaml --step
````
:mag: Additional Read:
- https://docs.ansible.com/ansible/latest/user_guide/playbooks_tags.html
- https://docs.ansible.com/ansible/latest/user_guide/playbooks_startnstep.html


#### Special tags: [always and never]
Ansible reserves two tag names for special behavior: always and never. If you assign the always tag to a task or play, Ansible will always run that task or play, unless you specifically skip it (--skip-tags always).

````yaml=1
--- ### Special tags example for always and never
tasks:
- name: Print a message
  ansible.builtin.debug:
    msg: "Always runs"
  tags:
  - always

- name: Print a message
  ansible.builtin.debug:
    msg: "runs when you use tag1"
  tags:
  - tag1
````
### ansible-playbook flags and other options

#### Checking the list of hosts for a playbook
:::warning
If you want to see a list of hosts that would be affected by your playbook before you actually run it, use --list-hosts:
:::

````yaml=
ansible-playbook playbook.yml --list-hosts

Running this should give output like:

playbook: playbook.yml

  play #1 (all): host count=4
    127.0.0.1
    192.168.24.2
    foo.example.com
    bar.example.com”
````
:mag: Reference: From Ansible for DevOps

#### Setting remote user and Sudo options
````yaml=
Explicitly define a remote user:
ansible-playbook elinks.yml --remote-user=sk12k

Ask sudo password on remote host:
ansible-playbook <playbook-name> -b --ask-sudo-pass
````

#### Limiting playbooks to specific host / hostgroup
````yaml=
ansible-playbook <playbook-name> --limit <hostname/hostgroup-name >
````
#### Provide alternate hostfile or inventory
````yaml=!
--inventory=PATH (-i PATH): Define a custom inventory file (default is the default Ansible inventory file, usually located at /etc/ansible/hosts).
````
#### Verbose mode output
````yaml=!
--verbose (-v): Verbose mode (show all output, including output from successful options). You can pass in -vvvv to give every minute detail.
````

#### Initialize variables defined in playbook at runtime
````yaml=!

--extra-vars=VARS (-e VARS): Define variables to be used in the playbook, in "key=value,key=value" format.
````

#### Define number of forks (parallelism)
````yaml=!
--forks=NUM (-f NUM): Number for forks (integer). Set this to a number higher than 5 to increase the number of servers on which Ansible will run tasks concurrently.
````

#### Define local connection type (other than ssh) for localhost
````yaml=!
--connection=TYPE (-c TYPE): The type of connection which will be used (this defaults to ssh; you might sometimes want to use local to run a playbook on your local machine, or on a remote server via cron).
````

#### Dry run a playbook
````yaml=!
--check: Run the playbook in Check Mode (‘Dry Run’); all tasks defined in the playbook will be checked against all hosts, but none will actually be run.”
````

:mag: For full options checkout --> https://docs.ansible.com/ansible/latest/cli/ansible-playbook.html
