欢迎光临散文网 会员登陆 & 注册

5.ansible使用-playbook剧本+roles角色模式-案例实战

2023-06-15 00:02 作者:运维实战课程  | 我要投稿

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


5.ansible使用-playbook剧本+roles角色模式-案例实战的评论 (共 条)

分享到微博请遵守国家法律