Ansible-role角色
将剧本功能进行拆分成不同组件;
每个组件只完成一项简单任务;
复杂任务通过组合多个组件来实现;
优点:灵活、低耦合(关联性低)、高复用;
缺点:编写的复杂性高,对技术要求高;
创建roles的目录结构
files:用来存放由copy模块或script模块调用的文件。
tasks:至少有一个main.yml文件,定义各tasks。
handlers:有一个main.yml文件,定义各handlers。
templates:用来存放jinjia2模板。
vars:有一个main.yml文件,定义变量。
meta:有一个main.yml文件,定义此角色的特殊设定及其依赖关系。
这个案例的目标是:在远程服务器上创建一个特定的目录并复制一个静态文件到该目录下。
通过这个案例,你将学会如何组织 Role 的目录结构,以及如何在 Playbook 中引用它。
目标
- 在所有目标服务器上创建
/data/web
目录。 - 从控制机复制一个
index.html
文件到远程服务器的/data/web/
目录下。
步骤 1: 创建 Role 的目录结构
Ansible Role 有一个严格的目录结构。首先,我们需要在你的工作目录下创建这个结构。
- 首先,创建一个存放你所有 Roles 的目录,通常命名为
roles
。 - 然后,在
roles
目录下,为你的新 Role 创建一个目录,我们给它取名web_content
。 - 在
web_content
目录下,创建tasks
和files
两个子目录。
执行以下命令来创建这个结构:
# 在你的工作目录下(例如 /root/ansible-project)
mkdir -p roles/web_content/tasks
mkdir -p roles/web_content/files
创建完成后,你的目录结构应该如下所示:
ansible-project/
└── roles/└── web_content/├── files/ # 存放需要复制到远程的静态文件└── tasks/ # 存放 Role 的主要任务
步骤 2: 编写 Role 的任务 (tasks)
任务是 Role 的核心。我们将在 tasks/main.yml
文件中定义要执行的操作。
创建并编辑 roles/web_content/tasks/main.yml
文件:
vim roles/web_content/tasks/main.yml
将以下内容粘贴到文件中:
# roles/web_content/tasks/main.yml# 任务1: 创建 /data/web 目录
- name: 创建网站根目录ansible.builtin.file:path: /data/webstate: directorymode: '0755'owner: rootgroup: root# 任务2: 复制 index.html 文件到远程服务器
- name: 复制主页文件到服务器ansible.builtin.copy:src: index.htmldest: /data/web/index.htmlmode: '0644'
解释:
name
: 任务的描述,执行时会显示。ansible.builtin.file
: 使用file
模块来确保一个目录存在。ansible.builtin.copy
: 使用copy
模块来复制文件。注意src: index.html
这里的路径是相对路径,Ansible 会自动在roles/web_content/files/
目录下寻找index.html
。
步骤 3: 准备要复制的文件 (files)
现在,我们需要创建那个要被复制的 index.html
文件。
在 roles/web_content/files/
目录下创建 index.html
文件:
vim roles/web_content/files/index.html
在文件中写入一些简单的内容:
<!DOCTYPE html>
<html>
<head><title>My Ansible Role Page</title>
</head>
<body><h1>Hello from Ansible Role!</h1><p>This page was deployed using an Ansible Role.</p>
</body>
</html>
步骤 4: 创建主 Playbook 来调用 Role
最后,我们需要一个主 Playbook 文件来告诉 Ansible 要在哪些主机上执行这个 web_content
Role。
在你的项目根目录 (ansible-project/
) 下创建一个 Playbook 文件,例如 deploy.yml
:
vim deploy.yml
将以下内容粘贴到文件中:
# deploy.yml- name: 部署静态网站内容hosts: group1 # 你的目标主机组,请根据你的 inventory 文件修改remote_user: root # 执行任务的用户roles:- role: web_content # 引用我们刚刚创建的 web_content Role
解释:
hosts: group1
: 指定在group1
组中的所有服务器上执行。roles:
: 这是一个关键字,用于列出要执行的 Role。- role: web_content
: 告诉 Ansible 执行名为web_content
的 Role。Ansible 会自动在roles/
目录下寻找这个 Role。
步骤 5: 运行 Playbook
现在,所有部分都已准备就绪。在你的项目根目录 (ansible-project/
) 下,运行主 Playbook。
ansible-playbook deploy.yml
如果一切顺利,你将看到类似以下的输出,显示任务在所有节点上都成功执行了。
PLAY [部署静态网站内容] ************************************************************TASK [Gathering Facts] *********************************************************
ok: [node1]
ok: [node2]
ok: [node3]TASK [web_content : 创建网站根目录] *************************************************
changed: [node1]
changed: [node2]
changed: [node3]TASK [web_content : 复制主页文件到服务器] *********************************************
changed: [node1]
changed: [node2]
changed: [node3]PLAY RECAP *********************************************************************
node1 : ok=3 changed=2 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
node2 : ok=3 changed=2 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
node3 : ok=3 changed=2 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
验证
你可以登录到任意一个目标节点(如 node1
),检查文件是否已成功创建。
# 登录 node1
ssh root@node1# 检查目录是否存在
ls -ld /data/web# 检查文件内容是否正确
cat /data/web/index.html
你将看到 /data/web
目录和其中的 index.html
文件,内容正是你在控制机上编写的。
这个简单的案例完整地展示了 Ansible Role 的创建和使用流程。当你的自动化任务变得复杂时,使用 Role 可以让你的代码结构更清晰、更易于复用和维护。
剧本配yum源或apt源
剧本修改IP地址与主机名
剧本实现系统优化:设置时区、时间同步、更新软件、关闭防火墙、SELinux
剧本安装单机LNMP、LNMT
剧本安装集群:MySQL主从、redis哨兵