5.ansible使用-playbook剧本+roles角色模式-案例实战
1.ansible-playbook角色roles的相关入门
1).角色roles的概念和作用
角色roles是ansible自1.2版本引入的新特性,用于层次性、结构化的组织playbook,roles能够根据层次型结构自动装载变量文件、tasks任务以及handlers触发等。简单来讲,roles就是通过分别将变量、文件、任务、模板及处理器放置于单独的目录中,并可以便捷的include他们的一种机制。其实就是将一个大的playbook文件,进行分类拆分,达到根据需要复用的目的。
2).角色roles的目录层级结构
[root@localhost ~]# tree ansible-playbook-roles/ 下面是好几个项目的role,以httpd安装role为例解释
ansible-playbook-roles/ #所有roles的总目录,最外层的,包括playbook的yaml文件
├── host #hosts列表清单目录
│ └── hosts #具体的hosts清单,和/etc/ansible/hosts内容一样,指定部署到哪些机器
├── playbook-all-roles.yml #调用各个roles的总yml文件,可以具体指定调用哪一个role或哪一些role
#指定调用哪些role就是部署相应的role
└── roles #所有roles的总目录,里面是自定义的各个独立的role,部署哪个就配置哪个
├── httpd #以其中一个httpd的role为例,下面是该role下的目录结构,根据需要使用目录
│ ├── default #角色默认的变量,比vars的优先级低
│ ├── files #角色部署时用到的一些文件约定存放目录,可使用copy模块将文件传到远程主机
│ │ └── httpd.conf #准备好的httpd的配置文件
│ ├── handlers #触发到该下面定义的名称时,会触发该下面执行任务处理,修改配置触发重启
│ │ └── main.yml #定义的触发该任务时候,执行的具体任务,如:重启服务
│ ├── meta #角色定义的元数据
│ ├── tasks #角色部署时要执行的任务列表,各个步骤任务的yml文件,main.yml来调整任务顺序
│ │ ├── config_httpd.yml #修改httpd配置任务
│ │ ├── index_httpd.yml #设置httpd访问首页任务
│ │ ├── install_httpd.yml #安装httpd任务
│ │ ├── main.yml #主任务文件,通过该文件可以调整各个任务的执行顺序
│ │ └── service_httpd.yml #启动httpd服务任务
│ ├── templates #使用的模板文件约定目录,可以使用template模块,将模板渲染到远程主机
│ │ └── index.html #事先准备的首页测试文件
│ └── vars #定义变量文件的目录
│ └── main.yml #定义变量的文件,可将变量定义到该文件,供其他文件调用变量
├── mysql5.7
├── nginx
└── tomcat
注意1:
上面目录结构的名字是约定好的,不是随便能改成什么别的名字。所以需要按照上面的目录结构来进行组织palybook文件
注意2:
上面是以httpd角色为例解释的roles相关的目录层级结构,具体哪些role使用哪些目录,根据自己需要使用,如果用不到的目录,也可不创建,并不是每个role都需要有上面固定的目录,如:如果httpd的role使用不到template目录,那么可以不用创建templates目录
注意3:
- files/ 存放由copy或script模块等调用的文件
- templates/ template模块查找所需要模板文件的目录
- tasks/ 定义task、role的基本元素,至少应该包含一个main.yml的文件,其他的文件需要在此文件中通过include进行包含
- handlers/ 至少应该包含一个名为main.yml的文件,其他的文件需要在此文件中通过include进行包含
- vars/ 定义变量,至少应该包含一个名为main.yml的文件,其他的文件需要在此文件中通过include进行包含
- meta/ 定义当前角色的特殊设定及其依赖关系,至少应该包含一个名为main.yml的文件,其他文件需要在此文件中通过include进行包含
- default/ 设定默认变量时使用此目录中的main.yml文件,比vars的优先级低
2.ansible-playbook使用角色roles部署服务实战案例
案例1:使用ansible-playbook的role部署安装httpd服务,且配置文件修改后会触发重启
管理端: 192.168.171.128
[root@localhost ~]# tree ansible-playbook-roles-only-httpd/
ansible-playbook-roles-only-httpd/
├── host
│ └── hosts
├── playbook-all-roles.yml
└── roles
├── httpd
│ ├── default
│ ├── files
│ │ └── httpd.conf
│ ├── handlers
│ │ └── main.yml
│ ├── meta
│ ├── tasks
│ │ ├── config_httpd.yml
│ │ ├── index_httpd.yml
│ │ ├── install_httpd.yml
│ │ ├── main.yml
│ │ └── service_httpd.yml
│ ├── templates
│ │ └── index.html
│ └── vars
│ └── main.yml
├── mysql5.7
├── nginx
└── tomcat
[root@localhost ~]# cd ansible-playbook-roles-only-httpd/
[root@localhost ansible-playbook-roles-only-httpd]# ls
host playbook-all-roles.yml roles
[root@localhost ansible-playbook-roles-only-httpd]# cat host/hosts #查看主机列表
[test]
192.168.171.129
192.168.171.130
[root@localhost ansible-playbook-roles-only-httpd]# cat playbook-all-roles.yml #查看选择部署的某个role
#test: 为/etc/ansible/hosts中的主机列表 #task: 执行的任务
#name: 描述信息 #yum: yum模块,安装服务的
#copy: copy模块,远程传递文件的 #file: file模块,远程创建目录的
#service: service模块,远程管理服务的
#remote_user: root 是指定远程主机上使用的用户
#gather_facts: no 是默认执行playbook时候,默认会收集目标主机的信息,禁用掉能提高效率
---
#httpd role
- hosts: test
remote_user: root
gather_facts: no
#下面是调用相应的role,调用哪些role就部署哪些
roles:
- role: httpd
#- role: nginx
[root@localhost ansible-playbook-roles-only-httpd]# ls roles/ #查看里面所有的role,只看httpd,其他role为空
httpd mysql5.7 nginx tomcat
[root@localhost ansible-playbook-roles-only-httpd]# ls roles/httpd/ #查看httpd的role的层级结构
default files handlers meta tasks templates vars
[root@localhost ansible-playbook-roles-only-httpd]# ls roles/httpd/default/ #default目录没用上,为空
为空
[root@localhost ansible-playbook-roles-only-httpd]# ls roles/httpd/files/ #查看准备的自定义httpd的配置文件
httpd.conf
[root@localhost ansible-playbook-roles-only-httpd]# cat roles/httpd/files/httpd.conf |grep Listen #修改端口
# Listen: Allows you to bind Apache to specific IP addresses and/or
# Change this to Listen on specific IP addresses as shown below to
#Listen 12.34.56.78:80
Listen 82
[root@localhost ansible-playbook-roles-only-httpd]# ls roles/httpd/handlers/ #查看修改配置后触发的重启任务
main.yml
[root@localhost ansible-playbook-roles-only-httpd]# cat roles/httpd/handlers/main.yml
- name: restart #定义被触发的handler名称,当修改配置文件后会根据该名称触发重启服务
service: name=httpd state=restarted
[root@localhost ansible-playbook-roles-only-httpd]# ls roles/httpd/meta/ #meta目录没用上,为空
为空
[root@localhost ansible-playbook-roles-only-httpd]# ls roles/httpd/tasks/ #查看所有任务和任务执行顺序
config_httpd.yml index_httpd.yml install_httpd.yml main.yml service_httpd.yml
[root@localhost ansible-playbook-roles-only-httpd]# cat roles/httpd/tasks/main.yml
- include: install_httpd.yml
- include: config_httpd.yml
- include: index_httpd.yml
- include: service_httpd.yml
[root@localhost ansible-playbook-roles-only-httpd]# cat roles/httpd/tasks/install_httpd.yml
- name: install httpd
yum: name=httpd state=installed
[root@localhost ansible-playbook-roles-only-httpd]# cat roles/httpd/tasks/config_httpd.yml
- name: config http
copy: src=httpd.conf dest=/etc/httpd/conf/httpd.conf
notify: restart #修改配置时候触发重启的handler名称,重启httpd服务
[root@localhost ansible-playbook-roles-only-httpd]# cat roles/httpd/tasks/index_httpd.yml
- name: index.html
template: src=index.html dest=/var/www/html/index.html
#使用template模块将templates目录中文件渲染到远程主机目录
[root@localhost ansible-playbook-roles-only-httpd]# cat roles/httpd/tasks/service_httpd.yml
- name: start service
service: name=httpd state=started enabled=yes
[root@localhost ansible-playbook-roles-only-httpd]# ls roles/httpd/templates/ #查看网页模板文件和调用变量情况
index.html
[root@localhost ansible-playbook-roles-only-httpd]# cat roles/httpd/templates/index.html #查看调用变量情况
<h1> {{shouye_content}} </h1>
[root@localhost ansible-playbook-roles-only-httpd]# ls roles/httpd/vars/ #查看变量文件
main.yml
[root@localhost ansible-playbook-roles-only-httpd]# cat roles/httpd/vars/main.yml #查看定义变量的内容
shouye_content: "httpd test111"
[root@localhost ansible-playbook-roles-only-httpd]# ansible-playbook -i host/hosts playbook-all-roles.yml #执行
所有被管理端:192.168.171.129和192.168.130查看httpd服务部署和配置文件情况
[root@localhost ~]# systemctl status httpd
● httpd.service - The Apache HTTP Server
Loaded: loaded (/usr/lib/systemd/system/httpd.service; enabled; vendor preset: disabled)
Active: active (running) since Sun 2023-04-09 00:08:36 CST; 1min 49s ago
[root@localhost ~]# netstat -anput |grep 82
tcp6 0 0 :::82 :::* LISTEN 41228/httpd
[root@localhost ~]# cat /etc/httpd/conf/httpd.conf |grep 82
Listen 82
[root@localhost ~]# curl http://127.0.0.1:82/
<h1> httpd test111 </h1>
案例2:使用ansible-playbook的role部署安装nginx服务,且配置文件修改后会触发重启(下面仅看nginx角色)
管理端: 192.168.171.128
[root@localhost ~]# tree ansible-playbook-roles #下面是nginx、mysql5.7、tomcat、httpd所有的,只看nginx
ansible-playbook-roles
├── host
│ └── hosts
├── playbook-all-roles.yml
└── roles
├── httpd
│ ├── default
│ ├── files
│ │ └── httpd.conf
│ ├── handlers
│ │ └── main.yml
│ ├── meta
│ ├── tasks
│ │ ├── config_httpd.yml
│ │ ├── index_httpd.yml
│ │ ├── install_httpd.yml
│ │ ├── main.yml
│ │ └── service_httpd.yml
│ ├── templates
│ │ └── index.html
│ └── vars
│ └── main.yml
├── mysql5.7
│ ├── default
│ ├── files
│ │ ├── my.cnf
│ │ ├── mysql-5.7.19-linux-glibc2.12-x86_64.tar.gz
│ │ └── mysqld.service
│ ├── handlers
│ │ └── main.yml
│ ├── meta
│ ├── tasks
│ │ ├── create_mysql_user_and_dir.yml
│ │ ├── init_mysql.yml
│ │ ├── install_mysql_yilai.yml
│ │ ├── jieya_mv_mysql.yml
│ │ ├── main.yml
│ │ ├── service_mysql.yml
│ │ ├── transfer_mysql_config.yml
│ │ ├── transfer_mysqld_service.yml
│ │ └── transfer_mysql.yml
│ ├── templates
│ └── vars
│ └── main.yml
├── nginx
│ ├── default
│ ├── files
│ │ ├── index.html
│ │ ├── nginx-1.23.3.tar.gz
│ │ ├── nginx.conf
│ │ └── www.test.com.conf
│ ├── handlers
│ │ └── main.yml
│ ├── meta
│ ├── tasks
│ │ ├── bianyi_and_install_nginx.yml
│ │ ├── config_nginx.yml
│ │ ├── index_nginx.yml
│ │ ├── install_nginx_bianyi.yml
│ │ ├── install_nginx_yilai.yml
│ │ ├── main.yml
│ │ ├── nginx_package_transfer_and_jieya.yml
│ │ └── service_nginx.yml
│ ├── templates
│ └── vars
│ └── main.yml
└── tomcat
├── default
├── files
│ ├── apache-tomcat-8.0.32.tar.gz
│ ├── index.html
│ ├── jdk-8u65-linux-x64.gz
│ └── server.xml
├── handlers
│ └── main.yml
├── meta
├── tasks
│ ├── config_tomcat.yml
│ ├── index_tomcat.yml
│ ├── install_jdk1.8.yml
│ ├── install_tomcat.yml
│ ├── main.yml
│ └── service_tomcat.yml
├── templates
└── vars
└── main.yml
[root@localhost ~]# cd ansible-playbook-roles
[root@localhost ansible-playbook-roles]# ls
host playbook-all-roles.yml roles
[root@localhost ansible-playbook-roles]# cat host/hosts #查看主机列表
[test]
192.168.171.129
192.168.171.130
[root@localhost ansible-playbook-roles]# cat playbook-all-roles.yml #查看选择部署的某个role
#test: 为/etc/ansible/hosts中的主机列表 #task: 执行的任务
#name: 描述信息 #yum: yum模块,安装服务的
#copy: copy模块,远程传递文件的 #file: file模块,远程创建目录的
#service: service模块,远程管理服务的
#remote_user: root 是指定远程主机上使用的用户
#gather_facts: no 是默认执行playbook时候,默认会收集目标主机的信息,禁用掉能提高效率
---
#httpd role
- hosts: test
remote_user: root
gather_facts: no
#下面是调用相应的role,调用哪些role就部署哪些
roles:
#- role: httpd
- role: nginx
#- role: tomcat
#- role: mysql5.7
[root@localhost ansible-playbook-roles]# ls roles/ #查看里面所有的role,只看nginx的
httpd mysql5.7 nginx tomcat
[root@localhost ansible-playbook-roles]# ls roles/nginx/ #查看nginx的role的层级结构
default files handlers meta tasks templates vars
[root@localhost ansible-playbook-roles]# ls roles/nginx/default/ #default目录没用上,为空
为空
[root@localhost ansible-playbook-roles]# ls roles/nginx/files/ #查看软件包、配置文件和网页文件
index.html nginx-1.23.3.tar.gz nginx.conf www.test.com.conf
[root@localhost ansible-playbook-roles]# cat roles/nginx/files/index.html
nginx test
[root@localhost ansible-playbook-roles]# cat roles/nginx/files/nginx.conf |grep vhost
include /usr/local/nginx/conf/vhost/*.conf;
[root@localhost ansible-playbook-roles]# cat roles/nginx/files/www.test.com.conf
server {
listen 88;
server_name www.test.com;
location / {
root html;
index index.html index.htm;
}
}
[root@localhost ansible-playbook-roles]# ls roles/nginx/handlers/ #查看修改配置后触发的重启任务
main.yml
[root@localhost ansible-playbook-roles]# cat roles/nginx/handlers/main.yml
#触发后重新加载nginx
- name: restart #定义被触发的handler名称,当修改配置文件后会根据该名称触发重启服务
shell: pkill nginx && /usr/local/nginx/sbin/nginx #测试reload不行
[root@localhost ansible-playbook-roles]# ls roles/nginx/meta/ #meta目录没用上,为空
为空
[root@localhost ansible-playbook-roles]# ls roles/nginx/tasks/ #查看所有任务和任务执行顺序
bianyi_and_install_nginx.yml index_nginx.yml install_nginx_yilai.yml nginx_package_transfer_and_jieya.yml
config_nginx.yml install_nginx_bianyi.yml main.yml service_nginx.yml
[root@localhost ansible-playbook-roles]# cat roles/nginx/tasks/main.yml
- include: install_nginx_bianyi.yml
- include: install_nginx_yilai.yml
- include: nginx_package_transfer_and_jieya.yml
- include: bianyi_and_install_nginx.yml
- include: config_nginx.yml
- include: index_nginx.yml
- include: service_nginx.yml
[root@localhost ansible-playbook-roles]# cat roles/nginx/tasks/install_nginx_bianyi.yml
#安装nginx编译工具
- name: Install gcc gcc-c++
yum: name=gcc,gcc-c++ state=installed
[root@localhost ansible-playbook-roles]# cat roles/nginx/tasks/install_nginx_yilai.yml
#安装nginx依赖工具
- name: Install yilai
yum: name=openssl-devel,openssl,zlib,zlib-devel,pcre-devel,vim,wget state=installed
[root@localhost ansible-playbook-roles]# cat roles/nginx/tasks/nginx_package_transfer_and_jieya.yml
#nginx压缩包的传输和解压
- name: nginx package transfer and jieya
unarchive:
src: "{{ src_nginx }}"
dest: "{{ nginx_jieya_dir }}"
[root@localhost ansible-playbook-roles]# cat roles/nginx/tasks/bianyi_and_install_nginx.yml
#配置编译和安装nginx: 下面做了一个判断,如果nginx用户不存则创建,如果存在就跳过
- name: create nginx user
shell: user_name=`cat /etc/passwd|grep nginx|wc -l` &&
[ ${user_name} -eq 0 ] && useradd -s /sbin/nologin nginx || break
- name: config bianyi install nginx
shell: cd {{ nginx_jieya_dir }} &&
cd {{ nginx_jieyahou_name }} &&
./configure --user=nginx --group=nginx --prefix={{ nginx_install_dir }} --with-http_stub_status_module --with-http_ssl_module &&
make && make install
[root@localhost ansible-playbook-roles]# cat roles/nginx/tasks/config_nginx.yml
#传输和配置nginx,使用自己定义的配置文件
- name: transfer and config nginx.conf
copy: src={{ src_nginx_conf }} dest={{ dest_nginx_conf }}
notify: restart #修改配置时候触发重启的handler名称,重新加载nginx服务,需要和handlers目录中文件中名字一致
#创建include相关配置文件目录,下面是判断如果目录不存在则创建,如果存在就跳过不创建
- name: create nginx_include conf
shell: cd {{ nginx_install_dir }} &&
[ ! -d conf/vhost ] && mkdir conf/vhost || break
#传输和配置nginx include的配置文件,使用自定义的配置文件
- name: transfer and config nginx_include.conf
copy: src={{ src_nginx_include_conf }} dest={{ dest_nginx_include_conf }}
notify: restart #修改配置时候触发重启的handler名称,重新加载nginx服务,需要和handlers目录中文件中名字一致
[root@localhost ansible-playbook-roles]# cat roles/nginx/tasks/index_nginx.yml
#自定义nginx的首页并传输
- name: transfer nginx index.html
copy: src={{ src_nginx_index }} dest={{ dest_nginx_index }}
[root@localhost ansible-playbook-roles]# cat roles/nginx/tasks/service_nginx.yml
#启动nginx服务
- name: start nginx service
shell: /usr/local/nginx/sbin/nginx
[root@localhost ansible-playbook-roles]# ls roles/nginx/templates/ 为空,没用到
为空
[root@localhost ansible-playbook-roles]# ls roles/nginx/vars/ #查看变量文件
main.yml
[root@localhost ansible-playbook-roles]# cat roles/nginx/vars/main.yml #查看定义变量的内容
src_nginx: "nginx-1.23.3.tar.gz"
nginx_jieya_dir: "/usr/local"
nginx_install_dir: "/usr/local/nginx"
nginx_jieyahou_name: "nginx-1.23.3"
src_nginx_conf: "nginx.conf"
src_nginx_include_conf: "www.test.com.conf"
dest_nginx_conf: "/usr/local/nginx/conf/nginx.conf"
dest_nginx_include_conf: "/usr/local/nginx/conf/vhost/www.test.com.conf"
src_nginx_index: "index.html"
dest_nginx_index: "/usr/local/nginx/html/"
[root@localhost ansible-playbook-roles]# ansible-playbook -i host/hosts playbook-all-roles.yml #执行部署
所有被管理端:192.168.171.129和192.168.130查看nginx服务部署和配置文件情况
[root@localhost ~]# ps -ef |grep nginx
root 4770 1 0 16:45 ? 00:00:00 nginx: master process /usr/local/nginx/sbin/nginx
nginx 4771 4770 0 16:45 ? 00:00:00 nginx: worker process
root 4783 1196 0 16:46 pts/0 00:00:00 grep --color=auto nginx
[root@localhost ~]# cat /usr/local/nginx/conf/vhost/www.test.com.conf
server {
listen 88;
server_name www.test.com;
location / {
root html;
index index.html index.htm;
}
}
[root@localhost ~]# netstat -anput |grep 88|grep LISTEN
tcp 0 0 0.0.0.0:88 0.0.0.0:* LISTEN 4770/nginx: master
[root@localhost ~]# curl 127.0.0.1:88/
nginx test
案例3:使用ansible-playbook的role部署安装tomcat服务,且配置文件修改后会触发重启(下面仅看tomcat角色)
管理端: 192.168.171.128
[root@localhost ~]# tree ansible-playbook-roles #下面是nginx、mysql5.7、tomcat、httpd所有的,只看tomcat
ansible-playbook-roles
├── host
│ └── hosts
├── playbook-all-roles.yml
└── roles
├── httpd
│ ├── default
│ ├── files
│ │ └── httpd.conf
│ ├── handlers
│ │ └── main.yml
│ ├── meta
│ ├── tasks
│ │ ├── config_httpd.yml
│ │ ├── index_httpd.yml
│ │ ├── install_httpd.yml
│ │ ├── main.yml
│ │ └── service_httpd.yml
│ ├── templates
│ │ └── index.html
│ └── vars
│ └── main.yml
├── mysql5.7
│ ├── default
│ ├── files
│ │ ├── my.cnf
│ │ ├── mysql-5.7.19-linux-glibc2.12-x86_64.tar.gz
│ │ └── mysqld.service
│ ├── handlers
│ │ └── main.yml
│ ├── meta
│ ├── tasks
│ │ ├── create_mysql_user_and_dir.yml
│ │ ├── init_mysql.yml
│ │ ├── install_mysql_yilai.yml
│ │ ├── jieya_mv_mysql.yml
│ │ ├── main.yml
│ │ ├── service_mysql.yml
│ │ ├── transfer_mysql_config.yml
│ │ ├── transfer_mysqld_service.yml
│ │ └── transfer_mysql.yml
│ ├── templates
│ └── vars
│ └── main.yml
├── nginx
│ ├── default
│ ├── files
│ │ ├── index.html
│ │ ├── nginx-1.23.3.tar.gz
│ │ ├── nginx.conf
│ │ └── www.test.com.conf
│ ├── handlers
│ │ └── main.yml
│ ├── meta
│ ├── tasks
│ │ ├── bianyi_and_install_nginx.yml
│ │ ├── config_nginx.yml
│ │ ├── index_nginx.yml
│ │ ├── install_nginx_bianyi.yml
│ │ ├── install_nginx_yilai.yml
│ │ ├── main.yml
│ │ ├── nginx_package_transfer_and_jieya.yml
│ │ └── service_nginx.yml
│ ├── templates
│ └── vars
│ └── main.yml
└── tomcat
├── default
├── files
│ ├── apache-tomcat-8.0.32.tar.gz
│ ├── index.html
│ ├── jdk-8u65-linux-x64.gz
│ └── server.xml
├── handlers
│ └── main.yml
├── meta
├── tasks
│ ├── config_tomcat.yml
│ ├── index_tomcat.yml
│ ├── install_jdk1.8.yml
│ ├── install_tomcat.yml
│ ├── main.yml
│ └── service_tomcat.yml
├── templates
└── vars
└── main.yml
[root@localhost ~]# cd ansible-playbook-roles
[root@localhost ansible-playbook-roles]# ls
host playbook-all-roles.yml roles
[root@localhost ansible-playbook-roles]# cat host/hosts #查看主机列表
[test]
192.168.171.129
192.168.171.130
[root@localhost ansible-playbook-roles]# cat playbook-all-roles.yml #查看选择部署的某个role
#test: 为/etc/ansible/hosts中的主机列表 #task: 执行的任务
#name: 描述信息 #yum: yum模块,安装服务的
#copy: copy模块,远程传递文件的 #file: file模块,远程创建目录的
#service: service模块,远程管理服务的
#remote_user: root 是指定远程主机上使用的用户
#gather_facts: no 是默认执行playbook时候,默认会收集目标主机的信息,禁用掉能提高效率
---
#httpd role
- hosts: test
remote_user: root
gather_facts: no
#下面是调用相应的role,调用哪些role就部署哪些
roles:
#- role: httpd
#- role: nginx
- role: tomcat
#- role: mysql5.7
[root@localhost ansible-playbook-roles]# ls roles/ #查看里面所有的role,只看tomcat的
httpd mysql5.7 nginx tomcat
[root@localhost ansible-playbook-roles]# ls roles/tomcat/ #查看tomcat的role的层级结构
default files handlers meta tasks templates vars
[root@localhost ansible-playbook-roles]# ls roles/tomcat/default/ #default目录没用上,为空
为空
[root@localhost ansible-playbook-roles]# ls roles/tomcat/files/ #查看软件包、配置文件和网页文件
apache-tomcat-8.0.32.tar.gz index.html jdk-8u65-linux-x64.gz server.xml
[root@localhost ansible-playbook-roles]# cat roles/tomcat/files/index.html
tomcat test index
[root@localhost ansible-playbook-roles]# cat roles/tomcat/files/server.xml |grep 8081
<Connector port="8081" protocol="HTTP/1.1"
[root@localhost ansible-playbook-roles]# ls roles/tomcat/handlers/ #查看修改配置后触发的重启任务
main.yml
[root@localhost ansible-playbook-roles]# cat roles/tomcat/handlers/main.yml
#修改配置后触发重启服务:
- name: restart
shell: ps -ef |grep tomcat |grep -v grep |awk '{print $2}'|xargs kill -9 &&
cd "{{ tomcat_install_dir }}" && cd "{{ tomcat_jieyahou_name }}"/bin && nohup ./startup.sh &
[root@localhost ansible-playbook-roles]# ls roles/tomcat/meta/ #meta目录没用上,为空
为空
[root@localhost ansible-playbook-roles]# ls roles/tomcat/tasks/ #查看所有任务和任务执行顺序
config_tomcat.yml index_tomcat.yml install_jdk1.8.yml install_tomcat.yml main.yml service_tomcat.yml
[root@localhost ansible-playbook-roles]# cat roles/tomcat/tasks/main.yml
- include: install_jdk1.8.yml
- include: install_tomcat.yml
- include: config_tomcat.yml
- include: index_tomcat.yml
- include: service_tomcat.yml
[root@localhost ansible-playbook-roles]# cat roles/tomcat/tasks/install_jdk1.8.yml
#解压jdk压缩包
- name: Unarchive jdk package
unarchive:
src: "{{ src_jdk }}"
dest: "{{ jdk_install_dir }}"
#配置jdk环境变量
- name: set jdk global env
shell: echo '''export JAVA_HOME=/usr/local/{{ jdk_jieyahou_name }}''' >> ~/.bashrc &&
echo '''export PATH=$JAVA_HOME/bin:$PATH''' >> ~/.bashrc &&
echo '''export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar''' >> ~/.bashrc &&
source ~/.bashrc
#有yum源时jdk也可采用下面方式安装
#安装jdk环境
#- name: Install jdk1.8
# yum: name=java-1.8.0-openjdk state=installed
[root@localhost ansible-playbook-roles]# cat roles/tomcat/tasks/install_tomcat.yml
#解压安装tomcat软件包
- name: Unarchive and install tomcat
unarchive:
src: "{{ src_tomcat }}"
dest: "{{ tomcat_install_dir }}"
[root@localhost ansible-playbook-roles]# cat roles/tomcat/tasks/config_tomcat.yml
#配置tomcat,自定义tomcat配置文件
- name: config tomcat
copy: src={{ src_tomcat_config }} dest={{ dest_tomcat_config }}
notify: restart #修改配置时候触发重启的handler名称,重启tomcat服务
[root@localhost ansible-playbook-roles]# cat roles/tomcat/tasks/index_tomcat.yml
#自定义nginx的首页并传输
- name: transfer tomcat index.html
copy: src={{ src_tomcat_index }} dest={{ dest_tomcat_index }}
[root@localhost ansible-playbook-roles]# cat roles/tomcat/tasks/service_tomcat.yml
#启动tomcat,注意:tomcat首次启动需要用 nohup ./startup.sh & 或 nohup ./catalina.sh & 启动,如果直接使用/.../.../tomcat.../bin/startup.sh则启动不了
- name: start tomcat
shell: cd "{{ tomcat_install_dir }}" && cd "{{ tomcat_jieyahou_name }}"/bin && nohup ./startup.sh &
[root@localhost ansible-playbook-roles]# ls roles/tomcat/templates/ #为空,没用到
为空
[root@localhost ansible-playbook-roles]# ls roles/tomcat/vars/ #查看变量文件
main.yml
[root@localhost ansible-playbook-roles]# cat roles/tomcat/vars/main.yml #查看定义变量的内容
src_jdk: "jdk-8u65-linux-x64.gz"
jdk_install_dir: "/usr/local/"
jdk_jieyahou_name: "jdk1.8.0_65"
src_tomcat: "apache-tomcat-8.0.32.tar.gz"
tomcat_install_dir: "/usr/local/"
tomcat_jieyahou_name: "apache-tomcat-8.0.32"
src_tomcat_index: "index.html"
dest_tomcat_index: "/usr/local/apache-tomcat-8.0.32/webapps/ROOT/"
src_tomcat_config: "server.xml"
dest_tomcat_config: "/usr/local/apache-tomcat-8.0.32/conf/server.xml"
[root@localhost ansible-playbook-roles]# ansible-playbook -i host/hosts playbook-all-roles.yml #执行部署
所有被管理端:192.168.171.129和192.168.130查看tomcat服务部署和配置文件情况
[root@localhost ~]# ps -ef |grep tomcat
root 5363 1 22 17:08 ? 00:00:01 /usr/local/jdk1.8.0_65/bin/java -Djava.util.logging.config.file=/usr/local/apache-tomcat-8.0.32/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djava.endorsed.dirs=/usr/local/apache-tomcat-8.0.32/endorsed -classpath /usr/local/apache-tomcat-8.0.32/bin/bootstrap.jar:/usr/local/apache-tomcat-8.0.32/bin/tomcat-juli.jar -Dcatalina.base=/usr/local/apache-tomcat-8.0.32 -Dcatalina.home=/usr/local/apache-tomcat-8.0.32 -Djava.io.tmpdir=/usr/local/apache-tomcat-8.0.32/temp org.apache.catalina.startup.Bootstrap start
root 5393 1180 0 17:08 pts/0 00:00:00 grep --color=auto tomcat
[root@localhost ~]# cat /usr/local/apache-tomcat-8.0.32/conf/server.xml |grep 8081
<Connector port="8081" protocol="HTTP/1.1"
[root@localhost ~]# netstat -anput |grep 8081|grep LISTEN
tcp6 0 0 :::8081 :::* LISTEN 5363/java
[root@localhost ~]# cat /usr/local/apache-tomcat-8.0.32/webapps/ROOT/index.html
tomcat test index
[root@localhost ~]# curl 127.0.0.1:8081/
tomcat test index
案例4:使用ansible-playbook的role部署安装mysql5.7服务,且配置文件修改后会触发重启(下面仅看mysql5.7角色)
管理端: 192.168.171.128
[root@localhost ~]# tree ansible-playbook-roles #下面是nginx、mysql5.7、tomcat、httpd所有的,只看mysql5.7
ansible-playbook-roles
├── host
│ └── hosts
├── playbook-all-roles.yml
└── roles
├── httpd
│ ├── default
│ ├── files
│ │ └── httpd.conf
│ ├── handlers
│ │ └── main.yml
│ ├── meta
│ ├── tasks
│ │ ├── config_httpd.yml
│ │ ├── index_httpd.yml
│ │ ├── install_httpd.yml
│ │ ├── main.yml
│ │ └── service_httpd.yml
│ ├── templates
│ │ └── index.html
│ └── vars
│ └── main.yml
├── mysql5.7
│ ├── default
│ ├── files
│ │ ├── my.cnf
│ │ ├── mysql-5.7.19-linux-glibc2.12-x86_64.tar.gz
│ │ └── mysqld.service
│ ├── handlers
│ │ └── main.yml
│ ├── meta
│ ├── tasks
│ │ ├── create_mysql_user_and_dir.yml
│ │ ├── init_mysql.yml
│ │ ├── install_mysql_yilai.yml
│ │ ├── jieya_mv_mysql.yml
│ │ ├── main.yml
│ │ ├── service_mysql.yml
│ │ ├── transfer_mysql_config.yml
│ │ ├── transfer_mysqld_service.yml
│ │ └── transfer_mysql.yml
│ ├── templates
│ └── vars
│ └── main.yml
├── nginx
│ ├── default
│ ├── files
│ │ ├── index.html
│ │ ├── nginx-1.23.3.tar.gz
│ │ ├── nginx.conf
│ │ └── www.test.com.conf
│ ├── handlers
│ │ └── main.yml
│ ├── meta
│ ├── tasks
│ │ ├── bianyi_and_install_nginx.yml
│ │ ├── config_nginx.yml
│ │ ├── index_nginx.yml
│ │ ├── install_nginx_bianyi.yml
│ │ ├── install_nginx_yilai.yml
│ │ ├── main.yml
│ │ ├── nginx_package_transfer_and_jieya.yml
│ │ └── service_nginx.yml
│ ├── templates
│ └── vars
│ └── main.yml
└── tomcat
├── default
├── files
│ ├── apache-tomcat-8.0.32.tar.gz
│ ├── index.html
│ ├── jdk-8u65-linux-x64.gz
│ └── server.xml
├── handlers
│ └── main.yml
├── meta
├── tasks
│ ├── config_tomcat.yml
│ ├── index_tomcat.yml
│ ├── install_jdk1.8.yml
│ ├── install_tomcat.yml
│ ├── main.yml
│ └── service_tomcat.yml
├── templates
└── vars
└── main.yml
[root@localhost ~]# cd ansible-playbook-roles
[root@localhost ansible-playbook-roles]# ls
host playbook-all-roles.yml roles
[root@localhost ansible-playbook-roles]# cat host/hosts #查看主机列表
[test]
192.168.171.129
192.168.171.130
[root@localhost ansible-playbook-roles]# cat playbook-all-roles.yml #查看选择部署的某个role
#test: 为/etc/ansible/hosts中的主机列表 #task: 执行的任务
#name: 描述信息 #yum: yum模块,安装服务的
#copy: copy模块,远程传递文件的 #file: file模块,远程创建目录的
#service: service模块,远程管理服务的
#remote_user: root 是指定远程主机上使用的用户
#gather_facts: no 是默认执行playbook时候,默认会收集目标主机的信息,禁用掉能提高效率
---
#httpd role
- hosts: test
remote_user: root
gather_facts: no
#下面是调用相应的role,调用哪些role就部署哪些
roles:
#- role: httpd
#- role: nginx
#- role: tomcat
- role: mysql5.7
[root@localhost ansible-playbook-roles]# ls roles/ #查看里面所有的role,只看mysql5.7的
httpd mysql5.7 nginx tomcat
[root@localhost ansible-playbook-roles]# ls roles/mysql5.7/ #查看mysql5.7的role的层级结构
default files handlers meta tasks templates vars
[root@localhost ansible-playbook-roles]# ls roles/mysql5.7/default/ #default目录没用上,为空
为空
[root@localhost ansible-playbook-roles]# ls roles/mysql5.7/files/ #查看软件包、配置文件和启动脚本
my.cnf mysql-5.7.19-linux-glibc2.12-x86_64.tar.gz mysqld.service
[root@localhost ansible-playbook-roles]# cat roles/mysql5.7/files/my.cnf |grep 3306
port = 3306
port = 3306
[root@localhost ansible-playbook-roles]# cat roles/mysql5.7/files/mysqld.service
[Unit]
Description=MySQL Server
Documentation=man:mysqld(8)
Documentation=http://dev.mysql.com/doc/refman/en/using-systemd.html
After=network.target
After=syslog.target
[Install]
WantedBy=multi-user.target
[Service]
User=mysql
Group=mysql
ExecStart=/data/mysql5.7/bin/mysqld --defaults-file=/etc/my.cnf
LimitNOFILE = 15000
[root@localhost ansible-playbook-roles]# ls roles/mysql5.7/handlers/ #查看修改配置后触发的重启任务
main.yml
[root@localhost ansible-playbook-roles]# cat roles/mysql5.7/handlers/main.yml
#修改配置文件后触发服务启动时用
- name: restart #定义被触发的handler名称,当修改配置文件后会根据该名称触发重启服务
service: name=mysqld state=restarted
[root@localhost ansible-playbook-roles]# ls roles/mysql5.7/meta/ #meta目录没用上,为空
为空
[root@localhost ansible-playbook-roles]# ls roles/mysql5.7/tasks/ #查看所有任务和任务执行顺序
create_mysql_user_and_dir.yml install_mysql_yilai.yml main.yml transfer_mysql_config.yml transfer_mysql.yml
init_mysql.yml jieya_mv_mysql.yml service_mysql.yml transfer_mysqld_service.yml
[root@localhost ansible-playbook-roles]# cat roles/mysql5.7/tasks/main.yml
- include: install_mysql_yilai.yml
- include: transfer_mysql.yml
- include: jieya_mv_mysql.yml
- include: create_mysql_user_and_dir.yml
- include: transfer_mysql_config.yml
- include: init_mysql.yml
- include: transfer_mysqld_service.yml
- include: service_mysql.yml
[root@localhost ansible-playbook-roles]# cat roles/mysql5.7/tasks/install_mysql_yilai.yml
#安装mysql相关依赖
- name: install mysql yilai
yum: name=libaio-devel state=installed
[root@localhost ansible-playbook-roles]# cat roles/mysql5.7/tasks/transfer_mysql.yml
#传输mysql压缩包
- name: transfer mysql package
copy: src={{ src_mysql }} dest=/opt/
[root@localhost ansible-playbook-roles]# cat roles/mysql5.7/tasks/jieya_mv_mysql.yml
#解压mysql压缩包并移动,下面是判断,如果/data不存在则创建,如果存在则不创建
- name: create data
shell: cd / &&
[ ! -d data ] && mkdir data || break
- name: Unarchive mysql package
shell: cd /opt/ && tar -zxf {{ src_mysql }} &&
mv {{ mysql_jieyahou_name }} {{ mysql_install_dir }}
[root@localhost ansible-playbook-roles]# cat roles/mysql5.7/tasks/create_mysql_user_and_dir.yml
#创建mysql用户,数据目录和日志目录,并设置权限
- name: create mysql user
shell: user_name=`cat /etc/passwd|grep mysql|wc -l` &&
[ ${user_name} -eq 0 ] && useradd -s /sbin/nologin mysql || break
#useradd -s /sbin/nologin mysql &&
- name: create mysql log data
shell: mkdir {{ mysql_data_dir }} &&
mkdir {{ mysql_log_dir }} &&
chown -R mysql.mysql {{ mysql_install_dir }} &&
echo '''export PATH=/data/mysql5.7/bin/:$PATH''' >> ~/.bashrc &&
source ~/.bashrc
[root@localhost ansible-playbook-roles]# cat roles/mysql5.7/tasks/transfer_mysql_config.yml
#准备mysql配置文件,传输过去
- name: transfer my.conf
copy: src={{ config_mysql }} dest=/etc/
notify: restart #修改配置时候触发重启的handler名称,重新加载mysqld服务,需要和handlers目录中文件中名字一致
[root@localhost ansible-playbook-roles]# cat roles/mysql5.7/tasks/init_mysql.yml
#初始化mysql
- name: init mysql
shell: mysqld --initialize --user=mysql --basedir={{ mysql_install_dir }} --datadir={{ mysql_data_dir }}
[root@localhost ansible-playbook-roles]# cat roles/mysql5.7/tasks/transfer_mysqld_service.yml
#准备mysqld.service文件,传输过去,交给systemctl管理服务,并重新加载
- name: transfer mysqld.service
copy: src={{ service_mysql }} dest=/etc/systemd/system/
[root@localhost ansible-playbook-roles]# cat roles/mysql5.7/tasks/service_mysql.yml
#刷新service文件和启动mysql
- name: flush service conf
shell: systemctl daemon-reload &&
systemctl enable mysqld &&
systemctl start mysqld
#修改mysql的登录密码,初始化安装后的mysql,初始密码会在相应日志文件中,mysql_error.log中过滤password可以找出初始密码进行登录,然后登录mysql,使用set password='xx';修改密码
#下面在脚本中,非交互式登录mysql时,获取不到密码变量的密码,可以手动登录修改密码
#- name: change mysql password wei '123456'
# shell: init_mysql_pass=`cat /data/mysql5.7/log/mysql_error.log |grep password |awk '{print $NF}'` &&
# mysql -uroot -p'${init_mysql_pass}' -e "set password='123456';"
[root@localhost ansible-playbook-roles]# ls roles/mysql5.7/templates/ #为空,没用到
为空
[root@localhost ansible-playbook-roles]# ls roles/mysql5.7/vars/ #查看变量文件
main.yml
[root@localhost ansible-playbook-roles]# cat roles/mysql5.7/vars/main.yml #查看定义变量的内容
src_mysql: "mysql-5.7.19-linux-glibc2.12-x86_64.tar.gz"
mysql_install_dir: "/data/mysql5.7"
mysql_data_dir: "/data/mysql5.7/data"
mysql_log_dir: "/data/mysql5.7/log"
mysql_jieyahou_name: "mysql-5.7.19-linux-glibc2.12-x86_64"
config_mysql: "my.cnf"
service_mysql: "mysqld.service"
[root@localhost ansible-playbook-roles]# ansible-playbook -i host/hosts playbook-all-roles.yml #执行部署
所有被管理端:192.168.171.129和192.168.130查看mysql5.7服务部署和配置文件情况
[root@localhost ~]# ps -ef |grep mysql
mysql 18827 1 1 17:27 ? 00:00:00 /data/mysql5.7/bin/mysqld --defaults-file=/etc/my.cnf
root 18870 1180 0 17:28 pts/0 00:00:00 grep --color=auto mysql
[root@localhost ~]# cat /etc/my.cnf|grep 3306
port = 3306
port = 3306
[root@localhost ~]# netstat -anput |grep 3306
tcp6 0 0 :::3306 :::* LISTEN 18827/mysqld
[root@localhost ~]# cat /data/mysql5.7/log/mysql_error.log |grep password #查看默认初始登录密码
2023-04-09T17:27:32.136069+08:00 1 [Note] A temporary password is generated for root@localhost: Cf/f9nh+WEB.
[root@localhost ~]# source ~/.bashrc
[root@localhost ~]# mysql -uroot -p'Cf/f9nh+WEB.' #使用默认初始密码登录
mysql> set password='123'; #修改登录密码
mysql> quit
[root@localhost ~]# mysql -uroot -p'123' #使用新密码登录
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
mysql> quit