mirror of
https://github.com/LCTT/TranslateProject.git
synced 2024-12-29 21:41:00 +08:00
06071a54cf
sources/tech/20200129 Ansible Playbooks Quick Start Guide with Examples.md
350 lines
13 KiB
Markdown
350 lines
13 KiB
Markdown
[#]: collector: (lujun9972)
|
||
[#]: translator: ( )
|
||
[#]: reviewer: ( )
|
||
[#]: publisher: ( )
|
||
[#]: url: ( )
|
||
[#]: subject: (Ansible Playbooks Quick Start Guide with Examples)
|
||
[#]: via: (https://www.2daygeek.com/ansible-playbooks-quick-start-guide-with-examples/)
|
||
[#]: author: (Magesh Maruthamuthu https://www.2daygeek.com/author/magesh/)
|
||
|
||
Ansible Playbooks Quick Start Guide with Examples
|
||
======
|
||
|
||
We have already written two articles about Ansible, this is the third article.
|
||
|
||
If you are new to Ansible, I advise you to read the two topics below, which will teach you the basics of Ansible and what it is.
|
||
|
||
* **Part-1: [How to Install and Configure Ansible on Linux][1]**
|
||
* **Part-2: [Ansible ad-hoc Command Quick Start Guide][2]**
|
||
|
||
|
||
|
||
If you have finished them, you will feel the continuity as you read this article.
|
||
|
||
### What is the Ansible Playbook?
|
||
|
||
Playbooks are much more powerful and completely different way than ad-hoc command mode.
|
||
|
||
It uses the **“/usr/bin/ansible-playbook”** binary. It provides rich features to make complex task easier.
|
||
|
||
Playbooks are very useful if you want to run a task often.
|
||
|
||
Also, this is useful if you want to perform multiple tasks at the same time on the group of server.
|
||
|
||
Playbooks are written in YAML language. YAML stands for Ain’t Markup Language, which is easier for humans to read and write than other common data formats such as XML or JSON.
|
||
|
||
The Ansible Playbook Flow Chart below will tell you its detailed structure.
|
||
|
||
![][3]
|
||
|
||
### Understanding the Ansible Playbooks Terminology
|
||
|
||
* **Control Node:** The machine where Ansible is installed. It is responsible for managing client nodes.
|
||
* **Managed Nodes:** List of hosts managed by the control node
|
||
* **Playbook:** A Playbook file contains a set of procedures used to automate a task.
|
||
* **Inventory:** The inventory file contains information about the servers you manage.
|
||
* **Task:** Each play has multiple tasks, tasks that are executed one by one against a given machine (it a host or multiple host or a group of host).
|
||
* **Module:** Modules are a unit of code that is used to gather information from the client node.
|
||
* **Role:** Roles are ways to automatically load some vars_files, tasks, and handlers based on known file structure.
|
||
* **Play:** Each playbook has multiple plays, and a play is the implementation of a particular automation from beginning to end.
|
||
* **Handlers:** This helps you reduce any service restart in a play. Lists of handler tasks are not really different from regular tasks, and changes are notified by notifiers. If the handler does not receive any notification, it will not work.
|
||
|
||
|
||
|
||
### How Does the Basic Playbook looks Like?
|
||
|
||
Here’s how the basic playbook looks.
|
||
|
||
```
|
||
--- [YAML file should begin with a three dash]
|
||
- name: [Description about a script]
|
||
hosts: group [Add a host or host group]
|
||
become: true [It requires if you want to run a task as a root user]
|
||
tasks: [What action do you want to perform under task]
|
||
- name: [Enter the module options]
|
||
module: [Enter a module, which you want to perform]
|
||
module_options-1: value [Enter the module options]
|
||
module_options-2: value
|
||
.
|
||
module_options-N: value
|
||
```
|
||
|
||
### How to Understand Ansible Output
|
||
|
||
The Ansible Playbook output comes with 4 colors, see below for color definitions.
|
||
|
||
* **Green:** **ok –** If that is correct, the associated task data already exists and configured as needed.
|
||
* **Yellow: changed –** Specific data has updated or modified according to the needs of the tasks.
|
||
* **Red: FAILED –** If there is any problem while doing a task, it returns a failure message, it may be anything and you need to fix it accordingly.
|
||
* **White:** It comes with multiple parameters
|
||
|
||
|
||
|
||
To do so, create a playbook directory to keep them all in one place.
|
||
|
||
```
|
||
$ sudo mkdir /etc/ansible/playbooks
|
||
```
|
||
|
||
### Playbook-1: Ansible Playbook to Install Apache Web Server on RHEL Based Systems
|
||
|
||
This sample playbook allows you to install the Apache web server on a given target node.
|
||
|
||
```
|
||
$ sudo nano /etc/ansible/playbooks/apache.yml
|
||
|
||
---
|
||
- hosts: web
|
||
become: yes
|
||
name: "Install and Configure Apache Web server"
|
||
tasks:
|
||
- name: "Install Apache Web Server"
|
||
yum:
|
||
name: httpd
|
||
state: latest
|
||
- name: "Ensure Apache Web Server is Running"
|
||
service:
|
||
name: httpd
|
||
state: started
|
||
```
|
||
|
||
```
|
||
$ ansible-playbook apache1.yml
|
||
```
|
||
|
||
![][3]
|
||
|
||
### How to Understand Playbook Execution in Ansible
|
||
|
||
To check the syntax error, run the following command. If it finds no error, it only shows the given file name. If it detects any error, you will get an error as follows, but the contents may differ based on your input file.
|
||
|
||
```
|
||
$ ansible-playbook apache1.yml --syntax-check
|
||
|
||
ERROR! Syntax Error while loading YAML.
|
||
found a tab character that violate indentation
|
||
The error appears to be in '/etc/ansible/playbooks/apache1.yml': line 10, column 1, but may
|
||
be elsewhere in the file depending on the exact syntax problem.
|
||
The offending line appears to be:
|
||
state: latest
|
||
^ here
|
||
There appears to be a tab character at the start of the line.
|
||
|
||
YAML does not use tabs for formatting. Tabs should be replaced with spaces.
|
||
For example:
|
||
- name: update tooling
|
||
vars:
|
||
version: 1.2.3
|
||
# ^--- there is a tab there.
|
||
Should be written as:
|
||
- name: update tooling
|
||
vars:
|
||
version: 1.2.3
|
||
# ^--- all spaces here.
|
||
```
|
||
|
||
Alternatively, you can check your ansible-playbook content from online using the following url @ [YAML Lint][4]
|
||
|
||
Run the following command to perform a **“Dry Run”**. When you run a ansible-playbook with the **“–check”** option, it does not make any changes to the remote machine. Instead, it will tell you what changes they have made rather than create them.
|
||
|
||
```
|
||
$ ansible-playbook apache.yml --check
|
||
|
||
PLAY [Install and Configure Apache Webserver] ********************************************************************
|
||
|
||
TASK [Gathering Facts] *******************************************************************************************
|
||
ok: [node2.2g.lab]
|
||
ok: [node1.2g.lab]
|
||
|
||
TASK [Install Apache Web Server] *********************************************************************************
|
||
changed: [node2.2g.lab]
|
||
changed: [node1.2g.lab]
|
||
|
||
TASK [Ensure Apache Web Server is Running] ***********************************************************************
|
||
changed: [node1.2g.lab]
|
||
changed: [node2.2g.lab]
|
||
|
||
PLAY RECAP *******************************************************************************************************
|
||
node1.2g.lab : ok=3 changed=2 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
|
||
node2.2g.lab : ok=3 changed=2 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
|
||
```
|
||
|
||
If you want detailed information about your ansible playbook implementation, use the **“-vv”** verbose option. It shows what it really does to gather this information.
|
||
|
||
```
|
||
$ ansible-playbook apache.yml --check -vv
|
||
|
||
ansible-playbook 2.9.2
|
||
config file = /etc/ansible/ansible.cfg
|
||
configured module search path = ['/home/daygeek/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
|
||
ansible python module location = /usr/lib/python3.8/site-packages/ansible
|
||
executable location = /usr/bin/ansible-playbook
|
||
python version = 3.8.1 (default, Jan 8 2020, 23:09:20) [GCC 9.2.0]
|
||
Using /etc/ansible/ansible.cfg as config file
|
||
|
||
PLAYBOOK: apache.yml *****************************************************************************************************
|
||
1 plays in apache.yml
|
||
|
||
PLAY [Install and Configure Apache Webserver] ****************************************************************************
|
||
|
||
TASK [Gathering Facts] ***************************************************************************************************
|
||
task path: /etc/ansible/playbooks/apache.yml:2
|
||
ok: [node2.2g.lab]
|
||
ok: [node1.2g.lab]
|
||
META: ran handlers
|
||
|
||
TASK [Install Apache Web Server] *****************************************************************************************
|
||
task path: /etc/ansible/playbooks/apache.yml:6
|
||
changed: [node2.2g.lab] => {"changed": true, "msg": "Check mode: No changes made, but would have if not in check mod
|
||
e", "rc": 0, "results": ["Installed: httpd"]}
|
||
changed: [node1.2g.lab] => {"changed": true, "changes": {"installed": ["httpd"], "updated": []}, "msg": "", "obsolet
|
||
es": {"urw-fonts": {"dist": "noarch", "repo": "@anaconda", "version": "2.4-16.el7"}}, "rc": 0, "results": []}
|
||
|
||
TASK [Ensure Apache Web Server is Running] *******************************************************************************
|
||
task path: /etc/ansible/playbooks/apache.yml:10
|
||
changed: [node1.2g.lab] => {"changed": true, "msg": "Service httpd not found on host, assuming it will exist on full run"}
|
||
changed: [node2.2g.lab] => {"changed": true, "msg": "Service httpd not found on host, assuming it will exist on full run"}
|
||
META: ran handlers
|
||
META: ran handlers
|
||
|
||
PLAY RECAP ***************************************************************************************************************
|
||
node1.2g.lab : ok=3 changed=2 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
|
||
node2.2g.lab : ok=3 changed=2 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
|
||
```
|
||
|
||
### Playbook-2: Ansible Playbook to Install Apache Web Server on Ubuntu Based Systems
|
||
|
||
This sample playbook allows you to install the Apache web server on a given target node.
|
||
|
||
```
|
||
$ sudo nano /etc/ansible/playbooks/apache-ubuntu.yml
|
||
|
||
---
|
||
- hosts: web
|
||
become: yes
|
||
name: "Install and Configure Apache Web Server"
|
||
tasks:
|
||
- name: "Install Apache Web Server"
|
||
yum:
|
||
name: apache2
|
||
state: latest
|
||
|
||
- name: "Start the Apache Web Server"
|
||
service:
|
||
name: apaceh2
|
||
state: started
|
||
|
||
- name: "Enable mod_rewrite module"
|
||
apache2_module:
|
||
name: rewrite
|
||
state: present
|
||
|
||
notify:
|
||
- start apache
|
||
|
||
handlers:
|
||
- name: "Ensure Apache Web Server is Running"
|
||
service:
|
||
name: apache2
|
||
state: restarted
|
||
enabled: yes
|
||
```
|
||
|
||
### Playbook-3: Ansible Playbook to Install a List of Packages on Red Hat Based Systems
|
||
|
||
This sample playbook allows you to install a list of packages on a given target node.
|
||
|
||
**Method-1:**
|
||
|
||
```
|
||
$ sudo nano /etc/ansible/playbooks/packages-redhat.yml
|
||
|
||
---
|
||
- hosts: web
|
||
become: yes
|
||
name: "Install a List of Packages on Red Hat Based System"
|
||
tasks:
|
||
- name: "Installing a list of packages"
|
||
yum:
|
||
name:
|
||
- curl
|
||
- httpd
|
||
- nano
|
||
- htop
|
||
```
|
||
|
||
**Method-2:**
|
||
|
||
```
|
||
$ sudo nano /etc/ansible/playbooks/packages-redhat-1.yml
|
||
|
||
---
|
||
- hosts: web
|
||
become: yes
|
||
name: "Install a List of Packages on Red Hat Based System"
|
||
tasks:
|
||
- name: "Installing a list of packages"
|
||
yum: name={{ item }} state=latest
|
||
with_items:
|
||
- curl
|
||
- httpd
|
||
- nano
|
||
- htop
|
||
```
|
||
|
||
**Method-3: Using Array Variable**
|
||
|
||
```
|
||
$ sudo nano /etc/ansible/playbooks/packages-redhat-2.yml
|
||
|
||
---
|
||
- hosts: web
|
||
become: yes
|
||
name: "Install a List of Packages on Red Hat Based System"
|
||
vars:
|
||
packages: [ 'curl', 'git', 'htop' ]
|
||
tasks:
|
||
- name: Install a list of packages
|
||
yum: name={{ item }} state=latest
|
||
with_items: "{{ packages }}"
|
||
```
|
||
|
||
### Playbook-4: Ansible Playbook to Install Updates on Linux Systems
|
||
|
||
This sample playbook allows you to install updates on your Linux systems, running Red Hat and Debian-based client nodes.
|
||
|
||
```
|
||
$ sudo nano /etc/ansible/playbooks/security-update.yml
|
||
|
||
---
|
||
- hosts: web
|
||
become: yes
|
||
name: "Install Security Update"
|
||
tasks:
|
||
- name: "Installing Security Update on Red Hat Based System"
|
||
yum: name=* update_cache=yes security=yes state=latest
|
||
when: ansible_facts['distribution'] == "CentOS"
|
||
|
||
- name: "Installing Security Update on Ubuntu Based System"
|
||
apt: upgrade=dist update_cache=yes
|
||
when: ansible_facts['distribution'] == "Ubuntu"
|
||
```
|
||
|
||
--------------------------------------------------------------------------------
|
||
|
||
via: https://www.2daygeek.com/ansible-playbooks-quick-start-guide-with-examples/
|
||
|
||
作者:[Magesh Maruthamuthu][a]
|
||
选题:[lujun9972][b]
|
||
译者:[译者ID](https://github.com/译者ID)
|
||
校对:[校对者ID](https://github.com/校对者ID)
|
||
|
||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||
|
||
[a]: https://www.2daygeek.com/author/magesh/
|
||
[b]: https://github.com/lujun9972
|
||
[1]: https://www.2daygeek.com/install-configure-ansible-automation-tool-linux-quick-start-guide/
|
||
[2]: https://www.2daygeek.com/ansible-ad-hoc-command-quick-start-guide-with-examples/
|
||
[3]: data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7
|
||
[4]: http://www.yamllint.com/
|