ansible roles概念及案例1 二进制部署nginx

 Ansible roles 是一种组织和管理 Ansible 任务的方式,提供了一种结构化的方法来编写可复用的自动化代码。它将 Playbook 里的各种元素(tasks、handlers、templates、files、vars 等)进行模块化拆分,使配置更加清晰、易维护和复用

 Ansible Roles vs Playbook:优势对比

对比项PlaybookRoles
组织方式 扁平化,所有任务、变量、模板等写在一个或多个 .yml 文件中 结构化目录,任务、变量、文件等分类存放
可复用性 复用较困难,通常需要复制粘贴代码 角色可复用,可在不同的 Playbook 及项目中使用
维护性 随着任务增多,Playbook 变得复杂难以管理 结构清晰,便于维护和扩展
可读性 代码量较多,阅读困难 逻辑清晰,模块化设计提高可读性
共享性 只能手动复制或导入任务 可以上传到 Ansible Galaxy 共享,方便团队协作
灵活性 适用于简单的配置 适用于复杂的大型环境部署

什么时候使用 Roles?

  • 配置多个服务器 时,如 Web 服务器、数据库服务器等,Roles 可按功能模块化管理。
  • 需要复用 Playbook 时,例如不同环境(开发、测试、生产)使用相同的角色。
  • 管理复杂项目 时,Playbook 过长不易管理,使用 Roles 使代码更易读和维护。

示例:使用 Roles

1. 创建角色

ansible-galaxy init my_role

会生成如下目录结构:

my_role/
├── tasks/        # 任务,至少包含一个main.yml文件,其他文件需要在此文件中通过include进行包含
│   ├── main.yml  
├── handlers/     # 至少包含一个名问main.yml的文件,其他文件需要在此文件中通过include进行包含
│   ├── main.yml  
├── templates/    # Jinja2 模板
├── files/        # 静态文件,存放copy等模块调用的文件
├── vars/         # 定义变量,至少包含一个main.yml文件,其他文件需要在此文件中通过include进行包含
├── defaults/     # 默认变量,比vars.yml优先级低,至少包含一个名问main.yml的文件
├── meta/         # 角色元数据
└── README.md     # 角色说明

2. 使用 Role 在 Playbook 中

 调用playbook文件需要和roles目录平级。

[root@master-1 roles]# ll
总用量 4
-rw-r--r-- 1 root root 165 2月  21 11:05 main_nginx_all.yml
drwxr-xr-x 9 root root  93 2月  21 11:39 roles
- hosts: nginx
  remote_user: root
  # 收集远程主机信息
  gather_facts: yes
  roles:
    - role: nginx
    #- role: es
    #- role: mysql
    #- role: redis

3. roles执行顺序

在roles的tasks main.yml文件中,需要严格定义执行顺序和需要执行的tasks

[root@master-1 roles]# cat roles/nginx/tasks/main.yml
- include: install_package.yml
- include: unarchive_nginx.yml
- include: configuure_nginx.yml
- include: make.yml
- include: make_install.yml
- include: template_nginx_conf.yml
- include: template_nginx_service.yml
- include: add_user.yml
- include: chown_nginx_dir.yml
- include: start_nginx.yml
- include: check_pid.yml
- include: check_http_status.yml

 案例

1. 使用roles部署nginx

1.1  生成nginx role

[root@master-1 roles]# ansible-galaxy init nginx
- Role nginx was created successfully

1.2 查看目录结构

[root@master-1 roles]# tree nginx/
nginx/
├── default
│   └── main.yml
├── files
│   └── nginx-1.22.1.tar.gz   # 静态文件及配置
├── handlers
│   └── main.yml    # 触发任务
├── host
│   └── inventory.yml  # 定义主机
├── meta
├── tasks
│   ├── add_user.yml
│   ├── check_http_status.yml
│   ├── check_pid.yml
│   ├── chown_nginx_dir.yml
│   ├── configuure_nginx.yml
│   ├── install_package.yml
│   ├── main.yml      # 执行入口
│   ├── make_install.yml
│   ├── make.yml
│   ├── start_nginx.yml
│   ├── template_nginx_conf.yml
│   ├── template_nginx_service.yml
│   └── unarchive_nginx.yml
├── templates
│   ├── nginx.conf.j2  # 渲染
│   └── nginx.service.j2
└── vars
    └── main.yml  # 变量

1.3 查看task任务,执行顺序为从上到下

[root@master-1 roles]# cat nginx/tasks/main.yml
- include: install_package.yml
- include: unarchive_nginx.yml
- include: configuure_nginx.yml
- include: make.yml
- include: make_install.yml
- include: template_nginx_conf.yml
- include: template_nginx_service.yml
- include: add_user.yml
- include: chown_nginx_dir.yml
- include: start_nginx.yml
- include: check_pid.yml
- include: check_http_status.yml

1.4 定义主机

[root@master-1 roles]# cat nginx/host/inventory.yml
all:
  # Ansible 习惯使用 children 来定义组,而 all.hosts 一般只包含独立主机,所以这里设置为空 {} 让结构更清晰。
  hosts: {}
  # 这里将下面hosts定义的单独主机用children权保部写到elasticsearch组。
  children:
    nginx:
      hosts:
        nginx-node1:
          nginx_host: 192.168.43.130
          node_name: nginx-node1
        nginx-node2:
          nginx_host: 192.168.43.131
          node_name: nginx-node2

1.5 playbook调用roles

[root@master-1 roles]# cat main_nginx_all.yml
- hosts: nginx
  remote_user: root
  # 收集远程主机信息
  gather_facts: yes
  roles:
    - role: nginx
    #- role: es
    #- role: mysql
    #- role: redis

1.6 执行roles

[root@master-1 roles]# ansible-playbook  main_nginx_all.yml

PLAY [nginx] *****************************************************************************************************************************************************

TASK [Gathering Facts] *******************************************************************************************************************************************
ok: [192.168.43.131]
ok: [192.168.43.130]

TASK [nginx : install gcc openssl] *******************************************************************************************************************************
ok: [192.168.43.131]
ok: [192.168.43.130]

TASK [nginx : ubuntu install gcc openssl] ************************************************************************************************************************
skipping: [192.168.43.130]
skipping: [192.168.43.131]

TASK [create_nginx_dir] ******************************************************************************************************************************************
ok: [192.168.43.130]
ok: [192.168.43.131]

TASK [unarchive nginx] *******************************************************************************************************************************************
ok: [192.168.43.131]
ok: [192.168.43.130]

TASK [configuure nginx] ******************************************************************************************************************************************
ok: [192.168.43.130]
ok: [192.168.43.131]

TASK [make nginx] ************************************************************************************************************************************************
ok: [192.168.43.130]
ok: [192.168.43.131]

TASK [nginx : make install] **************************************************************************************************************************************
ok: [192.168.43.130]
ok: [192.168.43.131]

TASK [nginx : 使用 template 渲染并验证 Nginx 配置] ************************************************************************************************************************
changed: [192.168.43.130]
changed: [192.168.43.131]

TASK [nginx : 使用 template 渲染并验证 Nginx 启动文件] **********************************************************************************************************************
ok: [192.168.43.131]
ok: [192.168.43.130]

TASK [add nginx user] ********************************************************************************************************************************************
ok: [192.168.43.130]
ok: [192.168.43.131]

TASK [chown nginx_install_dir] ***********************************************************************************************************************************
ok: [192.168.43.130]
ok: [192.168.43.131]

TASK [start nginx] ***********************************************************************************************************************************************
ok: [192.168.43.131]
ok: [192.168.43.130]

TASK [check nginx pidfile] ***************************************************************************************************************************************
ok: [192.168.43.130]
ok: [192.168.43.131]

TASK [nginx : output mesage] *************************************************************************************************************************************
ok: [192.168.43.130] => {
    "msg": "nginx pid文件存在,nginx启动完成..."
}
ok: [192.168.43.131] => {
    "msg": "nginx pid文件存在,nginx启动完成..."
}

TASK [check nginx port] ******************************************************************************************************************************************
ok: [192.168.43.130]
ok: [192.168.43.131]

RUNNING HANDLER [reload nginx] ***********************************************************************************************************************************
changed: [192.168.43.130]
changed: [192.168.43.131]

PLAY RECAP *******************************************************************************************************************************************************
192.168.43.130             : ok=16   changed=2    unreachable=0    failed=0    skipped=1    rescued=0    ignored=0
192.168.43.131             : ok=16   changed=2    unreachable=0    failed=0    skipped=1    rescued=0    ignored=0

 2. 使用roles部署elasticsearch 3 节点的分布式集群

2.1 生成es目录

ansible-galaxy init es_cluster

 2.2 目录结构

[root@master-1 roles]# tree roles/es_cluster/
roles/es_cluster/
├── defaults
│   └── main.yml
├── files
│   ├── elastic-certificates.p12
│   ├── elasticsearch-7.16.3-linux-x86_64.tar.gz
│   ├── elasticsearch-analysis-ik-7.16.3.zip
│   ├── elastic-stack-ca.p12
│   └── jdk-8u341-linux-x64.tar.gz
├── handlers
│   └── main.yml
├── hosts
│   └── inventory.yaml
├── meta
│   └── main.yml
├── README.md
├── tasks
│   ├── add_user.yml
│   ├── check_process.yml
│   ├── chown_dir.yml
│   ├── Configure_Java_env.yml
│   ├── copy_cert.yml
│   ├── create_cert.yml
│   ├── create_date_dir.yml
│   ├── fetch_cert.yml
│   ├── ik.yml
│   ├── import_cert.yml
│   ├── keystore.yml
│   ├── main.yml
│   ├── modify_es_jvm.yml
│   ├── modify_sysctl.yml
│   ├── start.yml
│   ├── template_es_config.yml
│   ├── unarchive_es.yml
│   └── unarchive_java.yml
├── templates
│   └── elasticsearch.yml.j2
├── tests
│   ├── inventory
│   └── test.yml
└── vars
    └── main.yml

2.3 tasks main文件

[root@master-1 roles]# cat roles/es_cluster/tasks/main.yml
---
# tasks file for es_cluster
- include: unarchive_java.yml
- include: Configure_Java_env.yml
- include: modify_sysctl.yml
- include: add_user.yml
- include: unarchive_es.yml
- include: ik.yml
- include: create_date_dir.yml
- include: modify_es_jvm.yml
- include: keystore.yml
- include: create_cert.yml
- include: fetch_cert.yml
- include: copy_cert.yml
- include: import_cert.yml
- include: template_es_config.yml
- include: chown_dir.yml
- include: start.yml
- include: check_process.yml

2.4 修改fetch拉取目录

[root@master-1 roles]# cat roles/es_cluster/tasks/fetch_cert.yml
- name: 拉取CA证书
  ansible.builtin.fetch:
    src: "{{ es_install_dir }}/config/elastic-stack-ca.p12"
    dest: "/opt/ansible/playbook/roles/roles/es_cluster/files/"
    # 如果dest以/结尾,则复制到目录下,否则为文件名
    flat: yes
  when: inventory_hostname in groups['elasticsearch'] and hostvars[inventory_hostname].is_ca is defined and hostvars[inventory_hostname].is_ca

- name: 拉取服务证书
  ansible.builtin.fetch:
    src: "{{ es_install_dir }}/config/elastic-certificates.p12"
    dest: "/opt/ansible/playbook/roles/roles/es_cluster/files/"
    # 如果dest以/结尾,则复制到目录下,否则为文件名
    flat: yes
  when: inventory_hostname in groups['elasticsearch'] and hostvars[inventory_hostname].is_ca is defined and hostvars[inventory_hostname].is_ca

2.5 playbook调用role

[root@master-1 roles]# cat main_nginx_all.yml
- hosts: elasticsearch
  remote_user: root
  # 收集远程主机信息
  gather_facts: yes
  roles:
    #- role: nginx
    - role: es_cluster
    #- role: mysql
    #- role: redis

2.6 执行

ansible-playbook -i roles/es_cluster/hosts/inventory.yaml  main_nginx_all.yml  --list-hosts
ansible-playbook -i roles/es_cluster/hosts/inventory.yaml  main_nginx_all.yml --syntax-check
ansible-playbook -i roles/es_cluster/hosts/inventory.yaml  main_nginx_all.yml -C
ansible
-playbook -i roles/es_cluster/hosts/inventory.yaml main_nginx_all.yml

 

posted @ 2025-02-11 15:11  不会跳舞的胖子  阅读(33)  评论(0)    收藏  举报