前言
上篇介绍了 Ansible 单模块(AD-Hoc)的相关内容Ansible自动化运维Inventory与Ad-Hoc-CSDN博客,Ad-Hoc 命令是一次性的、即时执行的命令,用于在远程主机上执行特定任务,这些命令通常用于快速执行简单的任务。当需要在执行多个任务、配置复杂场景或需要可重复使用操作时,就需要用到任务剧本(Playbook)来定义复杂的任务流程和处理重复执行的操作。
目录
前言
一、YAML 非标记语言
1. 概述介绍
2. 功能联系
3. 语法格式
3.1 列表
3.2 字典
4. 编写剧本
二、Playbook 核心组件
1. host 组件
2. remote_user 组件
3. task列表和action组件
4. Handlers 组件
三、Role 组织结构
1. 概述
2. Role与Playbook
3. 角色结构
4. 变量
4.1 变量目录结构
4.2 编写变量
4.3 使用变量
4.4 变量覆盖
一、YAML 非标记语言
1. 概述介绍
YAML(YAML Ain't Markup Language) 是一种人类可读的数据序列化格式,常用于配置文件和数据传输。它以缩进、换行和符号结构来表示数据,具有简洁、清晰的特点。YAML 旨在成为一个易于阅读和编写的数据格式,同时也适合机器解析和生成。它使用空格缩进来表示层级关系,不需要显式的标记符号(如 XML 或 JSON 中的尖括号或大括号),这使得它更加直观和易读。
YAML 官方网站:The Official YAML Web Site
Ansible 官网:YAML Syntax — Ansible Documentation
2. 功能联系
① YAML 在 Ansible 中的作用是提供了一种直观、易读的方式来表示配置信息和数据结构,从而使得管理和维护基础设施的自动化过程更加高效和直观。
② Ansible 将 YAML 作为其主要的配置文件格式,因此使用 YAML 可以方便地定义主机、角色、任务和变量。这使得 Ansible Playbook 和其他配置文件变得直观且易于编写。
3. 语法格式
3.1 列表
在 YAML 中,列表使用短横线 - 表示,后面跟着一个空格。列表可以包含任意类型的元素,例如字符串、数字、布尔值或者其他嵌套的列表。
fruits:
- Apple
- Orange
- Strawberry
- Mango
在这个例子中,fruits 是一个包含四种水果的列表,每一种水果都是列表中的一个元素。
3.2 字典
字典在 YAML 中使用键值对的形式表示,使用冒号 : 将键和值分隔开,键值之间需要有一个空格。字典可以包含嵌套的字典或者列表作为值。
person:
name: John
age: 30
hobbies:
- Reading
- Hiking
address:
city: New York
zip: 10001
在这个例子中,person 是一个字典,包含了名字、年龄以及兴趣爱好和地址等信息。
在 Ansible Playbooks 中,列表和字典通常用来定义变量、任务、主机清单等信息。它们提供了一种直观且易读的方式来表示复杂的数据结构,使得编写和维护 Playbooks 更加方便和直观。
4. 编写剧本
批量安装apache
① 准备工作,卸载目标主机网站服务
管理节点:
[root@ansible ~]# ansible all -m yum -a "name=httpd state=removed"
#在Ansible中,all是一个用于指代所有主机的特殊关键字。当你在使用Ansible命令时,使用all会将命令应用到所有已定义的主机上。卸载httpd相关服务。
被管理节点:
[root@localhost ~]# yum list | grep httpd | grep @
httpd-tools.x86_64 2.4.6-99.el7.centos.1 @updates
#检查是否还有安装httpd相关包。
管理节点:
[root@ansible ~]# ansible all -m yum -a "name=httpd-tools state=removed"
#卸载httpd工具包,避免影响安装httpd。
管理节点:
[root@ansible ~]# yum install -y httpd
#Ansible服务器安装网站服务
[root@ansible ~]# mkdir apache
[root@ansible ~]# cd apache/
[root@ansible apache]# cp -rf /etc/httpd/conf/httpd.conf .
② 编写剧本
[root@ansible apache]# vim apache.yaml
- hosts: webserver #针对的剧本对象
tasks: #任务
- name: install apache packages #任务1:安装apache包(可以自定义)
yum: name=httpd state=present #调用yum安装模块:httpd,present,表示确保软件包已经安装
- name: copy apache conf #任务2:拷贝apache配置文件
copy: src=./httpd.conf dest=/etc/httpd/conf/httpd.conf #调用拷贝模块,源——>目标
- name: ensure apache is running #确保apache服务已运行
service: name=httpd state=started enabled=yes #调用系统服务状态模块
③ 检查测试
[root@ansible apache]# ansible-playbook apache.yaml --syntax-check #检验语法
playbook: apache.yaml
[root@ansible apache]# ansible-playbook apache.yaml --list-tasks #列出任务
playbook: apache.yaml
play #1 (webserver): webserver TAGS: []
tasks:
install apache packages TAGS: []
copy apache conf TAGS: []
ensure apache is running TAGS: []
[root@ansible apache]# ansible-playbook apache.yaml --list-hosts #列出主机
playbook: apache.yaml
play #1 (webserver): webserver TAGS: []
pattern: [u'webserver']
hosts (4):
host4
host3
host2
host1
④ 执行剧本
[root@ansible apache]# ansible-playbook apache.yaml
PLAY [webserver] ************************************************************************************************
TASK [Gathering Facts] ******************************************************************************************
ok: [host2]
ok: [host3]
ok: [host1]
ok: [host4]
TASK [install apache packages] **********************************************************************************
changed: [host2]
changed: [host1]
changed: [host4]
changed: [host3]
TASK [copy apache conf] *****************************************************************************************
ok: [host2]
ok: [host3]
ok: [host1]
ok: [host4]
TASK [ensure apache is running] *********************************************************************************
changed: [host2]
changed: [host1]
changed: [host4]
changed: [host3]
PLAY RECAP ******************************************************************************************************
host1 : ok=4 changed=2 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
host2 : ok=4 changed=2 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
host3 : ok=4 changed=2 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
host4 : ok=4 changed=2 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
二、Playbook 核心组件
Playbook 是 Ansible 中用于描述自动化部署、配置和管理任务的核心组件。一个 Playbook 包含了一系列的任务,这些任务将被 Ansible 执行以实现特定的配置或操作。
1. host 组件
playbook 中的每一个 play 的目的都是为了让特定主机以某个指定的用户身份执行任务。hosts 用 于指定要执行指定任务的主机,须事先定义在主机清单中。
示例:
- hosts: websrvs:appsrvs
2. remote_user 组件
可用于 Host 和task 中。也可以通过指定其通过 sudo 的方式在远程主机上执行任务,其可用于 play 全局或某任务;此外,甚至可以在sudo时使用 sudo_user 指定 sudo 时切换的用户。
示例:
- hosts: websrvs
remote_user: root
tasks:
- name: test connection
ping:
remote_user: wang
sudo: yes #默认sudo为root
sudo_user:wang #sudo为wang
3. task列表和action组件
play的主体部分是task list,task list中有一个或多个task,各个task 按次序逐个在hosts中指定的所有主机上执行,即在所有主机上完成第一个task后,再开始第二个task。task的目的是使用指定的参数执行模块,而在模块参数中可以使用变量。模块执行是幂等的,这意味着多次执行是安全的,因为其结果均一致每个task都应该有其name,用于playbook的执行结果输出,建议其内容能清晰地描述任务执行步骤。 如果未提供name,则action的结果将用于输出。
action: module arguments
#示例: action: shell wall hello
module: arguments
#示例: shell: wall hello
注意:shell和command模块后面跟命令,而非key=value
4. Handlers 组件
在 Playbook 中,Handlers 通常会在任务中触发,并在整个 Playbook 运行结束时才会执行。
示例:修改管理节点apace配置文件模板,拷贝到被管理节点,查看apache相关信息:
① 修改管理几点服务器apache监听端口号,执行剧本查看被代理节点服务器配置是否拷贝
[root@ansible ~]# yum install -y httpd
#Ansible服务器安装网站服务
[root@ansible ~]# mkdir apache
[root@ansible ~]# cd apache/
[root@ansible apache]# cp -rf /etc/httpd/conf/httpd.conf .
[root@ansible apache]# sed -i 's/Listen 80/Listen 8080/' httpd.conf
② 查看被代理节点apache配置文件已及更新,但是并没有生效
③ 由于剧本服务模块指令是启动,需要定义、引用处理程序
注意:如果将 state=started 改为 restart ,将会导致每次执行剧本都会重启 apache 服务。
[root@ansible apache]# vim apache.yaml
- hosts: webserver #定义了将要执行任务的目标主机或主机组
tasks:
- name: install apache packages #对Playbook的描述,用于标识该Playbook的作用。
yum: name=httpd state=present
- name: copy apache conf
copy: src=./httpd.conf dest=/etc/httpd/conf/httpd.conf
notify: restart apache service #通知,当copy模块产生改变,通知程序重启,需要与handlers的name一样 #应用处理程序
- name: ensure apache is running
service: name=httpd state=started enabled=yes
handlers: #当任务触发会执行 #定义处理程序
- name: restart apache service #任务,重启apache(名字自定义)
service: name=httpd state=restarted
④ 再次修改管理节点 apachep 配置文件端口号,执行剧本,查看被代理节点 apache 端口信息
三、Role 角色组织结构
1. 概述
Role 是一种可重用的组织结构,用于将相关的变量、任务和处理逻辑打包在一起。它是对任务和变量的封装,可以方便地在不同的 Playbooks 中重复使用。
2. Role与Playbook
Playbook 可以调用一个或多个 Role 来完成特定的配置任务。这种模块化的设计使得 Playbook 更加易读、易维护,并且能够促进代码的重用。通过将任务和变量封装到 Role 中,可以有效地减少重复编写相似任务的工作,并提高了整体的可维护性。
在 Playbook 中使用 Role 非常简单,只需要指定 Role 的名称即可:
- hosts: servers
roles:
- common
- webserver
- database
在这个示例中,common, webserver和 database 都是 Role 的名称,Ansible 将会按照指定的顺序执行这些 Role 中定义的任务。
3. 角色结构
在 Ansible 中,Role 是一种组织和封装任务、变量和处理逻辑的方式。通过 Role,可以将相关的配置任务和变量打包在一起,以便在不同的 Playbooks 中重复使用。以下是关于 Role 的介绍:
my_role/
├── tasks/ #包含了角色的主要任务。
│ └── main.yml
├── handlers/ #包含了角色中定义的处理器。
│ └── main.yml
├── templates/ #包含了角色中使用的模板文件
├── files/ #和静态文件。
├── vars/ #包含了角色中使用的变量。
│ └── main.yml
├── defaults/ #包含了角色中使用的变量。
│ └── main.yml
└── meta/ #包含了角色的元数据,比如作者信息、依赖关系等。
└── main.yml
4. 变量
在 Ansible Role 中,变量是一种重要的元素,用于定义和传递数据,以便在角色中的任务和模板中使用。以下是关于在 Ansible Role 中编写变量的介绍:
4.1 变量目录结构
my_role/
├── vars/
│ └── main.yml
4.2 编写变量
在 vars/main.yml 文件中,你可以定义角色中需要使用的各种变量。这些变量可以是全局的,也可以是与特定任务相关的局部变量。
# vars/main.yml
apache_port: 80
apache_document_root: /var/www/html
在这个示例中,apache_port 和 apache_document_root 是两个角色中使用的变量,它们定义了 Apache 服务的端口号和文档根目录。
4.3 使用变量
一旦定义了变量,你可以在角色的任务、模板或其他文件中引用这些变量。
# tasks/main.yml
- name: Ensure Apache is running
service:
name: apache2
state: started
vars:
port: "{{ apache_port }}"
{{ apache_port }} 表示引用之前定义的 apache_port 变量,用于配置 Apache 服务的端口号。
4.4 变量覆盖
值得注意的是,变量可以在多个级别进行定义和覆盖。在 Role 中,变量可以在 defaults/main.yml 中设置默认值,而在 Playbook 中也可以通过 vars 关键字来覆盖这些默认值。