文章目录
- Playbook
-
- [案例1 Playbook剧本基本用法](#案例1 Playbook剧本基本用法)
- [案例2 Playbook剧本定义、引用变量](#案例2 Playbook剧本定义、引用变量)
- 案例3.when条件判断
- 迭代
- [剧本Roles 模块](#剧本Roles 模块)
Playbook
- Tasks:任务是 Playbooks 的核心,它们是 Playbook 中的一项指令,告诉 Ansible 在远程主机上执行什么操作。每个任务都调用一个 Ansible 模块,并传递参数来执行特定的动作,例如安装软件包、复制文件、启动服务或设置文件权限。
- Variables:变量允许您在 Playbook 中创建可重用的值,这些值可以在多个任务中使用,从而使您的 Playbook 更加灵活和可维护。变量可以是从简单字符串到复杂数据结构的任何内容,它们可以在 Playbook 中直接定义,也可以从外部文件或命令行参数中加载。
- Templates:模板是带有变量替换功能的文本文件,通常用于生成配置文件。Ansible 使用 Jinja2 模板引擎来处理模板文件,允许您在模板中插入变量和表达式,这些将在 playbook 运行时被替换为实际值。
- Handlers:处理器是当特定条件满足时触发的任务。通常,当任务报告状态为 "changed" 时,会通知一个或多个处理器。这通常用于重启服务或触发系统级操作,只有当实际发生变化时才需要执行这些操作。
- Roles:角色是一种组织 Playbook 的方法,它将变量、任务、模板、文件和处理器组合在一起,以便在多个 Playbook 之间重用。角色可以根据不同的环境或不同的服务器类型来组织任务,使得大型项目更加模块化和易于管理。
这些组件共同构成了 Ansible Playbook 的结构,使得 Ansible 成为自动化 IT 操作和应用程序部署的强大工具。通过组合这些组件,您可以创建复杂的自动化工作流程,以部署和配置您的应用程序和基础设施。
案例1 Playbook剧本基本用法
bash
vim test1.yaml
在 YAML 格式中,缩进用于表示文档的结构和层次。YAML 文件中的缩进通常使用空格而不是制表符,并且每个层级的缩进应该是一致的。在 Ansible Playbook 中,通常每个缩进级别使用 2 个空格。
下面 playbook 示例中,- name: yum httpd
是一个 playbook 的开始,hosts: web1
、tasks:
和 handlers:
都是与 - name: yum httpd
同一层级的键。tasks:
和 handlers:
下的条目应该缩进 2 个空格,表示它们是 tasks
和 handlers
的子项。确保了每个层级都有正确的缩进:
perl
---
# Playbook 名称
- name: yum httpd
hosts: web1
tasks:
- name: Stop firewalld service # 停止 firewalld 服务
service:
name: firewalld
state: stopped
- name: sete***=0 # 设置 SELinux 为 permissive 模式
shell:
setenforce 0
- name: an_zhuang_httpd # 使用 yum 模块安装 httpd 包
yum:
name: httpd
- name: gei_httpd_pei_zi # 获取 httpd 配置文件
copy:
src: /opt/httpd.conf
dest: /etc/httpd/conf/httpd.conf
notify: "restart httpd" # 当任务完成时,通知重启 httpd 服务
- name: start httpd # 启动 httpd 服务
service:
name: httpd
state: started
enabled: true
handlers:
- name: restart httpd # 当任务完成时,重启 httpd 服务
service:
name: httpd
state: restarted
注我httpd的配置文件将端口号改为8080了
playbook命令
ansible-playbook test1.yaml --syntax-check 检查yaml文件的语法是否正确
ansible-playbook test1.yaml --list-task 检查tasks任务
ansible-playbook test1.yaml --list-hosts 检查生效的主机
ansible-playbook test1.yaml --start-at-task='install httpd' 指定从某个task开始运行
案例2 Playbook剧本定义、引用变量
perl
vars: #定义变量
格式 key: value
将案例1的httpd软件安装定义成变量的模式如下,将httpd改成了nginx
bash
---
---
# Playbook 名称
- name: yum httpd
hosts: web1
vars:
- sname: nginx # 定义一个变量 sname,其值为 nginx
tasks:
- name: Stop firewalld service # 停止 firewalld 服务
service:
name: firewalld
state: stopped
- name: sete***=0 # 设置 SELinux 为 permissive 模式
shell:
setenforce 0
- name: yum install epel-release # 安装 epel-release 包
yum:
name: epel-release
- name: an_zhuang_{{sname}} # 使用 yum 模块安装 {{sname}} 包
yum:
name: "{{sname}}"
# - name: gei_httpd_pei_zi
# copy:
# src: /opt/httpd.conf
# dest: /etc/httpd/conf/httpd.conf
notify: "restart {{sname}}" # 当任务完成时,通知重启 {{sname}} 服务
- name: start {{sname}} # 启动 {{sname}} 服务
service:
name: "{{sname}}"
state: started
enabled: true
handlers:
- name: restart {{sname}} # 当任务完成时,重启 {{sname}} 服务
service:
name: "{{sname}}"
state: restarted
案例3.when条件判断
使用when 可以让满足条件的主机执行命令,如下
perl
---
---
---
- name: Create test1 file on remote host
hosts: web1
tasks:
- name: Create test1 file
file:
path: /opt/test1
state: touch
when: ansible_default_ipv4.address == "192.168.20.10"
这会让IP地址为192.168.20.10地址的主机在opt目录下创建一个test1文件
192.168.20.10的主机上创建了一个test1文件
迭代
一种循环结构,类似于loop
Ansible 中的迭代结构是 with_items,它允许您遍历一个列表、字典或字符串,并在每个迭代中执行一个任务。这相当于 Python 中的 for 循环。
例如
perl
---
- name: 在opt目录上创建mydir目录,并且在mydir目录下创建myfile.txt文件
hosts: web1
tasks:
- name: 创建目录和文件
file:
path: "{{item.path}}"
state: "{{item.state}}"
with_items:
- { path: '/opt/mydir', state: 'directory' }
- { path: '/opt/mydir/myfile.txt', state: 'touch' }
剧本Roles 模块
在 Ansible 中,角色(roles)是一种用于组织 playbook 的方法,它允许您将任务的集合、变量、处理器(handlers)和文件等组织成独立的、可重用的组件。roles 非常适合于构建和配置服务,尤其是当您需要在不同主机上重复执行相同的配置时。
一个 role 通常包含以下目录结构:
roles/<role_name>/tasks
:包含主任务列表。roles/<role_name>/handlers
:包含处理程序,通常用于重启服务或执行其他操作。roles/<role_name>/vars
:包含角色级别的变量。roles/<role_name>/defaults
:包含角色的默认变量。roles/<role_name>/meta
:包含角色的依赖关系和其他元数据。roles/<role_name>/templates
:包含 Jinja2 模板文件。roles/<role_name>/files
:包含静态文件,如配置文件或脚本。roles/<role_name>/templates
:包含 Jinja2 模板文件。roles/<role_name>/tasks/main.yml
:主任务文件,通常会 include 其他任务文件。
下面我将使用Roles模块创建一个LAMP用于展示
bash
mkdir -p /opt/roles/httpd/{files,templates,tasks,handlers,vars,defaults,meta}
mkdir -p /opt/roles/mysql/{files,templates,tasks,handlers,vars,defaults,meta}
mkdir -p /opt/roles/php/{files,templates,tasks,handlers,vars,defaults,meta}
编写httpd模块
bash
vim /opt/roles/httpd/tasks/main.yml
perl
---
- name: install apache
yum:
name: "{{fw}}"
- name: start apache
service:
name: "{{fwkg}}"
enabled: true
state: started
bash
vim /opt/roles/httpd/vars/main.yml
perl
fw: httpd
fwkg: httpd
编写mysql模块
bash
vim /opt/roles/mysql/tasks/main.yml
bash
- name: "安装拓展源"
yum:
name: epel-release
- name: "安装Mysql数据库"
yum:
name: "{{fw}}"
- name: "启动数据库"
service:
name: "{{fwgl}}"
state: started
enabled: true
bash
vim /opt/roles/mysql/vars/main.yml
perl
fw:
- mariadb
- mariadb-server
fwgl: mariadb
编写php模块
bash
vim /opt/roles/php/tasks/main.yml
perl
- name: 安装PHP
yum:
name: "{{fw}}"
- name: 启动PHP
service:
name: "{{fwgl}}"
state: started
enabled: true
bash
vim /opt/roles/php/vars/main.yml
perl
fw: php
wfgl: php
编写roles
bash
vim /opt/site.yml
perl
---
- hosts: web1
roles:
- httpd
- mysql
- php
启动剧本
bash
ansible-playbook site.yml