> For the complete documentation index, see [llms.txt](https://notes.nomanaziz.me/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://notes.nomanaziz.me/devops/infrastructure-as-a-code-iac/ansible/1.-playbooks.md).

# 1. Playbooks

* It is the core of ansible
* It contain instructions to configure the nodes
* They are written in YAML, a language used to describe data

***

### Structure

#### 1. Name

We have the name of play like play1 and play 2

#### 2. Host

It is the target of the play

#### 3. Tasks

Each play has a list of tasks which contain following sections

**name**

Each element in the list of tasks is given a name like "install apache" and "start apache"

**set of instructions**

The name is followed by instructions to execute the task

***

### Other Params

#### become

used to escalate privleges to specific user to execute tasks. become\_user parameter is required to specify the user. `remote_user` is another way to escalate privleges

#### vars

used to define variables to be used later on in playbook

#### notfiy

used to refer handlers

#### gather\_facts

used to gather files or keys which can be used in different playbook

***

### Sample Playbook 1

```yaml
- name: install apache, php & mysql
  hosts: test-servers
  become: true
  become_user: root
  gather_facts: true
  tasks:
  - name: "Install Apache2"
    #present is used since we are installing this package for first time
    package: name=apache2 state=present

  - name: "Install PHP Cli"
    package: name=php-cli state=present

  - name: "Install PHP Mysql"
    package: name=php-mysql state=present
```

***

### Sample Playbook 2

```yaml
- hosts: all
  remote_user: root

  tasks:
    - name: "Install PIP"
      apt: name=python-pip state=present

    - name: "Install Python MySQL module"
      pip: name=MySQL-python

    - name: "Create db user noman"
      mysql_user: user=noman password=aziz priv=*.*:ALL state=present

    - name: "Create db ansible"
      mysql_db: db=ansible state=present

    - name: "Create table reg"
      command: mysql -u noman -p aziz -e 'CREATE TABLE reg (name varchar(30), email varchar(30));' ansible

```

***

### Sample Playbook 3

```yaml
- name: copy
  hosts: test-servers
  become: true
  become_true: root
  gather_facts: true
  tasks:
    - name: "copy file"
      copy: src=/home/noman/index.html dest=/var/www/html/index.html
```

***

### Sample Playbook 4

In Ansible, handlers are typically used to start, reload, restart, and stop services

```yaml
- hosts: webservers
  tasks:
    - name: install apache2
	  apt: name=apache2 update_cache=yes latest=yes

	  notify:
	    - restart apache2

  handlers:
    - name: restart apache2
	  service: name=apache2 state=restarted
```

***
