1. 在Ansible项目中,如何拆分Playbook,主Playbook如何导入其他Playbook

使用import_playbook,就像C语言中的引用函数,示例如下:

- name: Prepare the web server
  import_playbook: web.yml

可以使用import_tasks功能将任务文件静态导入playbook内的play中。导入任务文件时,在解析该playbook时将直接插入该文件中的任务。Playbook中的import_tasks的位置控制插入任务的位置以及运行多个导入的顺序。

 - name: Install web server
  hosts: webservers
  tasks:
 - import_tasks: webserver_tasks.yml

导入任务文件时,在解析该playbook时将直接插入该文件中的任务。由于import_tasks在解析playbook时静态导入任务,因此对其工作方式有一些影响。

  • 使用import_tasks功能时,导入时设置的when等条件语句将应用于导入的每个任务

  • 无法将循环用于import_tasks功能

  • 如果使用变量来指定要导入的文件的名称,则将无法使用主机或组清单变量

可以使用include_tasks功能将任务文件动态导入playbook内的play中。

 - name: Install web server
  hosts: webservers
  tasks:
 - include_tasks: webserver_tasks.yml

在play运行并且这部分play到达前,include_tasks功能不会处理playbook中的内容。Playbook内容的处理顺序会影响包含任务功能的工作方式。

  • 使用include_tasks功能时,包含时设置的when等条件语句将确定任务是否包含在play中

  • 如果运行ansible-playbook --list-tasks以列出playbook中的任务,则不会显示已包含任务文件中的任务。将显示包含任务文件的任务。相比之下,import_tasks功能不会列出导入任务文件的任务,而列出已导入任务文件中的各个任务

  • 不能使用ansible-playbook --start-at-task从已包含任务文件中的任务开始执行playbook

  • 不能使用notify语句触发已包含任务文件中的处理程序名称。可以在包含整个任务文件的主playbook中触发处理程序,在这种情况下,已包含文件中的所有任务都将运行


2. 在Ansible项目中,在哪个目录中定义主机节点

会提供一个默认的管理清单inventory,即 /etc/ansible/hosts 文件。除默认文件外,我们还可以同时使用多个 Inventory 文件,也可以从动态源或云上拉取 Inventory 配置信息。


3. 在Ansible项目中,如何创建角色及相关目录,命令是什么

Ansible 提供了 ansible-galaxy 命令来生成角色的基本目录结构

ansible-galaxy init <role_name>

角色创建后会生成标准的目录结构

roles/
  └── role_name/
      ├── tasks/
      ├── handlers/
      ├── templates/
      ├── files/
      ├── vars/
      ├── defaults/
      └── meta/


4. Playbook中如何指定执行角色及执行节点

- hosts: all
  roles:
    - role_name

hosts 指定执行节点(可以是组名、IP 或通配符 all

roles 指定要执行的角色


5. 角色中在哪个目录中编写task

所有任务(tasks)应编写在 tasks/main.yml 文件中。

roles/role_name/tasks/main.yml


6. 如何拆分task,主task中如何导入其他task

拆分 task 到多个文件中,并在 main.yml 中使用 import_tasks 引用:

- import_tasks: install_packages.yml
- import_tasks: configure_service.yml


7. 角色中的变量要在哪个目录中定义

默认变量放在:defaults/main.yml

自定义变量(优先级更高)放在:vars/main.yml


8. 变量的优先级是怎样的,如何强制覆盖变量

  • Ansible 变量优先级从低到高大致为:

    • defaults/main.yml(最低)

    • vars/main.yml

    • 命令行传参 -e

    • set_fact 定义的变量(最高)

  • 要强制覆盖变量,使用命令行参数 -e "var_name=value"


9. Ansible如何加密数据库密码

使用 ansible-vault 创建加密文件存储敏感信息:

ansible-vault create group_vars/all/vault.yml

在该文件中定义加密变量,例如:

db_password: secure_password


10. 加密的密码如何解密传递给Playbook

执行 Playbook 时添加 --ask-vault-pass 参数手动输入密码:

ansible-playbook site.yml --ask-vault-pass

或者使用 --vault-password-file 指定密码文件:

ansible-playbook site.yml --vault-password-file=vault_pass.txt

梳理芋道项目部署的步骤和角色
1&2. 将整个项目分为几个角色

根据 yudao-cloud 项目的架构特点,可以将其部署相关的角色划分为以下几个:

  • 基础设施管理员(Infrastructure Admin):负责准备服务器、网络环境、数据库等基础设施。

  • 后端开发者/运维人员(Backend Developer / DevOps Engineer):负责部署后端服务(Spring Cloud 微服务),包括网关、配置中心、注册中心等。

  • 前端开发者(Frontend Developer):负责部署前端页面(Vue.js 应用)。

3. 这些步骤你觉得应该如何拆分成多个task

使用role按服务挨个拆分

以他人的幸福为幸福,以他人的享乐为享乐。