1. 在Ansible项目中,如何拆分Playbook,主Playbook如何导入其他Playbook
1.拆分playbook
在Ansible项目中,我们可以按功能的不同拆分出不同的playbook。
例如:
- db.yml (和数据库有关的)
- build.yml(和构建包相关的)
- nginx.yml (和nginx相关的)
这么做有几个好处:
- 模块化:把总的部署拆分成几个小的,可以重用的playbook
- 提高重用性
- 提高可维护性
- 使每个playbook负责特定的任务
2. 引入playbook
主的playbook(~~ oh god please give me a playbook ~~)通过import_playbook 模块导入其他的playbook。
假设ansible项目下的playbook/有main.yaml,db.yaml,nginx.yaml这三个文件,我们现在想只搭建数据库,只需要在main.yaml里引入db.yaml即可。
---
- name: 主Playbook
hosts: all
tasks:
- name: 导入其他Playbook
import_playbook: db.yaml
2. 在Ansible项目中,在哪个目录中定义主机节点
主机节点通常在 inventory (主机清单)目录中定义。
文件格式大概就是:
[web_servers]
server1.example.com
server2.example.com
[db_servers]
db1.example.com
db2.example.com
这里按功能进行了分类
3. 在Ansible项目中,如何创建角色及相关目录,命令是什么
Ansible提供了 ansible-galaxy 命令来创建角色及其相关目录结构。
创建角色的命令:ansible-galaxy init role_name。
步骤:
- 跳转到
roles/文件夹下 - 使用命令
ansible-galaxy init nginx
这样,命令就会在 roles/ 目录下创建一个名为 nginx 的文件夹,并在其中生成标准的角色目录结构。
roles/
└── nginx
├── defaults
│ └── main.yml # 角色的默认变量
├── files
│ └── # 存放由任务调用的静态文件
├── handlers
│ └── main.yml # 角色的处理程序(通常用于服务重启等)
├── meta
│ └── main.yml # 角色的元数据,如依赖关系
├── tasks
│ └── main.yml # 角色的主任务列表,可以包含对其他任务的导入
├── templates
│ └── # 存放Jinja2模板文件
├── tests
│ ├── inventory # 测试用的主机清单文件
│ └── test.yml # 测试这个角色的Playbook示例
└── vars
└── main.yml # 角色的变量(通常用于不希望被轻易覆盖的变量)
4. Playbook中如何指定执行角色及执行节点
在Playbook中
- 可以使用
roles关键字来指定要执行的角色 - 并使用
hosts关键字来指定执行节点。
举个例子:
---
- name: 部署Web应用
hosts: web_servers
roles:
- role: my_web_role
- role: my_db_role
hosts指定了执行的节点(哪台机工作)是web_servers;
而roles指定了执行的角色(做什么动作)是my_web_role和my_db_role。
5. 角色中在哪个目录中编写task
一般情况下,role被创建之后底下有个tasks文件夹,我们就在这个目录中编写task。具体可以参考第三点。
6. 如何拆分task,主task中如何导入其他task
这个的操作原理和主playbook拆分差不多。
我们可以根据task的不同功能拆分不同的task文件,再通过include_tasks 模块导入这些文件。
举个例子:
---
- name: 导入task1
include_tasks: nginx.yml
- name: 导入task2
include_tasks: db.yml
#这是main文件
7. 角色中的变量要在哪个目录中定义
参考第三点的目录,角色中的变量通常在vars中定义。
定义的yaml文件格式大概如下:
# roles/nginx/vars/main.yml
# Nginx 访问日志文件路径(通常由模板或系统决定,但角色内部可能需要知道)
nginx_access_log_path: "/var/log/nginx/access.log"
# Nginx 错误日志文件路径
nginx_error_log_path: "/var/log/nginx/error.log"
# 内部使用的标志,表示这个角色是用于 Web 服务器
nginx_is_web_server: true
# Nginx 版本号(如果角色需要特定版本,但通常建议通过包管理器自动获取最新稳定版)
# nginx_version: "1.18.0" # 示例,但通常不推荐硬编码版本
# 用于判断是否在 RedHat 系系统上
nginx_is_rhel_family: "{{ ansible_os_family == 'RedHat' }}"
8. 变量的优先级是怎样的,如何强制覆盖变量
Ansible变量的优先级从高到低如下:
- 命令行参数(如
--extra-vars) - 角色默认变量(
defaults/main.yml) - 角色变量(
vars/main.yml) - inventory变量
- host变量
- group变量
- group vars all
强制覆盖变量,我们可以使用优先级最高的命令行参数来覆盖。
格式:ansible-playbook -e "var=xxx" xxx.yml
9. Ansible如何加密数据库密码
Ansible提供了 ansible-vault 工具来加密敏感数据。
- 加密数据库密码
- 使用命令
ansible-vault encrypt secret_file.yml; - 输入密码进行加密。
- 使用命令
- 查看加密文件:
ansible-vault view group_vars/all/secret_file.yml
10. 加密的密码如何解密传递给Playbook
我们可以把密码用变量存储起来,之后在playbook里引用变量,自动输入密码。
---
- name: 解密
hosts: all
become: yes
vars_files:
- group_vars/all/secret_file.yml # 这里引用的是加密文件
tasks:
- name: 密码
ansible.builtin.command: echo "{{ password }}" #输出密码
当然,在运行Playbook时,我我们也可以使用 --ask-vault-pass 参数来提供解密密码:
ansible-playbook --ask-vault-pass xxx.yml
也可以将解密密码存储在一个文件中,并使用 --vault-password-file 参数:
ansible-playbook --vault-password-file /path/to/vault_password_file xxx.yml
梳理芋道项目部署的步骤和角色
1. 你觉得整个项目分为几个角色
项目可以分为环境配置,前端,后端,数据库,nacos这几个角色。
2. 按顺序描述每个角色要进行的步骤(task),比如这些步骤你觉得应该如何拆分成多个task?
- 环境配置:
- 下载java
- 下载docker
- 下载maven
- 更改系统配置(如防火墙)
- 前端:
- 拉取前端代码
- 更改配置文件
- 安装前端环境
- 构建前端项目
- 后端:
- 拉取后端代码
- 更改配置文件
- 构建后端项目
- 构建docker镜像
- 数据库:
- 安装 MySQL 并启动服务
- 创建 yudao 项目的数据库和用户
- 导入脚本
- 配置mysql远程访问
- Nacos :
- 下载 Nacos 安装包并解压。
- 更改配置文件