环境版本说明
- RedHat9 [Red Hat Enterprise Linux release 9.0]
- Ansible [core 2.13.3]
- Python [3.9.10]
- jinja [3.1.2]
1. Playbook简介
- play是针对清单中选定的主机运行的一组有序任务
- Playbook是一个文本文件,其中包含由一个或多个按特定顺序运行的play组成的列表
- 临时命令可以作为一次性命令对一组主机运行一项简单的任务
- Playbook可以通过轻松重复的方式对一组目标主机执行多项复杂的任务
2. Playbook-yaml语法
- playbook是使用YAML语法编写的文本文件,后缀名为
[.yml]
- 严格缩进和空格
- YAML文件以
---
开头,以...
结束(结束可以省略不写) - 使用
-
(减号加一个或多个空格)作为列表项 - 注释符为:
#
调整Tab键缩进
- 永久调整缩进:vim ~/.vimrc --> set tabstop=2
- 当前调整缩进:set tabstop=2
整体缩进(视图模式)
- 按
Ctrl+v
进入视图模式 - 通过
j
选择行,或者G
直接选中剩余所有行 - 按
I
进入编辑模式 - 在调整完后,按
Esc
键应用
yaml示例
--- # yaml语法:开头
- name: install httpd # paly任务的描述:描述部分可选
hosts: node1 # 指定目标主机
tasks: # 任务列表,下面为任务模块
- name: Install Apache # 任务模块,与tasks有两个字符缩进
ansible.builtin.yumL # 模块名
name: httpd # 模块参数、模块选项
state: latest # 模块参数、模块选项
... # yaml语法:结尾(可省略)
3. 查找用于任务的模块
使用Ansible进行部署任务时,可针对管理员任务需求,选择对应功能模块,通过以下方法可以查询模块帮助,以便编写临时命令及playbook。
查询命令
# RHEL8以前的版本查询方式
ansible-doc -l
# RHEL9版本查询方式
ansible-navigator collections
ansible-navigator doc ansible.posix.firewalld -m stdout
示例:查询YUM模块
ansible-doc -l | grep yum
4. 编写playbook
- 安装Apache软件包。
- 网站根目录为默认目录。
- index.html 内容使用 Welcome to 2023!
- 将Apache服务设置为开机自启,并调整防火墙规则
[Step1]:
分析题目
# 如果按照平时的配置步骤,分别为以下内容
dnf install -y httpd
echo Welcome to 2023! > /var/www/html/index.html
systemctl enable --now httpd.service
firewalld-cmd --add-service=http --permanent
firewalld-cmd --reload
[Step2]:
进入工作目录,创建yml文件
cd /home/student/ansible
vim web.yml
[Step3]:
在yml文件中写入下列内容
---
- name: Install Apache Service
hosts: servera,serverb
tasks:
[Step4]:
查找有关YUM的模板,进入后搜索EXAMPLE
ansible-doc yum
[Step5]:
将YUM模板示例内容复制到yml文件中
- name: Install Apache
ansible.builtin.yum:
name: httpd # 安装的服务名
state: latest # 版本信息:latest最新的
[Step6]:
查找有关文本复制的模板,进入后搜索EXAMPLE
ansible-navigator doc copy -m stdout
[Step7]:
将copy模板内容复制到yml文件中
- name: Build index.html
ansible.builtin.copy:
content: 'Welcome to 2023!' # 文本
dest: /var/www/html/index.html # 重定向到该文件中
[Step8]:
查找有关服务启停的模板,进入后搜索EXAMPLE
ansible-navigator doc service -m
[Step9]:
将service模板内容复制到yml文件中
- name: Start service http
ansible.builtin.service:
name: httpd
state: started
enabled: yes
[Step10]:
查找有关防火墙的模板,进入后搜索EXAMPLE
- name: permit traffic in default zone for http service
ansible.posix.firewalld:
service: http # 指定服务
permanent: yes # 等同于 --permanent
immediate: yes # 等同于 firewalld-cmd --reload
state: enabled # 等同于 add-service
[Step11]:
将service模板内容复制到yml文件中
- name: permit traffic in default zone for http service
ansible.posix.firewalld:
service: http
permanent: yes
immediate: yes
state: enabled
[Step12]:
调整格式后的yml文件如下
---
- name: Install Apache Service.
hosts: servera,serverb
tasks:
- name: Install Apache
ansible.builtin.yum:
name: httpd
state: latest
- name: Build index.html
ansible.builtin.copy:
content: 'Welcome to 2023!'
dest: /var/www/html/index.html
- name: Start service http
ansible.builtin.service:
name: httpd
state: started
enabled: yes
- name: permit traffic in default zone for http service
ansible.posix.firewalld:
service: http
permanent: yes
immediate: yes
state: enabled
[Step13]:
验证playbook语法
ansible-navigator run web.yml -m stdout --syntax-check
5. 执行playbook
[Step1]:
执行playbook,在控制台中输出
ansible-navigator run web.yml -m stdout
[Step2]:
再次执行,查看执行效果
ansible-navigator run web.yml -m stdout
6. 包含多play的playbook
编写包含多个play的playbook非常简单。playbook中的各个play编写为playbook中的顶级列表项。
简单的多play示例:给servera和serverb分别安装不同的软件
[Step1]:
编辑palybook,文件名为more.yml
---
- name: for servera
hosts: servera
tasks:
- name: Install Samba
ansible.builtin.yum:
name: samba
state: latest
- name: for serverb
hosts: serverb
tasks:
- name: Install FTP
ansible.builtin.yum:
name: vsftpd
state: latest
[Step2]:
运行more.yml
ansible-navigator run more.yml -m stdout
7. 综合练习
案例需求
- 创建一个名为
inventory
的主机清单 - 创建主机组
dev
,包含servera - 创建主机组
test
,包含serverb - 创建主机组
prod
,包含serverc、serverd - 创建一个名为
/home/student/ansible/packages.yml
的palybook - 将 php 和 mariadb 软件包安装到
dev、test、prod
主机组中 - 将
RPM Development Tools
软件包组 安装到dev
主机组中的主机上 - 将
dev
主机组中的主机上的所有软件包更新为最新版本
[Step1]:
安装ansible
dnf install -y ansible-navigator ansible-core
[Step2]:
远程登录workstation,新建并进入工作目录ansible
ssh student@workstation
mkdir ~/ansible
cd ~/ansible
[Step3]:
新建清单文件inventory
vim inventory
[dev]
servera
[test]
serverb
[prod]
serverc
serverd
[Step4]:
生成Ansible配置文件
ansible-config init --disabled > ansible.cfg
vim ansible.cfg
# 写入下列内容
[defaults]
become_password_file=password.txt # 指定提权密码存储在password文件中
host_key_checking=False
inventory=/home/student/ansible/inventory
[privilege_escalation]
become=True
[Step5]:
编写提权密码文件password.txt
echo student > password.txt
[Step6]:
检索软件包组
dnf group list | grep RPM
[Step7]:
编写playbook
vim packages.yml
# 写入下列内容
---
- name: play1
hosts: dev,test,prod
tasks:
- name: Install php and mariadb # 安装php和mariadb
ansible.builtin.yum:
name:
- mariadb
- php
state: latest
- name: play2
hosts: dev
tasks:
- name: Install the 'RPM Development tools' package group
ansible.builtin.yum: # 安装软件包组
name: "@RPM Development Tools"
state: present
- name: Upgrade all packages
ansible.builtin.yum: # 更新所有软件包
name: '*'
state: latest
[Step8]:
验证palybook语法
ansible-navigator run packages.yml -m stdout --syntax-check
[Step9]:
空运行,使Ansible报告在执行palybook时会发生什么更改,但不会对客户机发生更改
ansible-navigator run packages.yml --check -m stdout
[Step10]:
运行playbook
ansible-navigator run packages.yml -m stdout
[Step11]:
验证:查看dev,test,prod主机组的php、mariadb软件安装情况
ansible all -m shell -a 'rpm -q php; rpm -q mariadb'
- ansible all:执行对象为清单文件中的所有主机
- -m shell:使用shell模块
- -a:执行的命令
[Step12]:
验证:查看dev,test,prod主机组的软件包组安装情况
ansible all -m shell -a 'dnf grouplist "RPM Development Tools"'
8、常用模块
查看当前环境下中可用的模块列表
ansible-navigator doc -l
文件类别
模块 | 解释 |
---|---|
ansible.builtin.copy | 将本地文件复制到受管主机 |
ansible.builtin.file | 设置文件权限和其他属性 |
ansible.builtin.lineinfile | 确保特定行是否在文件中 |
ansible.posix.synchronize | 使用rsync同步内容 |
软件类型
模块 | 解释 |
---|---|
ansible.builtin.package | 使用操作系统自带的包管理器管理软件包 |
ansible.builtin.dnf | 使用DNF软件包管理器管理软件包 |
ansible.builtin.apt | 使用APT软件包管理器管理软件包 |
ansible.builtin.pip | 从PyPI管理Python软件包 |
系统类别
模块 | 解释 |
---|---|
ansible.posix.firewalld | 使用Firewalld管理任意端口和服务 |
ansible.builtin.reboot | 重启计算机 |
ansible.builtin.service | 管理服务 |
ansible.builtin.user | 添加、删除和管理用户账户 |
网络工具
模块 | 解释 |
---|---|
ansible.builtin.get_url | 通过HTTP、HTTPS、FTP下载文件 |
ansible.builtin.uri | 与Web服务交互 |