文章目录
创建所需要的roles原型目录结构(以lnmp为例)
mkdir -p roles/nginx/{files,handlers,tasks,templates,vars}
mkdir -p roles/php/{files,handlers,tasks,templates,vars}
mkdir -p roles/mysql/{files,handlers,tasks,templates,vars}
myroles/
├── lnmp.yaml #入口触发配置文件
└── roles #lnmp.yaml中找到roles,从这里进入
├── nginx
│ ├── files #copy模块和script模块的参数src默认会从这个文件夹查找
│ ├── handlers #用来存放notify的
│ ├── tasks #用来存放ansible模块任务的
│ ├── templates #用来存放j2的
│ └── vars #用来存放变量的
├── mysql
│ ├── files
│ ├── handlers
│ ├── tasks
│ ├── templates
│ └── vars
└── php
├── files
├── handlers
├── tasks
├── templates
└── vars
3. /myroles/
4. ├── nginx.yaml #入口触发配置文件
5. └── roles #playbook的原型配置目录
6. └── nginx #nginx相关模组配置目录
7. ├── files #copy模块和script模块的参数src默认会从这个文件夹查找
8. ├── handlers #用来存放notify的
9. ├── tasks #用来存放ansible模块任务的
10. ├── templates #用来存放j2的,yaml文件定义变量,templates下某个文件,引入yaml的变量
11. └── vars #用来存放变量的
12.
入口触发配置文件(lnmp.yaml)
[root@ansible myroles]# cat /myroles/lnmp.yaml
---
- hosts: all #执行的主机范围
gather_facts: True #开启系统内置变量
roles: #启用roles原型配置
- nginx #执行nginx原型模组
- mysql
- php
【入口yaml文件说明】:
A)执行 ansible-playbook 命令后,通过入口yaml配置,
通过hosts可以确认需要ansible操作的目标远程机器。
B)通过roles来分别执行nginx MySQL php模块操作
roles中nginx角色下tasks任务编排模组的使用:
【说明】:
A)执行nginx roles角色下下tasks,即会找到tasks main.yaml
B)文件,根据该yaml文件,来操作nginx roles任务
myroles/roles/nginx/tasks/mail.yaml
---
- name: 检查远程机器uname -r #任务1的名字
shell: uname -r
register: a_result #每个任务都需要新设置debug信息
- debug: var=a_result
- name: 检查远程机器IP #任务2的名字
shell: hostname -I
register: ls_result #每个任务都需要新设置debug信息
- debug: var=ls_result
ansible-playbook myroles/lnmp.yaml运行结果
[root@kVM20202308-0 /]# ansible-playbook myroles/lnmp.yaml
PLAY [all] **************************************************************************************************************************************************
TASK [Gathering Facts] **************************************************************************************************************************************
ok: [web33]
[WARNING]: Platform linux on host web63 is using the discovered Python interpreter at /usr/bin/python, but future installation of another Python interpreter
could change this. See https://docs.ansible.com/ansible/2.9/reference_appendices/interpreter_discovery.html for more information.
ok: [web63]
TASK [nginx : 检查远程机器uname -r] *******************************************************************************************************************************
changed: [web63]
changed: [web33]
TASK [nginx : debug] ****************************************************************************************************************************************
ok: [web63] => {
"a_result": {
"changed": true,
"cmd": "uname -r",
"delta": "0:00:00.023720",
"end": "2021-01-30 16:32:32.001010",
"failed": false,
"rc": 0,
"start": "2021-01-30 16:32:31.977290",
"stderr": "",
"stderr_lines": [],
"stdout": "3.10.91-22.el7.x86_64",
"stdout_lines": [
"3.10.91-22.el7.x86_64"
]
}
}
ok: [web33] => {
"a_result": {
"changed": true,
"cmd": "uname -r",
"delta": "0:00:00.025603",
"end": "2021-01-30 16:32:32.029191",
"failed": false,
"rc": 0,
"start": "2021-01-30 16:32:32.003588",
"stderr": "",
"stderr_lines": [],
"stdout": "3.19.91-19.1.al7.x86_64",
"stdout_lines": [
"3.19.91-19.1.al7.x86_64"
]
}
}
TASK [nginx : 检查远程机器IP] *************************************************************************************************************************************
changed: [web63]
changed: [web33]
TASK [nginx : debug] ****************************************************************************************************************************************
ok: [web63] => {
"ls_result": {
"changed": true,
"cmd": "hostname -I",
"delta": "0:00:00.023432",
"end": "2021-01-30 16:32:32.742582",
"failed": false,
"rc": 0,
"start": "2021-01-30 16:32:32.719150",
"stderr": "",
"stderr_lines": [],
"stdout": "15.17.16.93 172.1.0.1 ",
"stdout_lines": [
"15.17.16.93 172.1.0.1 "
]
}
}
ok: [web33] => {
"ls_result": {
"changed": true,
"cmd": "hostname -I",
"delta": "0:00:00.025585",
"end": "2021-01-30 16:32:32.806105",
"failed": false,
"rc": 0,
"start": "2021-01-30 16:32:32.780520",
"stderr": "",
"stderr_lines": [],
"stdout": "100.1.4.53 ",
"stdout_lines": [
"100.1.4.53 "
]
}
}
PLAY RECAP **************************************************************************************************************************************************
web33 : ok=5 changed=2 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
web63 : ok=5 changed=2 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
roles中vars自定义变量模组的使用:
首先:需要先创建自定义变量vars模组的配置文件:
cat myroles/roles/nginx/vars/main.yaml
---
my_name: yunjisuan
phone: 1800000000
第二:tasks中main.yaml设置相应的 “变量 ”引用:
cat myroles/roles/nginx/tasks/main.yaml
---
- name: nginx主任务模块引用vars中的变量
shell: echo my phone is {{ phone }} #这里引用vars中的变量
register: a_result #输出debug结果
- debug: var=a_result
【vars变量引用说明】:
A)vars的变量引入需要提前设置好,vars下mian.yaml中的变量设置
B)task下main.yaml设置好调用vars变量的相关参数
C)怎么操作的,使得可以顺利调用vars变量呢?
lnmp.yaml提前设置好了 gather_facts: True
ansible-playbook myroles/lnmp.yaml
roles模型里使用copy,script模块:
roles模型里使用copy,script模块,默认从roles/nginx/files这里面找,copy的文件、目录,以及脚本
首先:files下需要存在copy,script的脚本:
[root@localhost /]# cat myroles/roles/nginx/files/test.sh
#! /bin/bash
mkdir -p /tmp/2O21-01-30
第二:tasks下main.yaml配置相关copy scripts操作:
---
- name: 检查远程机器uname -r
shell: echo my phone is {{ phone }}
register: a_result
- debug: var=a_result
- name: copy scripts
copy: src=test.sh dest=/mnt/
- name: run scripts
script: test.sh
roles中template模块的使用:
下发可变(带有变量的)配置文件
【template模块】
A)template下面存放 “带有变量”的 “配置文件”
B)这些带有变量的配置文件的值,来源于vars目录下的main.yaml
C)执行tasks下的template模块,先找到vars中mian.yaml,对应自定义变量的值,传给template下面的“文件”,最后scp到remote机器
/myroles/roles/nginx/templates/test.j2
[root@local-0 /]# cat /myroles/roles/nginx/templates/test.j2
#引用自定义变量
myname is {{ my_name }},my phone is {{ phone }}
cat /myroles/roles/nginx/tasks/main.yaml
---
- name: 检查远程机器uname -r #任务1的名字
shell: echo my phone is {{ phone }}
register: a_result #执行ping模块
- debug: var=a_result
- name: copy scripts
copy: src=test.sh dest=/mnt/
- name: run scripts
script: test.sh
- name: 使用template模块
template: src=test.j2 dest=/tmp/test2 #test.j2复制成远程的test2文件
roles中notify模块的使用:
【notify用法】:
A)监控到tasks的任务成功后(changed)然后可以触发notify模块的动作
B)roles使用notify模块,默认从roles/nginx/handles里面找
C)notify一般定义的action是:服务的启动、停止等
/myroles/roles/nginx/handlers/main.yaml
[root@local-0 /]# cat /myroles/roles/nginx/handlers/main.yaml
--- #这里name要和tasks下main.yaml对应
- name: nginx_start #定义handlers的动作类型
shell: systemctl restart nginx
- name: nginx_stop #定义handlers的动作类型
shell: systemctl stop nginx
/myroles/roles/nginx/tasks/main.yaml
[root@local-0 /]# cat /myroles/roles/nginx/tasks/main.yaml
---
- name: 检查远程机器uname -r #任务1的名字
shell: echo my phone is {{ phone }}
register: a_result #执行ping模块
- debug: var=a_result
- name: copy scripts
copy: src=test.sh dest=/mnt/
- name: run scripts
script: test.sh
- name: 使用template模块
template: src=test.j2 dest=/tmp/test2
notify: nginx_stop
【notify运行原理说明】:
1)主任务中tasks/main.yaml中notify监控
上面操作changed后,notify角色就生效
2)主tasks/main.yaml运行到notify:根据后面
对应的 "notify: nginx_stop"中“nginx_stop”
然后去handlers/main.yaml中找到对应的“nginx_stop”
-------------------------------------
---
- name: nginx_start
shell: systemctl restart nginx
- name: nginx_stop #找到它,执行对应shell中stop nginx服务
shell: systemctl stop nginx
【扩展】下面来源
https://blog.csdn.net/little_baixb/article/details/105101927?utm_medium=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromBaidu-1.control&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromBaidu-1.control