更新 ansible-role.md

This commit is contained in:
wxin 2025-03-09 11:49:05 +08:00
parent defded5748
commit 54fa446972

View File

@ -1,138 +1,138 @@
<h2><center> Ansible-role </center></h2> <h2><center> Ansible-role </center></h2>
------ ------
## 一:介绍 ## 一:介绍
Roles是在ansible中playbook的目录组织结构。每一个角色是由名字的他是一个目录可以包含子目录。 Roles是在ansible中playbook的目录组织结构。每一个角色是由名字的他是一个目录可以包含子目录。
以特定的层次目录结构进行组织的tasks、variables、handlers、templates、files等。 以特定的层次目录结构进行组织的tasks、variables、handlers、templates、files等。
## 二:目录作用 ## 二:目录作用
- role_name这个是角色的名称 - role_name这个是角色的名称
- files存储有copy或script等模块调用的文件 - files存储有copy或script等模块调用的文件
- tasks专门存储任务的目录一个角色可以定义多个任务此目录中至少应该有一个名为main.yml的文件用于定义各task其他的文件需要由main.yml进行“包含”调用 - tasks专门存储任务的目录一个角色可以定义多个任务此目录中至少应该有一个名为main.yml的文件用于定义各task其他的文件需要由main.yml进行“包含”调用
- handlers条件前一个任务执行成功去执行下面的处理特定事物的文件此目录中至少应该有一个名为main.yml的文件用于定义各handlers其它的文件需要由main.yml进行“包含”调用 - handlers条件前一个任务执行成功去执行下面的处理特定事物的文件此目录中至少应该有一个名为main.yml的文件用于定义各handlers其它的文件需要由main.yml进行“包含”调用
- vars变量定义变量的文件此目录中至少应该有一个名为main.yml的文件用于定义各variable其它的文件需要由main.yml进行“包含”调用 - vars变量定义变量的文件此目录中至少应该有一个名为main.yml的文件用于定义各variable其它的文件需要由main.yml进行“包含”调用
- templates模板 使用变量的文件存储由template模块调用的模板文本 - templates模板 使用变量的文件存储由template模块调用的模板文本
- meta此目录中至少应该有一个名为main.yml的文件定义当前角色的特殊设定及其依赖关系其它的文件需要由main.yml进行“包含”调用 - meta此目录中至少应该有一个名为main.yml的文件定义当前角色的特殊设定及其依赖关系其它的文件需要由main.yml进行“包含”调用
- default此目录中至少应该有一个名为main.yml的文件用于设定默认变量 - default此目录中至少应该有一个名为main.yml的文件用于设定默认变量
## 三:目录案例 ## 三:目录案例
nginx是一个角色的名字角色里用到文件放在files中通过创建playbook来调用这些角色 nginx是一个角色的名字角色里用到文件放在files中通过创建playbook来调用这些角色
## 四:项目案例 ## 四:项目案例
准备目录结构: 准备目录结构:
```bash ```bash
[root@ansible-server ~]# cd /etc/ansible/roles/ [root@ansible-server ~]# cd /etc/ansible/roles/
[root@ansible-server roles]# mkdir nginx/{files,handlers,tasks,templates,vars} -p [root@ansible-server roles]# mkdir nginx/{files,handlers,tasks,templates,vars} -p
``` ```
创建文件: 创建文件:
```bash ```bash
[root@ansible-server roles]# touch site.yml nginx/{handlers,tasks,vars}/main.yml [root@ansible-server roles]# touch site.yml nginx/{handlers,tasks,vars}/main.yml
[root@ansible-server roles]# yum -y install tree [root@ansible-server roles]# yum -y install tree
[root@ansible-server roles]# tree nginx/ [root@ansible-server roles]# tree nginx/
nginx/ nginx/
├── files ├── files
├── handlers ├── handlers
│   └── main.yml │   └── main.yml
├── tasks ├── tasks
│   └── main.yml │   └── main.yml
├── templates ├── templates
└── vars └── vars
└── main.yml └── main.yml
5 directories, 3 files 5 directories, 3 files
``` ```
创建nginx的测试文件 创建nginx的测试文件
```bash ```bash
[root@ansible-server roles]# echo 1234 > nginx/files/index.html [root@ansible-server roles]# echo 1234 > nginx/files/index.html
``` ```
安装nignx并配置模板 安装nignx并配置模板
```bash ```bash
[root@ansible-server roles]# yum -y install nginx [root@ansible-server roles]# yum -y install nginx
[root@ansible-server roles]# cp /etc/nginx/nginx.conf nginx/templates/nginx.conf.j2 [root@ansible-server roles]# cp /etc/nginx/nginx.conf nginx/templates/nginx.conf.j2
``` ```
编写任务: 编写任务:
```bash ```bash
[root@ansible-server roles]# vim nginx/tasks/main.yml [root@ansible-server roles]# vim nginx/tasks/main.yml
1 --- 1 ---
2 - name: install epel 2 - name: install epel
3 yum: name=epel-release state=latest 3 yum: name=epel-release state=latest
4 - name: install nginx 4 - name: install nginx
5 yum: name=nginx state=latest 5 yum: name=nginx state=latest
6 - name: copy nginx.conf template 6 - name: copy nginx.conf template
7 template: src=nginx.conf.j2 dest=/etc/nginx/nginx.conf 7 template: src=nginx.conf.j2 dest=/etc/nginx/nginx.conf
8 - name: copy index.html 8 - name: copy index.html
9 copy: src=index.html dest=/usr/share/nginx/html/index.html 9 copy: src=index.html dest=/usr/share/nginx/html/index.html
10 notify: start nginx 10 notify: start nginx
``` ```
template模块 template模块
```bash ```bash
[root@ansible-server roles]# vim nginx/templates/nginx.conf.j2 [root@ansible-server roles]# vim nginx/templates/nginx.conf.j2
``` ```
自定义变量: 自定义变量:
![](C:\Users\wxin\Desktop\ansible\accents\images-202503090002.png) ![](http://182.92.143.66:40072/directlink/ansible-img/images-202503090002.png)
编写变量: 编写变量:
```bash ```bash
[root@ansible-server roles]# vim nginx/vars/main.yml [root@ansible-server roles]# vim nginx/vars/main.yml
1 worker_connections: 2 1 worker_connections: 2
``` ```
编写handlers 编写handlers
```bash ```bash
[root@ansible-server roles]# vim nginx/handlers/main.yml [root@ansible-server roles]# vim nginx/handlers/main.yml
1 --- 1 ---
2 - name: start nginx 2 - name: start nginx
3 service: name=nginx state=started 3 service: name=nginx state=started
``` ```
编写剧本: 编写剧本:
```bash ```bash
[root@ansible-server roles]# vim site.yml [root@ansible-server roles]# vim site.yml
1 --- 1 ---
2 - hosts: ansible-web1 2 - hosts: ansible-web1
3 user: root 3 user: root
4 roles: 4 roles:
5 - nginx 5 - nginx
``` ```
检测语法: 检测语法:
```bash ```bash
[root@ansible-server roles]# ansible-playbook --syntax-check site.yml [root@ansible-server roles]# ansible-playbook --syntax-check site.yml
playbook: site.yml playbook: site.yml
``` ```
运行剧本: 运行剧本:
```bash ```bash
[root@ansible-server roles]# ansible-playbook site.yml [root@ansible-server roles]# ansible-playbook site.yml
``` ```
注意: 注意:
ansible会使用jinja2模块来修改被管理主机的配置文件使用ansible的jinja2模块也就是template模块该模块和copy模块一样都是将文件复制到远端主机上区别在于template模块可以获取要复制的文件中变量的值而copy则是原封不动的把文件内容复制过去比如针对不同的主机定义不同的变量template会在将配置文件分发出去之前读取变量到jinja2模板然后分发到不同的被管理的主机上ansible允许jinja2模板中使用条件判断和循环但是jinja2判断循环语法不允许在playbook中使用jinja2文件以.j2为后缀也可以不写后缀。 ansible会使用jinja2模块来修改被管理主机的配置文件使用ansible的jinja2模块也就是template模块该模块和copy模块一样都是将文件复制到远端主机上区别在于template模块可以获取要复制的文件中变量的值而copy则是原封不动的把文件内容复制过去比如针对不同的主机定义不同的变量template会在将配置文件分发出去之前读取变量到jinja2模板然后分发到不同的被管理的主机上ansible允许jinja2模板中使用条件判断和循环但是jinja2判断循环语法不允许在playbook中使用jinja2文件以.j2为后缀也可以不写后缀。