ansible roles概念及案例1 二进制部署nginx
Ansible roles 是一种组织和管理 Ansible 任务的方式,提供了一种结构化的方法来编写可复用的自动化代码。它将 Playbook 里的各种元素(tasks、handlers、templates、files、vars 等)进行模块化拆分,使配置更加清晰、易维护和复用。
Ansible Roles vs Playbook:优势对比
对比项 | Playbook | Roles |
---|---|---|
组织方式 | 扁平化,所有任务、变量、模板等写在一个或多个 .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
本文来自博客园,作者:不会跳舞的胖子,转载请注明原文链接:https://www.cnblogs.com/rtnb/p/18709783