Ansible实现LNMP+LNMT一键式部署

Ansible实现LNMP+LNMT一键式部署

 

整体LNMP+LNMT一键式部署的架构设计

 给被管理节点分发的密钥对

[root@ansible ~]# ssh-copy-id -i /root/.ssh/id_rsa.pub lnmp1

[root@ansible ~]# ssh-copy-id -i /root/.ssh/id_rsa.pub lnmp2

[root@ansible ~]# ssh-copy-id -i /root/.ssh/id_rsa.pub lnmt1

[root@ansible ~]# ssh-copy-id -i /root/.ssh/id_rsa.pub lnmt2

 

远程修改被管理节点的主机名:

[root@ansible myroles]# ansible lnmp1 -m shell -a 'hostnamectl set-hostname lnmp1'

lnmt1 | CHANGED | rc=0 >>

[root@ansible myroles]# ansible lnmp2 -m shell -a 'hostnamectl set-hostname lnmp2'

lnmt1 | CHANGED | rc=0 >>

[root@ansible myroles]# ansible lnmt1 -m shell -a 'hostnamectl set-hostname lnmt1'

lnmt1 | CHANGED | rc=0 >>

[root@ansible myroles]# ansible lnmt2 -m shell -a 'hostnamectl set-hostname lnmt2'

lnmt1 | CHANGED | rc=0 >>

 

 

 

创建ansible-playbook目录架构

[root@ansible myroles]# tree /myroles/

/myroles/

├── lnmp.yaml     #LNMP部署的入口配置文件

├── lnmt.yaml     #LNMT部署的入口配置文件

└── roles

    ├── jpress       # 部署jpress剧本的主目录

    │   ├── files    # 存放脚本,安装包的目录

    │   │   ├── build_jpress.sh   #自动部署jpress的脚本

    │   │   └── jpress-web-newest.war #jpress程序包

    │   ├── handlers            #部署完成需要执行的动作目录

    │   │   └── main.yaml      #动作执行文件

    │   ├── tasks               #安装任务的目录

    │   │   └── main.yaml      #安装任务清单文件

    │   ├── templates          #部署.j2配置文件的目录

    │   │   ├── nginx.j2       #nginx最终适用lnmt的配置文件

    │   │   └── server.j2       #tomcat最终适用lnmt的配置文件

    │   └── vars           #定义自定义变量的目录

    ├── mysql         #搭建mysql的playbook主目录

    │   ├── files

    │   │   ├── auto_mysql.sh       #自动安装mysql的脚本

    │   │   └── mysql-5.5.32-linux2.6-x86_64.tar.gz   #mysql二进制安装包

    │   ├── handlers

    │   ├── tasks

    │   │   └── main.yaml       #任务执行文件

    │   ├── templates

    │   └── vars

    ├── nginx              #搭建nginx的playbook主目录

    │   ├── files

    │   │   ├── auto_nginx.sh    #自动安装nginx的脚本

    │   │   └── nginx-1.10.2.tar.gz  #nginx的源码包

    │   ├── handlers

    │   │   └── main.yaml    #nginx的动作文件

    │   ├── tasks

    │   │   └── main.yaml    #nginx任务执行文件

    │   ├── templates

    │   └── vars

    ├── php         #搭建php的主playbook主目录

    │   ├── files

    │   │   ├── auto_php.sh   #自动安装php的脚本

    │   │   ├── libiconv-1.14.tar.gz  #libiconv的源码包

    │   │   ├── php-5.3.28.tar.gz  #php的源码包

    │   ├── handlers

    │   ├── tasks

    │   │   └── main.yaml   #php的任务执行文件

    │   ├── templates

    │   └── vars

    ├── tomcat      #搭建tomcat的主目录

    │   ├── files

    │   │   ├── apache-maven-3.3.9-bin.tar.gz  #maven的二进制包

    │   │   ├── apache-tomcat-8.5.65.tar.gz    #tomcat的二进制包

    │   │   ├── auto_tomcat.sh     #自动安装tomcat的脚本

    │   │   ├── jdk-16.0.1_linux-x64_bin.tar.gz   #jdk的二进制包

    │   │   ├── start_tomcat.sh   #启动tomcat的脚本

    │   │   └── stop_tomcat.sh   #关闭tomcat的脚本

    │   ├── handlers

    │   ├── tasks

    │   │   └── main.yaml   #执行任务的文件

    │   ├── templates 

    │   └── vars

    └── wordpress    #搭建wordpress的主目录

        ├── files

        │   ├── build_wordpress.sh   #部署wordpress的脚本

        │   └── wordpress-4.7.4-zh_CN.tar.gz  #wordpress的程序包

        ├── handlers

        │   └── main.yaml    #执行动作文件

        ├── tasks

        │   └── main.yaml   #执行任务文件

        ├── templates

        │   └── nginx.j2     #nginx适用LNMP架构的配置文件

        └── vars

 

37 directories, 32 files

 

 

PLAYBOOK的各roles的介绍

一、LNMP搭建过程:

 

Ansible-playbook入口配置文件lnmp.yaml

各部署任务按照先后顺序写入到文件中

---                                                                                                                                                

- hosts: lnmp

  gather_facts: True    #指定调用内置变量

  roles:

  - nginx

  - mysql

  - php

  - wordpress

 

 

Mysqlplaybook的搭建

[root@ansible files]# tree /myroles/roles/mysql/

/myroles/roles/mysql/

├── files

│   ├── auto_mysql.sh

│   └── mysql-5.5.32-linux2.6-x86_64.tar.gz

├── handlers

├── tasks

│   └── main.yaml

├── templates

└── vars

 

5 directories, 3 files

 

Files目录

[root@ansible files]# ls

auto_mysql.sh  mysql-5.5.32-linux2.6-x86_64.tar.gz

auto_mysql.sh脚本的明细:

 

#!/bin/bash                                                                                                                                        

# install mysql

# 状态码1:光盘挂载失败 2:MySQL配置文件与服务文件不存在 3:MySQL初始化错误 4:MySQL启动失败

# 运行脚本需要准备:确定源码包存放位置,光盘是否连接,登录密码设置为什么,

#光盘挂载

[ -d /media/cdrom ] || mkdir -p /media/cdrom

umount /dev/sr0

mount /dev/sr0 /media/cdrom &>/dev/null

[ $? -ne 0 ] && exit 1

yum -y install ncurses-devel libaio &> /dev/null

 

# 创建程序用户

USER_NAME='mysql'

 

useradd -M -s /sbin/nologin $USER_NAME

 

# mysql二进制安装

PAKDIR='/tmp'

CONF='/usr/local/mysql/support-files/my-medium.cnf'

SERFILE='/usr/local/mysql/support-files/mysql.server'

 

 

cd $PAKDIR

tar xf  mysql-5.5.32-linux2.6-x86_64.tar.gz -C /usr/local

mv /usr/local/mysql-5.5.32-linux2.6-x86_64/  /usr/local/mysql

if [ -f $SERFILE ] && [ -f $CONF ] ;then

    /bin/cp  $CONF /etc/my.cnf

    /bin/cp  $SERFILE /etc/init.d/mysqld

else

    exit 2

fi

chmod +x /etc/init.d/mysqld

ln -s /usr/local/mysql/bin/* /usr/local/bin/

 

# mysql初始化并启动,创建登录密码

 

PASSWD='123123'

BASEDIR='/usr/local/mysql'

DATADIR='/usr/local/mysql/data'

 

chown -R mysql.root $BASEDIR

chown -R mysql.mysql $DATADIR

/usr/local/mysql/scripts/mysql_install_db --user="$USER_NAME" --basedir="$BASEDIR" --datadir="$DATADIR"  &> /dev/null

 

[ $? -eq 0 ] && /etc/init.d/mysqld start &> /dev/null || exit 3

[ $? -eq 0 ] && /usr/local/mysql/bin/mysqladmin -uroot  password "$PASSWD" || exit 4

注意:脚本需要有可执行权限

 

handlers目录为空不做详述

 

tasks目录

[root@ansible tasks]# vim main.yaml

---

- name: copy

  copy: src=mysql-5.5.32-linux2.6-x86_64.tar.gz dest=/tmp/

- name: install_mysql

  script: auto_mysql.sh

  register: install_mysql

- debug: var=install_mysql 

 

Templates和vars目录为空,这里不做详述

 

 

Nigixplaybook的搭建

 

[root@ansible roles]# tree nginx/

nginx/

├── files

│   ├── auto_nginx.sh

│   └── nginx-1.10.2.tar.gz

├── handlers

│   └── main.yaml

├── tasks

│   └── main.yaml

├── templates

└── vars

 

5 directories, 4 files

 

Files目录

[root@ansible files]# ls

auto_nginx.sh  nginx-1.10.2.tar.gz

auto_nginx.sh脚本明细

[root@ansible files]# vim auto_nginx.sh

#!/bin/bash

#nginx install shell scripts

# 光盘挂载

test -d /media/cdrom || mkdir -p /medir/cdrom

mount  /dev/sr0 /media/cdrom &> /dev/null

 

# 安装依赖包

yum -y install gcc gcc-c++ make pcre pcre-devel zlib zlib-devel openssl openssl-devel &> /dev/null

 

# 源码安装NGINX

PAKDIR='/tmp/'

PRGUSER='nginx'

cd  $PAKDIR

tar xf nginx-1.10.2.tar.gz -C /usr/src/

useradd -M -s /sbin/nologin $PRGUSER

cd /usr/src/nginx-1.10.2/

./configure --prefix=/usr/local/nginx   --user=nginx --group=nginx --with-http_ssl_module --with-http_stub_status_module &> /dev/null

make &> /dev/null

make install &> /dev/null

ln -s /usr/local/nginx/sbin/* /usr/local/sbin/

 

#启动nginx                                                                                                                                          

/usr/local/sbin/nginx

 

注意:脚本需要有可执行权限

 

handlers目录为空不做详述

 

 

Tasks目录

[root@ansible tasks]# vim main.yaml

---

- name: copy

  copy: src=nginx-1.10.2.tar.gz dest=/tmp/

  register: copy_result

- debug: var=copy_result

- name: user

  user: name=nginx createhome=no shell=/sbin/nologin

- name: script

  script: auto_nginx.sh

  register: install_nginx

- debug: var=install_nginx  

 

Templates和vars目录为空,这里不做详述

 

PHPplaybook的搭建

[root@ansible roles]# tree php/

php/

├── files

│   ├── auto_php.sh

│   ├── libiconv-1.14.tar.gz

│   ├── php-5.3.28.tar.gz

│   ├── php-fpm.conf

│   └── php.ini

├── handlers

├── tasks

│   └── main.yaml

├── templates

└── vars

 

5 directories, 6 files

 

File目录

[root@ansible files]# ls

auto_php.sh  libiconv-1.14.tar.gz  php-5.3.28.tar.gz 

 

#!/bin/bash                                                                                                                                        

# install php

# 状态码1:光盘挂载失败 2:PHP源码预配置失败

 

# 光盘挂载

[ -d /media/cdrom ] || mkdir -p /media/cdrom

umount /dev/sr0

mount /dev/sr0 /media/cdrom &>/dev/null

[ $? -ne 0 ] && exit 1

yum -y install zlib-devel libxml2-devel libjpeg-devel libjpeg-turbo-devel libiconv-devel &> /dev/null

yum -y install freetype-devel libpng-devel gd libcurl-devel libxslt-devel &> /dev/null

 

# 安装libiconv库

PAKDIR='/tmp/'

 

 

cd $PAKDIR

tar xf libiconv-1.14.tar.gz -C /usr/src/

cd /usr/src/libiconv-1.14/

./configure --prefix=/usr/local/libiconv &> /dev/null

make &>/dev/null

make install &>/dev/null

 

# 安装libmcrypt库

yum -y install libmcrypt-devel &> /dev/null

# 安装mhash加密扩展库

yum -y install mhash &> /dev/null

 

# 安装mcrvpt加密扩展库

yum -y install mcrypt &>/dev/null

 

# 安装php服务,

#  如果是分离式部署,请将--with-mysql=/usr/local/mysql \替换为以下两行

#  指定php调用自带的mysql客户端工具 --with-mysqli=mysqlnd \

#  指定php调用本地的mysql驱动           --with-pdo-mysql=mysqlnd \

#  指定用户需要跟nginx的程序用户保持一致,如有需要需要修改以下配置项:

#   --with-fpm-user=www \

#   --with-fpm-group=www \

cd $PAKDIR

tar xf php-5.3.28.tar.gz -C /usr/src/

cd /usr/src/php-5.3.28/

./configure \

--prefix=/usr/local/php5.3.28 \

--with-mysql=/usr/local/mysql \

--with-iconv-dir=/usr/local/libiconv \

--with-freetype-dir \

--with-jpeg-dir \

--with-png-dir \

--with-zlib \

--with-libxml-dir=/usr \

--enable-xml \

--disable-rpath \

--enable-safe-mode \

--enable-bcmath \

--enable-shmop \

--enable-sysvsem \

--enable-inline-optimization \

--with-curl \

--with-curlwrappers \

--enable-mbregex \

--enable-fpm \

--enable-mbstring \

--with-mcrypt \

--with-gd \

--enable-gd-native-ttf \

--with-openssl \

--with-mhash \                   

--enable-pcntl \

--enable-sockets \

--with-xmlrpc \

--enable-zip \

--enable-soap \

--enable-short-tags \

--enable-zend-multibyte \

--enable-static \

--with-xsl \

--with-fpm-user=nginx \

--with-fpm-group=nginx \

--enable-ftp &>/dev/null

[ $? -ne 0  ] && exit 2

ln -s /usr/local/mysql/lib/libmysqlclient.so.18 /usr/lib64/

touch /usr/src/php-5.3.28/ext/phar/phar.phar

make &> /dev/null

make install &> /dev/null

ln -s /usr/local/php5.3.28/ /usr/local/php

 

# 拷贝PHP的配置文件,建议做到剧本的拷贝模板中

cp /usr/src/php-5.3.28/php.ini-production /usr/local/php/lib/php.ini

cp /usr/local/php/etc/php-fpm.conf.default /usr/local/php/etc/php-fpm.conf

 

#启动PHP服务

 

/usr/local/php/sbin/php-fpm                                                                                                                         

                               

注意:脚本需要有可执行权限

 

handlers目录为空不做详述

 

tasks目录

[root@ansible tasks]# vim main.yaml

---

- name: copy_libiconv

  copy: src=libiconv-1.14.tar.gz dest=/tmp/

- name: copy_php-5.3.28

  copy: src=php-5.3.28.tar.gz dest=/tmp/

- name: install_php

  script: auto_php.sh      

 

Templates和vars目录为空,这里不做详述

 

Wordpressplaybook的搭建

[root@ansible roles]# tree wordpress/

wordpress/

├── files

│   ├── build_wordpress.sh

│   └── wordpress-4.7.4-zh_CN.tar.gz

├── handlers

│   └── main.yaml

├── tasks

│   └── main.yaml

├── templates

│   └── nginx.j2

└── vars

 

5 directories, 5 files

 

Files目录

[root@ansible files]# ls

build_wordpress.sh  wordpress-4.7.4-zh_CN.tar.gz  #wordpress程序包

 

build_wordpress.sh脚本明细

[root@ansible files]# vim build_wordpress.sh

#!/bin/bash

# build wordpress

 

#登录数据库创建一个wordpress库以及授权登录用户

CMD='/usr/local/mysql/bin'

PASSWD='123123'

USER='wordpress'

IPADDR='localhost'

LOGPASS='123123'

$CMD/mysql -uroot -p$PASSWD -e "create database wordpress;" &>/dev/null

$CMD/mysql -uroot -p$PASSWD -e "use wordpress;grant all on wordpress.* to "$USER"@"$IPADDR" identified by '$LOGPASS';flush privileges;" &>/dev/null

 

#部署wordpress程序

PRG_USER='nginx'

SITE='/usr/local/nginx/html/blogcom'

cd  $SITE

tar xf wordpress-4.7.4-zh_CN.tar.gz

mv wordpress-4.7.4-zh_CN.tar.gz /root/

mv wordpress/* ./

cd

chown -R $PRG_USER.$PRG_USER  $SITE        

注意:脚本需要有可执行权限

 

Handlers目录

[root@ansible handlers]# vim main.yaml

---

- name: start_nginx

  shell: /usr/local/nginx/sbin/nginx

- name: reload_nginx

  shell: /usr/local/nginx/sbin/nginx -s reload

- name: stop_nginx

  shell: /usr/local/nginx/sbin/nginx -s stop

 

Tasks目录

[root@ansible tasks]# vim main.yaml

---

- name: copy_wordpress

  copy: src=wordpress-4.7.4-zh_CN.tar.gz dest=/usr/local/nginx/html/blogcom/ 

- name: build_wordpress

  script: build_wordpress.sh

- name: template_conf

  template: src=nginx.j2 dest=/usr/local/nginx/conf/nginx.conf backup=yes

  notify: reload_nginx

 

Templates目录

[root@ansible templates]# ls

nginx.j2   #最终搭建wordpress的nginx配置文件

 

nginx.j2的明细

[root@ansible templates]# vim nginx.j2

worker_processes  {{ ansible_processor_count }};                                                                                                    

events {

    worker_connections  1024;

}

http {

    include       mime.types;

    default_type  application/octet-stream;

    sendfile        on;

    keepalive_timeout  65;

    server {

        listen       80;

        server_name  localhost;

        location / {

            root   html/blogcom;

            index  index.php index.html index.htm;

        if (-f $request_filename/index.html) {

            rewrite (.*) $1/index.html break;

            }

        if (-f $request_filename/index.php) {

            rewrite (.*) $1/index.php;

            }

        if (!-f $request_filename) {

        rewrite (.*) /index.php;

            }

       }

        location ~ .*\.(php|php5)?$ {

            root html/blogcom;

            fastcgi_pass 127.0.0.1:9000;

            fastcgi_index index.php;

            include fastcgi.conf;

        }

    }

}            

 

 

到此lnmp的playbook就部署完成,只剩下测试:

 

ansible本地测试,如果成功,就可以实机部署了

[root@ansible myroles]# ansible-playbook -C lnmp.yaml

 

PLAY [lnmp] ****************************************************************************************************************************************

 

TASK [Gathering Facts] *****************************************************************************************************************************

ok: [lnmp2]

ok: [lnmp1]

 

TASK [nginx : copy] ********************************************************************************************************************************

ok: [lnmp2]

ok: [lnmp1]

 

TASK [nginx : debug] *******************************************************************************************************************************

ok: [lnmp1] => {

    "copy_result": {

        "changed": false,

        "checksum": "1bafb1557b8d5f992714c0dcbde77036bde98547",

        "dest": "/tmp/nginx-1.10.2.tar.gz",

        "diff": {

            "after": {

                "path": "/tmp/nginx-1.10.2.tar.gz"

            },

            "before": {

                "path": "/tmp/nginx-1.10.2.tar.gz"

            }

        },

        "failed": false,

        "gid": 0,

        "group": "root",

        "mode": "0644",

        "owner": "root",

        "path": "/tmp/nginx-1.10.2.tar.gz",

        "secontext": "unconfined_u:object_r:admin_home_t:s0",

        "size": 910812,

        "state": "file",

        "uid": 0

    }

}

ok: [lnmp2] => {

    "copy_result": {

        "changed": false,

        "checksum": "1bafb1557b8d5f992714c0dcbde77036bde98547",

        "dest": "/tmp/nginx-1.10.2.tar.gz",

        "diff": {

            "after": {

                "path": "/tmp/nginx-1.10.2.tar.gz"

            },

            "before": {

                "path": "/tmp/nginx-1.10.2.tar.gz"

            }

        },

        "failed": false,

        "gid": 0,

        "group": "root",

        "mode": "0644",

        "owner": "root",

        "path": "/tmp/nginx-1.10.2.tar.gz",

        "secontext": "unconfined_u:object_r:admin_home_t:s0",

        "size": 910812,

        "state": "file",

        "uid": 0

    }

}

 

TASK [nginx : user] ********************************************************************************************************************************

ok: [lnmp1]

ok: [lnmp2]

 

TASK [nginx : script] ******************************************************************************************************************************

changed: [lnmp1]

changed: [lnmp2]

 

TASK [nginx : debug] *******************************************************************************************************************************

ok: [lnmp1] => {

    "install_nginx": {

        "changed": true,

        "failed": false

    }

}

ok: [lnmp2] => {

    "install_nginx": {

        "changed": true,

        "failed": false

    }

}

 

TASK [mysql : copy] ********************************************************************************************************************************

ok: [lnmp1]

ok: [lnmp2]

 

TASK [install_mysql] *******************************************************************************************************************************

changed: [lnmp1]

changed: [lnmp2]

 

TASK [mysql : debug] *******************************************************************************************************************************

ok: [lnmp1] => {

    "install_mysql": {

        "changed": true,

        "failed": false

    }

}

ok: [lnmp2] => {

    "install_mysql": {

        "changed": true,

        "failed": false

    }

}

 

TASK [php : copy_libiconv] *************************************************************************************************************************

ok: [lnmp1]

ok: [lnmp2]

 

TASK [copy_php-5.3.28] *****************************************************************************************************************************

ok: [lnmp2]

ok: [lnmp1]

 

TASK [install_php] *********************************************************************************************************************************

changed: [lnmp2]

changed: [lnmp1]

 

TASK [copy_wordpress] ******************************************************************************************************************************

changed: [lnmp1]

changed: [lnmp2]

 

TASK [build_wordpress] *****************************************************************************************************************************

changed: [lnmp2]

changed: [lnmp1]

 

TASK [wordpress : template_conf] *******************************************************************************************************************

changed: [lnmp2]

changed: [lnmp1]

 

RUNNING HANDLER [wordpress : reload_nginx] *********************************************************************************************************

skipping: [lnmp1]

skipping: [lnmp2]

 

PLAY RECAP *****************************************************************************************************************************************

lnmp1                      : ok=15   changed=6    unreachable=0    failed=0    skipped=1    rescued=0    ignored=0  

lnmp2                      : ok=15   changed=6    unreachable=0    failed=0    skipped=1    rescued=0    ignored=0  

 

从以上信息看,都已经检测成功,剩下的实机检测就不做介绍了

 

 

 

二、LNMT搭建过程:

 

1.Ansible-playbook入口配置文件lnmt.yaml

各部署任务按照先后顺序写入到文件中

---

- hosts: lnmt

  gather_facts: True

  roles:

  - nginx

  - mysql

  - tomcat

  - jpress     

 

 

2.Mysqlplaybook的搭建

[root@ansible files]# tree /myroles/roles/mysql/

/myroles/roles/mysql/

├── files

│   ├── auto_mysql.sh

│   └── mysql-5.5.32-linux2.6-x86_64.tar.gz

├── handlers

├── tasks

│   └── main.yaml

├── templates

└── vars

 

5 directories, 3 files

 

Files目录

[root@ansible files]# ls

auto_mysql.sh  mysql-5.5.32-linux2.6-x86_64.tar.gz

auto_mysql.sh脚本的明细:

 

#!/bin/bash                                                                                                                                        

# install mysql

# 状态码1:光盘挂载失败 2:MySQL配置文件与服务文件不存在 3:MySQL初始化错误 4:MySQL启动失败

# 运行脚本需要准备:确定源码包存放位置,光盘是否连接,登录密码设置为什么,

#光盘挂载

[ -d /media/cdrom ] || mkdir -p /media/cdrom

umount /dev/sr0

mount /dev/sr0 /media/cdrom &>/dev/null

[ $? -ne 0 ] && exit 1

yum -y install ncurses-devel libaio &> /dev/null

 

# 创建程序用户

USER_NAME='mysql'

 

useradd -M -s /sbin/nologin $USER_NAME

 

# mysql二进制安装

PAKDIR='/tmp'

CONF='/usr/local/mysql/support-files/my-medium.cnf'

SERFILE='/usr/local/mysql/support-files/mysql.server'

 

 

cd $PAKDIR

tar xf  mysql-5.5.32-linux2.6-x86_64.tar.gz -C /usr/local

mv /usr/local/mysql-5.5.32-linux2.6-x86_64/  /usr/local/mysql

if [ -f $SERFILE ] && [ -f $CONF ] ;then

    /bin/cp  $CONF /etc/my.cnf

    /bin/cp  $SERFILE /etc/init.d/mysqld

else

    exit 2

fi

chmod +x /etc/init.d/mysqld

ln -s /usr/local/mysql/bin/* /usr/local/bin/

 

# mysql初始化并启动,创建登录密码

 

PASSWD='123123'

BASEDIR='/usr/local/mysql'

DATADIR='/usr/local/mysql/data'

 

chown -R mysql.root $BASEDIR

chown -R mysql.mysql $DATADIR

/usr/local/mysql/scripts/mysql_install_db --user="$USER_NAME" --basedir="$BASEDIR" --datadir="$DATADIR"  &> /dev/null

 

[ $? -eq 0 ] && /etc/init.d/mysqld start &> /dev/null || exit 3

[ $? -eq 0 ] && /usr/local/mysql/bin/mysqladmin -uroot  password "$PASSWD" || exit 4

注意:脚本需要有可执行权限

 

handlers目录为空不做详述

 

tasks目录

[root@ansible tasks]# vim main.yaml

---

- name: copy

  copy: src=mysql-5.5.32-linux2.6-x86_64.tar.gz dest=/tmp/

- name: install_mysql

  script: auto_mysql.sh

  register: install_mysql

- debug: var=install_mysql 

 

Templates和vars目录为空,这里不做详述

 

 

3.Nigixplaybook的搭建

 

[root@ansible roles]# tree nginx/

nginx/

├── files

│   ├── auto_nginx.sh

│   └── nginx-1.10.2.tar.gz

├── handlers

│   └── main.yaml

├── tasks

│   └── main.yaml

├── templates

└── vars

 

5 directories, 4 files

 

Files目录

[root@ansible files]# ls

auto_nginx.sh  nginx-1.10.2.tar.gz

auto_nginx.sh脚本明细

[root@ansible files]# vim auto_nginx.sh

#!/bin/bash

#nginx install shell scripts

# 光盘挂载

test -d /media/cdrom || mkdir -p /medir/cdrom

mount  /dev/sr0 /media/cdrom &> /dev/null

 

# 安装依赖包

yum -y install gcc gcc-c++ make pcre pcre-devel zlib zlib-devel openssl openssl-devel &> /dev/null

 

# 源码安装NGINX

PAKDIR='/tmp/'

PRGUSER='nginx'

cd  $PAKDIR

tar xf nginx-1.10.2.tar.gz -C /usr/src/

useradd -M -s /sbin/nologin $PRGUSER

cd /usr/src/nginx-1.10.2/

./configure --prefix=/usr/local/nginx   --user=nginx --group=nginx --with-http_ssl_module --with-http_stub_status_module &> /dev/null

make &> /dev/null

make install &> /dev/null

ln -s /usr/local/nginx/sbin/* /usr/local/sbin/

 

#启动nginx                                                                                                                                          

/usr/local/sbin/nginx

 

注意:脚本需要有可执行权限

 

handlers目录为空不做详述

 

 

Tasks目录

[root@ansible tasks]# vim main.yaml

---

- name: copy

  copy: src=nginx-1.10.2.tar.gz dest=/tmp/

  register: copy_result

- debug: var=copy_result

- name: user

  user: name=nginx createhome=no shell=/sbin/nologin

- name: script

  script: auto_nginx.sh

  register: install_nginx

- debug: var=install_nginx  

 

Templates和vars目录为空,这里不做详述

 

4.TOMCATplaybook的搭建

[root@ansible roles]# tree tomcat/

tomcat/

├── files

│   ├── apache-maven-3.3.9-bin.tar.gz

│   ├── apache-tomcat-8.5.65.tar.gz

│   ├── auto_tomcat.sh

│   ├── jdk-16.0.1_linux-x64_bin.tar.gz

│   ├── start_tomcat.sh

│   └── stop_tomcat.sh

├── handlers

├── tasks

│   └── main.yaml

├── templates

└── vars

 

5 directories, 7 files

File目录

[root@ansible files]# ls |xargs -n1

apache-maven-3.3.9-bin.tar.gz

apache-tomcat-8.5.65.tar.gz

auto_tomcat.sh

jdk-16.0.1_linux-x64_bin.tar.gz

start_tomcat.sh

stop_tomcat.sh

 

自动安装tomcat的脚本明细:

[root@ansible files]# vim auto_tomcat.sh

#!/bin/bash                                                                                                                                        

# install tomcat

PAKDIR='/tmp/'

# 部署Java环境JDK

cd $PAKDIR

tar xf jdk-16.0.1_linux-x64_bin.tar.gz  -C /usr/local/

[ $? -eq 0 ] && ln -s /usr/local/jdk-16.0.1  /usr/local/jdk || exit 2

# 配置Java环境变量

sed -i.ori '$a export JAVA_HOME=/usr/local/jdk\nexport PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH\nexport CLASSPATH=.$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/lib/tools.jar' /etc/profile

chown -R root.root /usr/local/jdk/

 

# 部署tomcat

cd $PAKDIR

tar xf apache-tomcat-8.5.65.tar.gz -C /usr/local/

[ $? -eq 0 ] && ln -s /usr/local/apache-tomcat-8.5.65/ /usr/local/tomcat || exit 3

echo 'export TOMCAT_HOME=/usr/local/tomcat' >> /etc/profile

chown -R root.root /usr/local/tomcat/

 

# 部署MAVEN

cd $PAKDIR

tar xf apache-maven-3.3.9-bin.tar.gz -C /usr/local/

[ $? -eq 0 ] && ln -s /usr/local/apache-maven-3.3.9 /usr/local/maven || exit 2

sed -i.ori '$a export MAVEN_HOME=/usr/local/maven\nexport PATH="$MAVEN_HOME/bin:$PATH"' /etc/profile ||exit 3                                                                                                                      

                               

注意:脚本需要有可执行权限!!!

 

开启tomcat的脚本明细:

此部分需要说下搭建心得,由于需要实现部署完成后tomcat能够自动正常开启服务,但是由于jdk,tomcat,maven的环境变量问题,通过ansible远程是无法全局生效,造成开启服务的时候找不到java的环境变量,为了解决这个问题,从网上查询了很多资料,得到了这个启发,将环境变量写到开启脚本中,然后通过开启脚本再调用tomcat的startup.sh,来实现开启服务时能够找到环境变量。

重要的事情说三遍:加执行权限!加执行权限!加执行权限!

--------------------------------------------------------------------------------------------------------------------------------

参考地址:

https://blog.csdn.net/weixin_39805387/article/details/111264856?utm_medium=distribute.pc_aggpage_search_result.none-task-blog-2~aggregatepage~first_rank_v2~rank_aggregation-1-111264856.pc_agg_rank_aggregation&utm_term=linux+%E8%BF%9C%E7%A8%8B%E7%94%9F%E6%95%88%E7%8E%AF%E5%A2%83%E5%8F%98%E9%87%8F&spm=1000.2123.3001.4430

 

[root@ansible files]# vim start_tomcat.sh

#!/bin/bash

# tomcat启动脚本

 

 

export JAVA_HOME=/usr/local/jdk

export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH

export CLASSPATH=.$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/lib/tools.jar

export TOMCAT_HOME=/usr/local/tomcat

export MAVEN_HOME=/usr/local/maven

export PATH="$MAVEN_HOME/bin:$PATH"

 

#启动tomcat

cd /usr/local/tomcat/bin/ && ./startup.sh

PS=`ps -ef |grep '/usr/local/tomcat' |grep -v grep|awk '{print $2}'|wc -l`

sleep 5

if [ $PS -ne 0 ];then

  echo "tomcat started"

else                                                                                                                                                

  echo "tomcat start_false"

fi

 

 

关闭tomcat的脚本明细:

由于在最后搭建完成jpress后需要把最终的tomcat的配置文件导入到被管理节点的tomcat将原先的配置文件进行覆盖,需要在此之前关闭tomcat服务,也是由于jave的变量问题,无法通过ansible实现远程source /etc/profile的功能,故采用关闭脚本来调用tomcat的关闭脚本,实现变量的调用,能够正常达到关闭tomcat的效果。

重要的事情说三遍:加执行权限!加执行权限!加执行权限!

---------------------------------------------------------------------------------------------------------------------------------

 

[root@ansible files]# vim stop_tomcat.sh

#!/bin/bash

# tomcat停止脚本

 

 

export JAVA_HOME=/usr/local/jdk

export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH

export CLASSPATH=.$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/lib/tools.jar

export TOMCAT_HOME=/usr/local/tomcat

export MAVEN_HOME=/usr/local/maven

export PATH="$MAVEN_HOME/bin:$PATH"

 

#启动tomcat

cd /usr/local/tomcat/bin/ && ./shutdown.sh

PS=`ps -ef |grep '/usr/local/tomcat' |grep -v grep|awk '{print $2}'|wc -l`

sleep 5

if [ $PS -eq 0 ];then

  echo "tomcat stoped"

else                                                                                                                                               

  echo "tomcat stop_false"                                                                                                                          

fi

 

handlers目录为空不做详述

 

tasks目录

[root@ansible tasks]# vim main.yaml

---

- name: copy_script

  copy: src=auto_tomcat.sh dest=/tmp/ mode=0755

- name: copy_jdk

  copy: src=jdk-16.0.1_linux-x64_bin.tar.gz dest=/tmp/

- name: copy_tomcat

  copy: src=apache-tomcat-8.5.65.tar.gz  dest=/tmp/

- name: copy_maven

  copy: src=apache-maven-3.3.9-bin.tar.gz  dest=/tmp/

- name: install_tomcat

  shell: /tmp/auto_tomcat.sh

- name: copy_start_script

  copy: src=start_tomcat.sh dest=/usr/local/tomcat/bin/ mode=0755  #mode保留执行权限

- name: copy_stop_script

  copy: src=stop_tomcat.sh  dest=/usr/local/tomcat/bin/ mode=0755 #mode保留执行权限

- name: start_tomcat

  shell: nohup  sh  /usr/local/tomcat/bin/start_tomcat.sh

  register: start_result

- debug: var=start_result  

 

以上任务的start_tomcat需要说明一下:

- name: start_tomcat

  shell: nohup  sh  /usr/local/tomcat/bin/start_tomcat.sh  #脚本的绝对路径

解释:

nohup  :在后台运行此脚本  

sh     :通过shell来运行脚本

 

使用nohup的原因:

Ansible执行命令,默认不加载环境变量,nohup参数让脚本在后台运行,就可以加载里面的环境变量,这也是为什么上面编写的开启和关闭tomcat脚本的主要原因。

 

Templates和vars目录为空,这里不做详述

 

5.jpressplaybook的搭建

[root@ansible roles]# tree jpress/

jpress/

├── files

│   ├── build_jpress.sh

│   └── jpress-web-newest.war

├── handlers

│   └── main.yaml

├── tasks

│   └── main.yaml

├── templates

│   ├── nginx.j2

│   └── server.j2

└── vars

 

5 directories, 6 files

Files目录

[root@ansible files]# ls

build_jpress.sh  jpress-web-newest.war

 

build_jpress.sh脚本明细

[root@ansible files]# vim build_jpress.sh

#!/bin/bash                                                                                                                                        

# build_jpress

 

# 创建jpress的数据库及授权jpress的数据库账号

CMD='/usr/local/mysql/bin'

PASSWD='123123'

USER='jpress'

IPADDR='localhost'

LOGPASS='123123'

DATABASE='jpress'

 

$CMD/mysql -uroot -p$PASSWD -e "create database $DATABASE;" &>/dev/null

$CMD/mysql -uroot -p$PASSWD -e "use $DATABASE;grant all on $DATABASE.* to "$USER"@"$IPADDR" identified by '$LOGPASS';flush privileges;" &>/dev/null

 

 

# 部署Jpress

PAKDIR='/tmp/'

MANDIR='/usr/local/tomcat/webapps/'

WEBDIR='/usr/local/tomcat/webapps/ROOT/'

cd $WEBDIR

rm -rf ./*

cd $MANDIR

rm -rf docs  *m*

cd $PAKDIR

mv jpress-web-newest.war $WEBDIR

 cd $WEBDIR

/usr/local/jdk/bin/jar  xf jpress-web-newest.war      

注意:脚本需要有可执行权限

 

Handlers目录

[root@ansible handlers]# vim main.yaml

---                                                                                                                                                

- name: start_tomcat

  shell: nohup sh /usr/local/tomcat/bin/start_tomcat.sh  #通过开启脚本来调用tomcat自带开启脚本

- name: stop_tomcat

  shell: nohup sh /usr/local/tomcat/bin/stop_tomcat.sh #通过关闭脚本来调用tomcat自带关闭脚本

- name: start_nginx

  shell: /usr/local/nginx/sbin/nginx

- name: reload_nginx

  shell: /usr/local/nginx/sbin/nginx -s reload

 

Tasks目录

[root@ansible tasks]# vim main.yaml

---

- name: copy_script

  copy: src=build_jpress.sh dest=/tmp/ mode=0755

- name: copy_jpress

  copy: src=jpress-web-newest.war dest=/tmp/

- name: build_jpress

  shell: /tmp/build_jpress.sh

- name: stop_tomcat

  shell: nohup sh  /usr/local/tomcat/bin/stop_tomcat.sh                                                                                            

- name: template_server.j2

  template: src=server.j2 dest=/usr/local/tomcat/conf/server.xml backup=yes

  notify: start_tomcat

- name: template_nginx.j2

  template: src=nginx.j2 dest=/usr/local/nginx/conf/nginx.conf backup=yes

  notify: reload_nginx                                    

 

Templates目录

[root@ansible templates]# ls |xargs -n1

nginx.j2  #最终实现jpress服务的nginx的配置文件

server.j2  #最终实现jpress服务的tomcat的配置文件

 

nginx.j2的明细

[root@ansible templates]# vim nginx.j2

worker_processes  {{ ansible_processor_count }};                                                                                                   

events {

    worker_connections  1024;

}

http {

    include       mime.types;

    default_type  application/octet-stream;

    sendfile        on;

    keepalive_timeout  65;

    upstream tomcat_pools {

        server 127.0.0.1:8080;

    }

    server {

        listen       80;

        server_name  localhost;

        location / {

            proxy_pass http://tomcat_pools;

            proxy_set_header host $host;

            proxy_set_header x-forwarded-for $remote_addr;

            proxy_connect_timeout 60;

            proxy_send_timeout 60;

            proxy_read_timeout 60;

            proxy_buffer_size 4k;

            proxy_buffers 4 32k;

            proxy_busy_buffers_size 64k;       }

            proxy_temp_file_write_size 64k;

       }

    }

}                        

 

Tomcat最终的server.j2文件

[root@ansible templates]# vim server.j2

<?xml version='1.0' encoding='utf-8'?>

<!--

  Licensed to the Apache Software Foundation (ASF) under one or more

  contributor license agreements.  See the NOTICE file distributed with

  this work for additional information regarding copyright ownership.

  The ASF licenses this file to You under the Apache License, Version 2.0

  (the "License"); you may not use this file except in compliance with

  the License.  You may obtain a copy of the License at

 

      http://www.apache.org/licenses/LICENSE-2.0

 

  Unless required by applicable law or agreed to in writing, software

  distributed under the License is distributed on an "AS IS" BASIS,

  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

  See the License for the specific language governing permissions and

  limitations under the License.

-->

<!-- Note:  A "Server" is not itself a "Container", so you may not

     define subcomponents such as "Valves" at this level.

     Documentation at /docs/config/server.html

 -->

<Server port="8010" shutdown="SHUTDOWN">  #关闭端口默认为8005,修改非8005端口

  <Listener className="org.apache.catalina.startup.VersionLoggerListener" />

  <!-- Security listener. Documentation at /docs/config/listeners.html

  <Listener className="org.apache.catalina.security.SecurityListener" />

  -->

  <!--APR library loader. Documentation at /docs/apr.html -->

  <Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />

  <!-- Prevent memory leaks due to use of particular java/javax APIs-->

  <Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />

  <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />

  <Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener" />

 

  <!-- Global JNDI resources

       Documentation at /docs/jndi-resources-howto.html

  -->

  <GlobalNamingResources>

    <!-- Editable user database that can also be used by

         UserDatabaseRealm to authenticate users

    -->

    <Resource name="UserDatabase" auth="Container"

              type="org.apache.catalina.UserDatabase"

              description="User database that can be updated and saved"

              factory="org.apache.catalina.users.MemoryUserDatabaseFactory"

              pathname="conf/tomcat-users.xml" />

  </GlobalNamingResources>

 

  <!-- A "Service" is a collection of one or more "Connectors" that share

       a single "Container" Note:  A "Service" is not itself a "Container",

       so you may not define subcomponents such as "Valves" at this level.

       Documentation at /docs/config/service.html

   -->

  <Service name="Catalina">

 

    <!--The connectors can use a shared executor, you can define one or more named thread pools-->

    <!--

    <Executor name="tomcatThreadPool" namePrefix="catalina-exec-"

        maxThreads="150" minSpareThreads="4"/>

    -->

 

 

    <!-- A "Connector" represents an endpoint by which requests are received

         and responses are returned. Documentation at :

         Java HTTP Connector: /docs/config/http.html (blocking & non-blocking)

         Java AJP  Connector: /docs/config/ajp.html

         APR (HTTP/AJP) Connector: /docs/apr.html

         Define a non-SSL/TLS HTTP/1.1 Connector on port 8080

    -->

    <Connector port="8080" protocol="HTTP/1.1"

               connectionTimeout="20000" enableLookups="false" acceptCount="800"

               redirectPort="8443" />

    <!-- A "Connector" using the shared thread pool-->

    <!--

    <Connector executor="tomcatThreadPool"

               port="8080" protocol="HTTP/1.1"

               connectionTimeout="20000"

               redirectPort="8443" />

    -->

    <!-- Define a SSL/TLS HTTP/1.1 Connector on port 8443

         This connector uses the NIO implementation that requires the JSSE

         style configuration. When using the APR/native implementation, the

         OpenSSL style configuration is required as described in the APR/native

         documentation -->

    <!--

    <Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol"

               maxThreads="150" SSLEnabled="true" scheme="https" secure="true"

               clientAuth="false" sslProtocol="TLS" />

    -->

 

    <!-- Define an AJP 1.3 Connector on port 8009 -->

    <!--

<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />

-->  #将AJP协议端口,对我们来说没有用,所以注释掉

 

    <!-- An Engine represents the entry point (within Catalina) that processes

         every request.  The Engine implementation for Tomcat stand alone

         analyzes the HTTP headers included with the request, and passes them

         on to the appropriate Host (virtual host).

         Documentation at /docs/config/engine.html -->

 

    <!-- You should set jvmRoute to support load-balancing via AJP ie :

    <Engine name="Catalina" defaultHost="localhost" jvmRoute="jvm1">

    -->

    <Engine name="Catalina" defaultHost="localhost">

 

      <!--For clustering, please take a look at documentation at:

          /docs/cluster-howto.html  (simple how to)

          /docs/config/cluster.html (reference documentation) -->

      <!--

      <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/>

      -->

 

      <!-- Use the LockOutRealm to prevent attempts to guess user passwords

           via a brute-force attack -->

      <Realm className="org.apache.catalina.realm.LockOutRealm">

        <!-- This Realm uses the UserDatabase configured in the global JNDI

             resources under the key "UserDatabase".  Any edits

             that are performed against this UserDatabase are immediately

             available for use by the Realm.  -->

        <Realm className="org.apache.catalina.realm.UserDatabaseRealm"

               resourceName="UserDatabase"/>

      </Realm>

 

      <Host name="localhost"  appBase="webapps" #定义域名以及web服务根目录

            unpackWARs="true" autoDeploy="true">

        <Context path="" docBase="/usr/local/tomcat/webapps/ROOT" debug="0" reloadable="false" crossContext="true"/>

 

 #context表示一个web服务,即war文件,path是配置uri的路径,为空就是默认到webapps/ROOT下,如果配置了uri则会去webapps下按照配置路径下去找ROOT,reloadable这个属性非常重要,如果为true,则tomcat会自动检测应用程序的/WEB-INF/lib 和/WEB-INF/classes目录的变化,自动装载新的应用程序,可以在不重启tomcat的情况下改变应用程序,所以配置为false。

 

        <!-- SingleSignOn valve, share authentication between web applications

             Documentation at: /docs/config/valve.html -->

        <!--

        <Valve className="org.apache.catalina.authenticator.SingleSignOn" />

        -->

 

        <!-- Access log processes all example.

             Documentation at: /docs/config/valve.html

             Note: The pattern used is equivalent to using pattern="common" -->

        <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"

               prefix="localhost_access_log" suffix=".txt"

               pattern="%h %l %u %t &quot;%r&quot; %s %b" />

 

      </Host>

    </Engine>

  </Service>                                                                                                                                        

</Server>

 

到此lnmt的playbook就部署完成,只剩下测试:

 

Ansible-playbook本地进行测试:

[root@ansible myroles]# ansible-playbook -C lnmt.yaml

 

PLAY [lnmt] ****************************************************************************************************************************************

 

TASK [Gathering Facts] *****************************************************************************************************************************

ok: [lnmt1]

 

TASK [nginx : copy] ********************************************************************************************************************************

ok: [lnmt1]

 

TASK [nginx : debug] *******************************************************************************************************************************

ok: [lnmt1] => 

}

 

TASK [nginx : user] ********************************************************************************************************************************

ok: [lnmt1]

 

TASK [nginx : script] ******************************************************************************************************************************

changed: [lnmt1]

 

TASK [nginx : debug] *******************************************************************************************************************************

ok: [lnmt1] => {

}

 

TASK [mysql : copy] ********************************************************************************************************************************

ok: [lnmt1]

 

TASK [install_mysql] *******************************************************************************************************************************

changed: [lnmt1]

 

TASK [mysql : debug] *******************************************************************************************************************************

ok: [lnmt1] => {

 

TASK [tomcat : copy_script] ************************************************************************************************************************

ok: [lnmt1]

 

TASK [tomcat : copy_jdk] ***************************************************************************************************************************

ok: [lnmt1]

 

TASK [copy_tomcat] *********************************************************************************************************************************

ok: [lnmt1]

 

TASK [tomcat : copy_maven] *************************************************************************************************************************

ok: [lnmt1]

 

TASK [install_tomcat] ******************************************************************************************************************************

skipping: [lnmt1]

 

TASK [tomcat : copy_start_script] ******************************************************************************************************************

ok: [lnmt1]

 

TASK [tomcat : copy_stop_script] *******************************************************************************************************************

changed: [lnmt1]

 

TASK [start_tomcat] ********************************************************************************************************************************

skipping: [lnmt1]

 

TASK [tomcat : debug] ******************************************************************************************************************************

ok: [lnmt1] => {

}

 

TASK [jpress : copy_script] ************************************************************************************************************************

ok: [lnmt1]

 

TASK [copy_jpress] *********************************************************************************************************************************

changed: [lnmt1]

 

TASK [build_jpress] ********************************************************************************************************************************

skipping: [lnmt1]

 

TASK [jpress : stop_tomcat] ************************************************************************************************************************

skipping: [lnmt1]

 

TASK [jpress : template_server.j2] *****************************************************************************************************************

changed: [lnmt1]

 

TASK [jpress : template_nginx.j2] ******************************************************************************************************************

changed: [lnmt1]

 

RUNNING HANDLER [jpress : start_tomcat] ************************************************************************************************************

skipping: [lnmt1]

 

RUNNING HANDLER [jpress : reload_nginx] ************************************************************************************************************

skipping: [lnmt1]

 

PLAY RECAP *****************************************************************************************************************************************

lnmt1                      : ok=20   changed=6    unreachable=0    failed=0    skipped=6    rescued=0    ignored=0  

 

以上说明测试成功

---------------------------------------------------------------------------

 

 

在配置好的虚拟机上进行远程安装部署

 

[root@ansible myroles]# ansible-playbook  lnmt.yaml

 

PLAY [lnmt] ****************************************************************************************************************************************

 

TASK [Gathering Facts] *****************************************************************************************************************************

ok: [lnmt1]

 

TASK [nginx : copy] ********************************************************************************************************************************

changed: [lnmt1]

 

TASK [nginx : debug] *******************************************************************************************************************************

ok: [lnmt1] => {

}

 

TASK [nginx : user] ********************************************************************************************************************************

changed: [lnmt1]

 

TASK [nginx : script] ******************************************************************************************************************************

changed: [lnmt1]

 

TASK [nginx : debug] *******************************************************************************************************************************

ok: [lnmt1] => {

}

 

TASK [mysql : copy] ********************************************************************************************************************************

changed: [lnmt1]

 

TASK [install_mysql] *******************************************************************************************************************************

changed: [lnmt1]

 

TASK [mysql : debug] *******************************************************************************************************************************

ok: [lnmt1] => {

}

 

TASK [tomcat : copy_script] ************************************************************************************************************************

changed: [lnmt1]

 

TASK [tomcat : copy_jdk] ***************************************************************************************************************************

changed: [lnmt1]

 

TASK [copy_tomcat] *********************************************************************************************************************************

changed: [lnmt1]

 

TASK [tomcat : copy_maven] *************************************************************************************************************************

changed: [lnmt1]

 

TASK [install_tomcat] ******************************************************************************************************************************

changed: [lnmt1]

 

TASK [tomcat : copy_start_script] ******************************************************************************************************************

changed: [lnmt1]

 

TASK [tomcat : copy_stop_script] *******************************************************************************************************************

changed: [lnmt1]

 

TASK [start_tomcat] ********************************************************************************************************************************

changed: [lnmt1]

 

TASK [tomcat : debug] ******************************************************************************************************************************

ok: [lnmt1] => {

    }

 

TASK [jpress : copy_script] ************************************************************************************************************************

changed: [lnmt1]

 

TASK [copy_jpress] *********************************************************************************************************************************

changed: [lnmt1]

 

TASK [build_jpress] ********************************************************************************************************************************

changed: [lnmt1]

 

TASK [jpress : stop_tomcat] ************************************************************************************************************************

changed: [lnmt1]

 

TASK [jpress : template_server.j2] *****************************************************************************************************************

changed: [lnmt1]

 

TASK [jpress : template_nginx.j2] ******************************************************************************************************************

changed: [lnmt1]

 

RUNNING HANDLER [jpress : start_tomcat] ************************************************************************************************************

changed: [lnmt1]

 

RUNNING HANDLER [jpress : reload_nginx] ************************************************************************************************************

changed: [lnmt1]

 

PLAY RECAP *****************************************************************************************************************************************

lnmt1                      : ok=26   changed=21   unreachable=0    failed=0    skipped=0    rescued=0    ignored=0  

 

 

 

被管理节点过滤端口:

[root@localhost ~]# netstat -anptu|grep -i "listen"

tcp        0      0 0.0.0.0:3306            0.0.0.0:*               LISTEN      4478/mysqld        

tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      3998/nginx: master 

tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      894/sshd           

tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN      1040/master        

tcp6       0      0 127.0.0.1:8010          :::*                    LISTEN      6105/java          

tcp6       0      0 :::8080                 :::*                    LISTEN      6105/java          

tcp6       0      0 :::22                   :::*                    LISTEN      894/sshd           

tcp6       0      0 ::1:25                  :::*                    LISTEN      1040/master

 

浏览器测试:

 

 

 

 

出现以上画面无法跳转时需要使用以下方法远程重启tomcat服务

 

Ansible远程重启tomcat服务:

此nohup的使用与以上的部署服务的用意相同,让脚本在后台运行来调用变量,因为nohup默认是在后台执行脚本的,而shell的执行是再开启一个子shell来执行脚本的,当执行完后,就回到到了原来的shell,所以环境变量找不到。

[root@ansible myroles]# ansible lnmt -u root -m shell -a 'nohup sh /usr/local/tomcat/bin/stop_tomcat.sh'

lnmt1 | CHANGED | rc=0 >>

tomcat stop_falsenohup: ignoring input

NOTE: Picked up JDK_JAVA_OPTIONS:  --add-opens=java.base/java.lang=ALL-UNNAMED --add-opens=java.base/java.io=ALL-UNNAMED --add-opens=java.base/java.util=ALL-UNNAMED --add-opens=java.base/java.util.concurrent=ALL-UNNAMED --add-opens=java.rmi/sun.rmi.transport=ALL-UNNAMED

[root@ansible myroles]# ansible lnmt -u root -m shell -a 'nohup sh /usr/local/tomcat/bin/start_tomcat.sh'

lnmt1 | CHANGED | rc=0 >>

Tomcat started.

tomcat startupnohup: ignoring input

 

再次通过浏览器访问:

 

至此jpress一键式部署全部完成

Ansible实现LNMP+LNMT一键式部署

 

整体LNMP+LNMT一键式部署的架构设计

环境准备:

[maomao@ansible ~]$ cat /etc/redhat-release

CentOS Linux release 7.9.2009 (Core)

[maomao@ansible ~]$ uname -r

3.10.0-1160.el7.x86_64

[maomao@ansible ~]$ uname -a

Linux ansible 3.10.0-1160.el7.x86_64 #1 SMP Mon Oct 19 16:18:59 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux

[maomao@ansible ~]$ hostname -I

192.168.206.122

以上信息是在普通用户下查看的,执行需要sudo到root用户下执行

 

配置ansible的hosts文件

[maomao@ansible ~]$ cat /etc/ansible/hosts

[lnmp]

lnmp1 ansible_ssh_host=192.168.206.125

lnmp2 ansible_ssh_host=192.168.206.126

[lnmt]

lnmt1  ansible_ssh_host=192.168.206.127

lnmt1  ansible_ssh_host=192.168.206.128

配置本地hosts文件映射

[maomao@ansible ~]$ cat /etc/hosts

192.168.206.122 ansible

192.168.206.125 lnmp1

192.168.206.126 lnmp2

192.168.206.127 lnmt1

192.168.206.128 lnmt2

 

给被管理节点分发的密钥对

[maomao@ansible ~]$ sudo su -

Last login: Sat May 15 06:57:29 CST 2021 on pts/1

[root@ansible ~]# ssh-copy-id -i /root/.ssh/id_rsa.pub lnmp1

[root@ansible ~]# ssh-copy-id -i /root/.ssh/id_rsa.pub lnmp2

[root@ansible ~]# ssh-copy-id -i /root/.ssh/id_rsa.pub lnmt1

[root@ansible ~]# ssh-copy-id -i /root/.ssh/id_rsa.pub lnmt2

 

远程修改被管理节点的主机名:

[root@ansible myroles]# ansible lnmp1 -m shell -a 'hostnamectl set-hostname lnmp1'

lnmt1 | CHANGED | rc=0 >>

[root@ansible myroles]# ansible lnmp2 -m shell -a 'hostnamectl set-hostname lnmp2'

lnmt1 | CHANGED | rc=0 >>

[root@ansible myroles]# ansible lnmt1 -m shell -a 'hostnamectl set-hostname lnmt1'

lnmt1 | CHANGED | rc=0 >>

[root@ansible myroles]# ansible lnmt2 -m shell -a 'hostnamectl set-hostname lnmt2'

lnmt1 | CHANGED | rc=0 >>

 

 

 

创建ansible-playbook目录架构

[root@ansible myroles]# tree /myroles/

/myroles/

├── lnmp.yaml     #LNMP部署的入口配置文件

├── lnmt.yaml     #LNMT部署的入口配置文件

└── roles

    ├── jpress       # 部署jpress剧本的主目录

    │   ├── files    # 存放脚本,安装包的目录

    │   │   ├── build_jpress.sh   #自动部署jpress的脚本

    │   │   └── jpress-web-newest.war #jpress程序包

    │   ├── handlers            #部署完成需要执行的动作目录

    │   │   └── main.yaml      #动作执行文件

    │   ├── tasks               #安装任务的目录

    │   │   └── main.yaml      #安装任务清单文件

    │   ├── templates          #部署.j2配置文件的目录

    │   │   ├── nginx.j2       #nginx最终适用lnmt的配置文件

    │   │   └── server.j2       #tomcat最终适用lnmt的配置文件

    │   └── vars           #定义自定义变量的目录

    ├── mysql         #搭建mysql的playbook主目录

    │   ├── files

    │   │   ├── auto_mysql.sh       #自动安装mysql的脚本

    │   │   └── mysql-5.5.32-linux2.6-x86_64.tar.gz   #mysql二进制安装包

    │   ├── handlers

    │   ├── tasks

    │   │   └── main.yaml       #任务执行文件

    │   ├── templates

    │   └── vars

    ├── nginx              #搭建nginx的playbook主目录

    │   ├── files

    │   │   ├── auto_nginx.sh    #自动安装nginx的脚本

    │   │   └── nginx-1.10.2.tar.gz  #nginx的源码包

    │   ├── handlers

    │   │   └── main.yaml    #nginx的动作文件

    │   ├── tasks

    │   │   └── main.yaml    #nginx任务执行文件

    │   ├── templates

    │   └── vars

    ├── php         #搭建php的主playbook主目录

    │   ├── files

    │   │   ├── auto_php.sh   #自动安装php的脚本

    │   │   ├── libiconv-1.14.tar.gz  #libiconv的源码包

    │   │   ├── php-5.3.28.tar.gz  #php的源码包

    │   ├── handlers

    │   ├── tasks

    │   │   └── main.yaml   #php的任务执行文件

    │   ├── templates

    │   └── vars

    ├── tomcat      #搭建tomcat的主目录

    │   ├── files

    │   │   ├── apache-maven-3.3.9-bin.tar.gz  #maven的二进制包

    │   │   ├── apache-tomcat-8.5.65.tar.gz    #tomcat的二进制包

    │   │   ├── auto_tomcat.sh     #自动安装tomcat的脚本

    │   │   ├── jdk-16.0.1_linux-x64_bin.tar.gz   #jdk的二进制包

    │   │   ├── start_tomcat.sh   #启动tomcat的脚本

    │   │   └── stop_tomcat.sh   #关闭tomcat的脚本

    │   ├── handlers

    │   ├── tasks

    │   │   └── main.yaml   #执行任务的文件

    │   ├── templates 

    │   └── vars

    └── wordpress    #搭建wordpress的主目录

        ├── files

        │   ├── build_wordpress.sh   #部署wordpress的脚本

        │   └── wordpress-4.7.4-zh_CN.tar.gz  #wordpress的程序包

        ├── handlers

        │   └── main.yaml    #执行动作文件

        ├── tasks

        │   └── main.yaml   #执行任务文件

        ├── templates

        │   └── nginx.j2     #nginx适用LNMP架构的配置文件

        └── vars

 

37 directories, 32 files

 

 

PLAYBOOK的各roles的介绍

一、LNMP搭建过程:

 

Ansible-playbook入口配置文件lnmp.yaml

各部署任务按照先后顺序写入到文件中

---                                                                                                                                                

- hosts: lnmp

  gather_facts: True    #指定调用内置变量

  roles:

  - nginx

  - mysql

  - php

  - wordpress

 

 

Mysqlplaybook的搭建

[root@ansible files]# tree /myroles/roles/mysql/

/myroles/roles/mysql/

├── files

│   ├── auto_mysql.sh

│   └── mysql-5.5.32-linux2.6-x86_64.tar.gz

├── handlers

├── tasks

│   └── main.yaml

├── templates

└── vars

 

5 directories, 3 files

 

Files目录

[root@ansible files]# ls

auto_mysql.sh  mysql-5.5.32-linux2.6-x86_64.tar.gz

auto_mysql.sh脚本的明细:

 

#!/bin/bash                                                                                                                                        

# install mysql

# 状态码1:光盘挂载失败 2:MySQL配置文件与服务文件不存在 3:MySQL初始化错误 4:MySQL启动失败

# 运行脚本需要准备:确定源码包存放位置,光盘是否连接,登录密码设置为什么,

#光盘挂载

[ -d /media/cdrom ] || mkdir -p /media/cdrom

umount /dev/sr0

mount /dev/sr0 /media/cdrom &>/dev/null

[ $? -ne 0 ] && exit 1

yum -y install ncurses-devel libaio &> /dev/null

 

# 创建程序用户

USER_NAME='mysql'

 

useradd -M -s /sbin/nologin $USER_NAME

 

# mysql二进制安装

PAKDIR='/tmp'

CONF='/usr/local/mysql/support-files/my-medium.cnf'

SERFILE='/usr/local/mysql/support-files/mysql.server'

 

 

cd $PAKDIR

tar xf  mysql-5.5.32-linux2.6-x86_64.tar.gz -C /usr/local

mv /usr/local/mysql-5.5.32-linux2.6-x86_64/  /usr/local/mysql

if [ -f $SERFILE ] && [ -f $CONF ] ;then

    /bin/cp  $CONF /etc/my.cnf

    /bin/cp  $SERFILE /etc/init.d/mysqld

else

    exit 2

fi

chmod +x /etc/init.d/mysqld

ln -s /usr/local/mysql/bin/* /usr/local/bin/

 

# mysql初始化并启动,创建登录密码

 

PASSWD='123123'

BASEDIR='/usr/local/mysql'

DATADIR='/usr/local/mysql/data'

 

chown -R mysql.root $BASEDIR

chown -R mysql.mysql $DATADIR

/usr/local/mysql/scripts/mysql_install_db --user="$USER_NAME" --basedir="$BASEDIR" --datadir="$DATADIR"  &> /dev/null

 

[ $? -eq 0 ] && /etc/init.d/mysqld start &> /dev/null || exit 3

[ $? -eq 0 ] && /usr/local/mysql/bin/mysqladmin -uroot  password "$PASSWD" || exit 4

注意:脚本需要有可执行权限

 

handlers目录为空不做详述

 

tasks目录

[root@ansible tasks]# vim main.yaml

---

- name: copy

  copy: src=mysql-5.5.32-linux2.6-x86_64.tar.gz dest=/tmp/

- name: install_mysql

  script: auto_mysql.sh

  register: install_mysql

- debug: var=install_mysql 

 

Templates和vars目录为空,这里不做详述

 

 

Nigixplaybook的搭建

 

[root@ansible roles]# tree nginx/

nginx/

├── files

│   ├── auto_nginx.sh

│   └── nginx-1.10.2.tar.gz

├── handlers

│   └── main.yaml

├── tasks

│   └── main.yaml

├── templates

└── vars

 

5 directories, 4 files

 

Files目录

[root@ansible files]# ls

auto_nginx.sh  nginx-1.10.2.tar.gz

auto_nginx.sh脚本明细

[root@ansible files]# vim auto_nginx.sh

#!/bin/bash

#nginx install shell scripts

# 光盘挂载

test -d /media/cdrom || mkdir -p /medir/cdrom

mount  /dev/sr0 /media/cdrom &> /dev/null

 

# 安装依赖包

yum -y install gcc gcc-c++ make pcre pcre-devel zlib zlib-devel openssl openssl-devel &> /dev/null

 

# 源码安装NGINX

PAKDIR='/tmp/'

PRGUSER='nginx'

cd  $PAKDIR

tar xf nginx-1.10.2.tar.gz -C /usr/src/

useradd -M -s /sbin/nologin $PRGUSER

cd /usr/src/nginx-1.10.2/

./configure --prefix=/usr/local/nginx   --user=nginx --group=nginx --with-http_ssl_module --with-http_stub_status_module &> /dev/null

make &> /dev/null

make install &> /dev/null

ln -s /usr/local/nginx/sbin/* /usr/local/sbin/

 

#启动nginx                                                                                                                                          

/usr/local/sbin/nginx

 

注意:脚本需要有可执行权限

 

handlers目录为空不做详述

 

 

Tasks目录

[root@ansible tasks]# vim main.yaml

---

- name: copy

  copy: src=nginx-1.10.2.tar.gz dest=/tmp/

  register: copy_result

- debug: var=copy_result

- name: user

  user: name=nginx createhome=no shell=/sbin/nologin

- name: script

  script: auto_nginx.sh

  register: install_nginx

- debug: var=install_nginx  

 

Templates和vars目录为空,这里不做详述

 

PHPplaybook的搭建

[root@ansible roles]# tree php/

php/

├── files

│   ├── auto_php.sh

│   ├── libiconv-1.14.tar.gz

│   ├── php-5.3.28.tar.gz

│   ├── php-fpm.conf

│   └── php.ini

├── handlers

├── tasks

│   └── main.yaml

├── templates

└── vars

 

5 directories, 6 files

 

File目录

[root@ansible files]# ls

auto_php.sh  libiconv-1.14.tar.gz  php-5.3.28.tar.gz 

 

#!/bin/bash                                                                                                                                        

# install php

# 状态码1:光盘挂载失败 2:PHP源码预配置失败

 

# 光盘挂载

[ -d /media/cdrom ] || mkdir -p /media/cdrom

umount /dev/sr0

mount /dev/sr0 /media/cdrom &>/dev/null

[ $? -ne 0 ] && exit 1

yum -y install zlib-devel libxml2-devel libjpeg-devel libjpeg-turbo-devel libiconv-devel &> /dev/null

yum -y install freetype-devel libpng-devel gd libcurl-devel libxslt-devel &> /dev/null

 

# 安装libiconv库

PAKDIR='/tmp/'

 

 

cd $PAKDIR

tar xf libiconv-1.14.tar.gz -C /usr/src/

cd /usr/src/libiconv-1.14/

./configure --prefix=/usr/local/libiconv &> /dev/null

make &>/dev/null

make install &>/dev/null

 

# 安装libmcrypt库

yum -y install libmcrypt-devel &> /dev/null

# 安装mhash加密扩展库

yum -y install mhash &> /dev/null

 

# 安装mcrvpt加密扩展库

yum -y install mcrypt &>/dev/null

 

# 安装php服务,

#  如果是分离式部署,请将--with-mysql=/usr/local/mysql \替换为以下两行

#  指定php调用自带的mysql客户端工具 --with-mysqli=mysqlnd \

#  指定php调用本地的mysql驱动           --with-pdo-mysql=mysqlnd \

#  指定用户需要跟nginx的程序用户保持一致,如有需要需要修改以下配置项:

#   --with-fpm-user=www \

#   --with-fpm-group=www \

cd $PAKDIR

tar xf php-5.3.28.tar.gz -C /usr/src/

cd /usr/src/php-5.3.28/

./configure \

--prefix=/usr/local/php5.3.28 \

--with-mysql=/usr/local/mysql \

--with-iconv-dir=/usr/local/libiconv \

--with-freetype-dir \

--with-jpeg-dir \

--with-png-dir \

--with-zlib \

--with-libxml-dir=/usr \

--enable-xml \

--disable-rpath \

--enable-safe-mode \

--enable-bcmath \

--enable-shmop \

--enable-sysvsem \

--enable-inline-optimization \

--with-curl \

--with-curlwrappers \

--enable-mbregex \

--enable-fpm \

--enable-mbstring \

--with-mcrypt \

--with-gd \

--enable-gd-native-ttf \

--with-openssl \

--with-mhash \                   

--enable-pcntl \

--enable-sockets \

--with-xmlrpc \

--enable-zip \

--enable-soap \

--enable-short-tags \

--enable-zend-multibyte \

--enable-static \

--with-xsl \

--with-fpm-user=nginx \

--with-fpm-group=nginx \

--enable-ftp &>/dev/null

[ $? -ne 0  ] && exit 2

ln -s /usr/local/mysql/lib/libmysqlclient.so.18 /usr/lib64/

touch /usr/src/php-5.3.28/ext/phar/phar.phar

make &> /dev/null

make install &> /dev/null

ln -s /usr/local/php5.3.28/ /usr/local/php

 

# 拷贝PHP的配置文件,建议做到剧本的拷贝模板中

cp /usr/src/php-5.3.28/php.ini-production /usr/local/php/lib/php.ini

cp /usr/local/php/etc/php-fpm.conf.default /usr/local/php/etc/php-fpm.conf

 

#启动PHP服务

 

/usr/local/php/sbin/php-fpm                                                                                                                         

                               

注意:脚本需要有可执行权限

 

handlers目录为空不做详述

 

tasks目录

[root@ansible tasks]# vim main.yaml

---

- name: copy_libiconv

  copy: src=libiconv-1.14.tar.gz dest=/tmp/

- name: copy_php-5.3.28

  copy: src=php-5.3.28.tar.gz dest=/tmp/

- name: install_php

  script: auto_php.sh      

 

Templates和vars目录为空,这里不做详述

 

Wordpressplaybook的搭建

[root@ansible roles]# tree wordpress/

wordpress/

├── files

│   ├── build_wordpress.sh

│   └── wordpress-4.7.4-zh_CN.tar.gz

├── handlers

│   └── main.yaml

├── tasks

│   └── main.yaml

├── templates

│   └── nginx.j2

└── vars

 

5 directories, 5 files

 

Files目录

[root@ansible files]# ls

build_wordpress.sh  wordpress-4.7.4-zh_CN.tar.gz  #wordpress程序包

 

build_wordpress.sh脚本明细

[root@ansible files]# vim build_wordpress.sh

#!/bin/bash

# build wordpress

 

#登录数据库创建一个wordpress库以及授权登录用户

CMD='/usr/local/mysql/bin'

PASSWD='123123'

USER='wordpress'

IPADDR='localhost'

LOGPASS='123123'

$CMD/mysql -uroot -p$PASSWD -e "create database wordpress;" &>/dev/null

$CMD/mysql -uroot -p$PASSWD -e "use wordpress;grant all on wordpress.* to "$USER"@"$IPADDR" identified by '$LOGPASS';flush privileges;" &>/dev/null

 

#部署wordpress程序

PRG_USER='nginx'

SITE='/usr/local/nginx/html/blogcom'

cd  $SITE

tar xf wordpress-4.7.4-zh_CN.tar.gz

mv wordpress-4.7.4-zh_CN.tar.gz /root/

mv wordpress/* ./

cd

chown -R $PRG_USER.$PRG_USER  $SITE        

注意:脚本需要有可执行权限

 

Handlers目录

[root@ansible handlers]# vim main.yaml

---

- name: start_nginx

  shell: /usr/local/nginx/sbin/nginx

- name: reload_nginx

  shell: /usr/local/nginx/sbin/nginx -s reload

- name: stop_nginx

  shell: /usr/local/nginx/sbin/nginx -s stop

 

Tasks目录

[root@ansible tasks]# vim main.yaml

---

- name: copy_wordpress

  copy: src=wordpress-4.7.4-zh_CN.tar.gz dest=/usr/local/nginx/html/blogcom/ 

- name: build_wordpress

  script: build_wordpress.sh

- name: template_conf

  template: src=nginx.j2 dest=/usr/local/nginx/conf/nginx.conf backup=yes

  notify: reload_nginx

 

Templates目录

[root@ansible templates]# ls

nginx.j2   #最终搭建wordpress的nginx配置文件

 

nginx.j2的明细

[root@ansible templates]# vim nginx.j2

worker_processes  {{ ansible_processor_count }};                                                                                                    

events {

    worker_connections  1024;

}

http {

    include       mime.types;

    default_type  application/octet-stream;

    sendfile        on;

    keepalive_timeout  65;

    server {

        listen       80;

        server_name  localhost;

        location / {

            root   html/blogcom;

            index  index.php index.html index.htm;

        if (-f $request_filename/index.html) {

            rewrite (.*) $1/index.html break;

            }

        if (-f $request_filename/index.php) {

            rewrite (.*) $1/index.php;

            }

        if (!-f $request_filename) {

        rewrite (.*) /index.php;

            }

       }

        location ~ .*\.(php|php5)?$ {

            root html/blogcom;

            fastcgi_pass 127.0.0.1:9000;

            fastcgi_index index.php;

            include fastcgi.conf;

        }

    }

}            

 

 

到此lnmp的playbook就部署完成,只剩下测试:

 

ansible本地测试,如果成功,就可以实机部署了

[root@ansible myroles]# ansible-playbook -C lnmp.yaml

 

PLAY [lnmp] ****************************************************************************************************************************************

 

TASK [Gathering Facts] *****************************************************************************************************************************

ok: [lnmp2]

ok: [lnmp1]

 

TASK [nginx : copy] ********************************************************************************************************************************

ok: [lnmp2]

ok: [lnmp1]

 

TASK [nginx : debug] *******************************************************************************************************************************

ok: [lnmp1] => {

    "copy_result": {

        "changed": false,

        "checksum": "1bafb1557b8d5f992714c0dcbde77036bde98547",

        "dest": "/tmp/nginx-1.10.2.tar.gz",

        "diff": {

            "after": {

                "path": "/tmp/nginx-1.10.2.tar.gz"

            },

            "before": {

                "path": "/tmp/nginx-1.10.2.tar.gz"

            }

        },

        "failed": false,

        "gid": 0,

        "group": "root",

        "mode": "0644",

        "owner": "root",

        "path": "/tmp/nginx-1.10.2.tar.gz",

        "secontext": "unconfined_u:object_r:admin_home_t:s0",

        "size": 910812,

        "state": "file",

        "uid": 0

    }

}

ok: [lnmp2] => {

    "copy_result": {

        "changed": false,

        "checksum": "1bafb1557b8d5f992714c0dcbde77036bde98547",

        "dest": "/tmp/nginx-1.10.2.tar.gz",

        "diff": {

            "after": {

                "path": "/tmp/nginx-1.10.2.tar.gz"

            },

            "before": {

                "path": "/tmp/nginx-1.10.2.tar.gz"

            }

        },

        "failed": false,

        "gid": 0,

        "group": "root",

        "mode": "0644",

        "owner": "root",

        "path": "/tmp/nginx-1.10.2.tar.gz",

        "secontext": "unconfined_u:object_r:admin_home_t:s0",

        "size": 910812,

        "state": "file",

        "uid": 0

    }

}

 

TASK [nginx : user] ********************************************************************************************************************************

ok: [lnmp1]

ok: [lnmp2]

 

TASK [nginx : script] ******************************************************************************************************************************

changed: [lnmp1]

changed: [lnmp2]

 

TASK [nginx : debug] *******************************************************************************************************************************

ok: [lnmp1] => {

    "install_nginx": {

        "changed": true,

        "failed": false

    }

}

ok: [lnmp2] => {

    "install_nginx": {

        "changed": true,

        "failed": false

    }

}

 

TASK [mysql : copy] ********************************************************************************************************************************

ok: [lnmp1]

ok: [lnmp2]

 

TASK [install_mysql] *******************************************************************************************************************************

changed: [lnmp1]

changed: [lnmp2]

 

TASK [mysql : debug] *******************************************************************************************************************************

ok: [lnmp1] => {

    "install_mysql": {

        "changed": true,

        "failed": false

    }

}

ok: [lnmp2] => {

    "install_mysql": {

        "changed": true,

        "failed": false

    }

}

 

TASK [php : copy_libiconv] *************************************************************************************************************************

ok: [lnmp1]

ok: [lnmp2]

 

TASK [copy_php-5.3.28] *****************************************************************************************************************************

ok: [lnmp2]

ok: [lnmp1]

 

TASK [install_php] *********************************************************************************************************************************

changed: [lnmp2]

changed: [lnmp1]

 

TASK [copy_wordpress] ******************************************************************************************************************************

changed: [lnmp1]

changed: [lnmp2]

 

TASK [build_wordpress] *****************************************************************************************************************************

changed: [lnmp2]

changed: [lnmp1]

 

TASK [wordpress : template_conf] *******************************************************************************************************************

changed: [lnmp2]

changed: [lnmp1]

 

RUNNING HANDLER [wordpress : reload_nginx] *********************************************************************************************************

skipping: [lnmp1]

skipping: [lnmp2]

 

PLAY RECAP *****************************************************************************************************************************************

lnmp1                      : ok=15   changed=6    unreachable=0    failed=0    skipped=1    rescued=0    ignored=0  

lnmp2                      : ok=15   changed=6    unreachable=0    failed=0    skipped=1    rescued=0    ignored=0  

 

从以上信息看,都已经检测成功,剩下的实机检测就不做介绍了

 

 

 

二、LNMT搭建过程:

 

1.Ansible-playbook入口配置文件lnmt.yaml

各部署任务按照先后顺序写入到文件中

---

- hosts: lnmt

  gather_facts: True

  roles:

  - nginx

  - mysql

  - tomcat

  - jpress     

 

 

2.Mysqlplaybook的搭建

[root@ansible files]# tree /myroles/roles/mysql/

/myroles/roles/mysql/

├── files

│   ├── auto_mysql.sh

│   └── mysql-5.5.32-linux2.6-x86_64.tar.gz

├── handlers

├── tasks

│   └── main.yaml

├── templates

└── vars

 

5 directories, 3 files

 

Files目录

[root@ansible files]# ls

auto_mysql.sh  mysql-5.5.32-linux2.6-x86_64.tar.gz

auto_mysql.sh脚本的明细:

 

#!/bin/bash                                                                                                                                        

# install mysql

# 状态码1:光盘挂载失败 2:MySQL配置文件与服务文件不存在 3:MySQL初始化错误 4:MySQL启动失败

# 运行脚本需要准备:确定源码包存放位置,光盘是否连接,登录密码设置为什么,

#光盘挂载

[ -d /media/cdrom ] || mkdir -p /media/cdrom

umount /dev/sr0

mount /dev/sr0 /media/cdrom &>/dev/null

[ $? -ne 0 ] && exit 1

yum -y install ncurses-devel libaio &> /dev/null

 

# 创建程序用户

USER_NAME='mysql'

 

useradd -M -s /sbin/nologin $USER_NAME

 

# mysql二进制安装

PAKDIR='/tmp'

CONF='/usr/local/mysql/support-files/my-medium.cnf'

SERFILE='/usr/local/mysql/support-files/mysql.server'

 

 

cd $PAKDIR

tar xf  mysql-5.5.32-linux2.6-x86_64.tar.gz -C /usr/local

mv /usr/local/mysql-5.5.32-linux2.6-x86_64/  /usr/local/mysql

if [ -f $SERFILE ] && [ -f $CONF ] ;then

    /bin/cp  $CONF /etc/my.cnf

    /bin/cp  $SERFILE /etc/init.d/mysqld

else

    exit 2

fi

chmod +x /etc/init.d/mysqld

ln -s /usr/local/mysql/bin/* /usr/local/bin/

 

# mysql初始化并启动,创建登录密码

 

PASSWD='123123'

BASEDIR='/usr/local/mysql'

DATADIR='/usr/local/mysql/data'

 

chown -R mysql.root $BASEDIR

chown -R mysql.mysql $DATADIR

/usr/local/mysql/scripts/mysql_install_db --user="$USER_NAME" --basedir="$BASEDIR" --datadir="$DATADIR"  &> /dev/null

 

[ $? -eq 0 ] && /etc/init.d/mysqld start &> /dev/null || exit 3

[ $? -eq 0 ] && /usr/local/mysql/bin/mysqladmin -uroot  password "$PASSWD" || exit 4

注意:脚本需要有可执行权限

 

handlers目录为空不做详述

 

tasks目录

[root@ansible tasks]# vim main.yaml

---

- name: copy

  copy: src=mysql-5.5.32-linux2.6-x86_64.tar.gz dest=/tmp/

- name: install_mysql

  script: auto_mysql.sh

  register: install_mysql

- debug: var=install_mysql 

 

Templates和vars目录为空,这里不做详述

 

 

3.Nigixplaybook的搭建

 

[root@ansible roles]# tree nginx/

nginx/

├── files

│   ├── auto_nginx.sh

│   └── nginx-1.10.2.tar.gz

├── handlers

│   └── main.yaml

├── tasks

│   └── main.yaml

├── templates

└── vars

 

5 directories, 4 files

 

Files目录

[root@ansible files]# ls

auto_nginx.sh  nginx-1.10.2.tar.gz

auto_nginx.sh脚本明细

[root@ansible files]# vim auto_nginx.sh

#!/bin/bash

#nginx install shell scripts

# 光盘挂载

test -d /media/cdrom || mkdir -p /medir/cdrom

mount  /dev/sr0 /media/cdrom &> /dev/null

 

# 安装依赖包

yum -y install gcc gcc-c++ make pcre pcre-devel zlib zlib-devel openssl openssl-devel &> /dev/null

 

# 源码安装NGINX

PAKDIR='/tmp/'

PRGUSER='nginx'

cd  $PAKDIR

tar xf nginx-1.10.2.tar.gz -C /usr/src/

useradd -M -s /sbin/nologin $PRGUSER

cd /usr/src/nginx-1.10.2/

./configure --prefix=/usr/local/nginx   --user=nginx --group=nginx --with-http_ssl_module --with-http_stub_status_module &> /dev/null

make &> /dev/null

make install &> /dev/null

ln -s /usr/local/nginx/sbin/* /usr/local/sbin/

 

#启动nginx                                                                                                                                          

/usr/local/sbin/nginx

 

注意:脚本需要有可执行权限

 

handlers目录为空不做详述

 

 

Tasks目录

[root@ansible tasks]# vim main.yaml

---

- name: copy

  copy: src=nginx-1.10.2.tar.gz dest=/tmp/

  register: copy_result

- debug: var=copy_result

- name: user

  user: name=nginx createhome=no shell=/sbin/nologin

- name: script

  script: auto_nginx.sh

  register: install_nginx

- debug: var=install_nginx  

 

Templates和vars目录为空,这里不做详述

 

4.TOMCATplaybook的搭建

[root@ansible roles]# tree tomcat/

tomcat/

├── files

│   ├── apache-maven-3.3.9-bin.tar.gz

│   ├── apache-tomcat-8.5.65.tar.gz

│   ├── auto_tomcat.sh

│   ├── jdk-16.0.1_linux-x64_bin.tar.gz

│   ├── start_tomcat.sh

│   └── stop_tomcat.sh

├── handlers

├── tasks

│   └── main.yaml

├── templates

└── vars

 

5 directories, 7 files

File目录

[root@ansible files]# ls |xargs -n1

apache-maven-3.3.9-bin.tar.gz

apache-tomcat-8.5.65.tar.gz

auto_tomcat.sh

jdk-16.0.1_linux-x64_bin.tar.gz

start_tomcat.sh

stop_tomcat.sh

 

自动安装tomcat的脚本明细:

[root@ansible files]# vim auto_tomcat.sh

#!/bin/bash                                                                                                                                        

# install tomcat

PAKDIR='/tmp/'

# 部署Java环境JDK

cd $PAKDIR

tar xf jdk-16.0.1_linux-x64_bin.tar.gz  -C /usr/local/

[ $? -eq 0 ] && ln -s /usr/local/jdk-16.0.1  /usr/local/jdk || exit 2

# 配置Java环境变量

sed -i.ori '$a export JAVA_HOME=/usr/local/jdk\nexport PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH\nexport CLASSPATH=.$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/lib/tools.jar' /etc/profile

chown -R root.root /usr/local/jdk/

 

# 部署tomcat

cd $PAKDIR

tar xf apache-tomcat-8.5.65.tar.gz -C /usr/local/

[ $? -eq 0 ] && ln -s /usr/local/apache-tomcat-8.5.65/ /usr/local/tomcat || exit 3

echo 'export TOMCAT_HOME=/usr/local/tomcat' >> /etc/profile

chown -R root.root /usr/local/tomcat/

 

# 部署MAVEN

cd $PAKDIR

tar xf apache-maven-3.3.9-bin.tar.gz -C /usr/local/

[ $? -eq 0 ] && ln -s /usr/local/apache-maven-3.3.9 /usr/local/maven || exit 2

sed -i.ori '$a export MAVEN_HOME=/usr/local/maven\nexport PATH="$MAVEN_HOME/bin:$PATH"' /etc/profile ||exit 3                                                                                                                      

                               

注意:脚本需要有可执行权限!!!

 

开启tomcat的脚本明细:

此部分需要说下搭建心得,由于需要实现部署完成后tomcat能够自动正常开启服务,但是由于jdk,tomcat,maven的环境变量问题,通过ansible远程是无法全局生效,造成开启服务的时候找不到java的环境变量,为了解决这个问题,从网上查询了很多资料,得到了这个启发,将环境变量写到开启脚本中,然后通过开启脚本再调用tomcat的startup.sh,来实现开启服务时能够找到环境变量。

重要的事情说三遍:加执行权限!加执行权限!加执行权限!

--------------------------------------------------------------------------------------------------------------------------------

参考地址:

https://blog.csdn.net/weixin_39805387/article/details/111264856?utm_medium=distribute.pc_aggpage_search_result.none-task-blog-2~aggregatepage~first_rank_v2~rank_aggregation-1-111264856.pc_agg_rank_aggregation&utm_term=linux+%E8%BF%9C%E7%A8%8B%E7%94%9F%E6%95%88%E7%8E%AF%E5%A2%83%E5%8F%98%E9%87%8F&spm=1000.2123.3001.4430

 

[root@ansible files]# vim start_tomcat.sh

#!/bin/bash

# tomcat启动脚本

 

 

export JAVA_HOME=/usr/local/jdk

export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH

export CLASSPATH=.$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/lib/tools.jar

export TOMCAT_HOME=/usr/local/tomcat

export MAVEN_HOME=/usr/local/maven

export PATH="$MAVEN_HOME/bin:$PATH"

 

#启动tomcat

cd /usr/local/tomcat/bin/ && ./startup.sh

PS=`ps -ef |grep '/usr/local/tomcat' |grep -v grep|awk '{print $2}'|wc -l`

sleep 5

if [ $PS -ne 0 ];then

  echo "tomcat started"

else                                                                                                                                                

  echo "tomcat start_false"

fi

 

 

关闭tomcat的脚本明细:

由于在最后搭建完成jpress后需要把最终的tomcat的配置文件导入到被管理节点的tomcat将原先的配置文件进行覆盖,需要在此之前关闭tomcat服务,也是由于jave的变量问题,无法通过ansible实现远程source /etc/profile的功能,故采用关闭脚本来调用tomcat的关闭脚本,实现变量的调用,能够正常达到关闭tomcat的效果。

重要的事情说三遍:加执行权限!加执行权限!加执行权限!

---------------------------------------------------------------------------------------------------------------------------------

 

[root@ansible files]# vim stop_tomcat.sh

#!/bin/bash

# tomcat停止脚本

 

 

export JAVA_HOME=/usr/local/jdk

export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH

export CLASSPATH=.$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/lib/tools.jar

export TOMCAT_HOME=/usr/local/tomcat

export MAVEN_HOME=/usr/local/maven

export PATH="$MAVEN_HOME/bin:$PATH"

 

#启动tomcat

cd /usr/local/tomcat/bin/ && ./shutdown.sh

PS=`ps -ef |grep '/usr/local/tomcat' |grep -v grep|awk '{print $2}'|wc -l`

sleep 5

if [ $PS -eq 0 ];then

  echo "tomcat stoped"

else                                                                                                                                               

  echo "tomcat stop_false"                                                                                                                          

fi

 

handlers目录为空不做详述

 

tasks目录

[root@ansible tasks]# vim main.yaml

---

- name: copy_script

  copy: src=auto_tomcat.sh dest=/tmp/ mode=0755

- name: copy_jdk

  copy: src=jdk-16.0.1_linux-x64_bin.tar.gz dest=/tmp/

- name: copy_tomcat

  copy: src=apache-tomcat-8.5.65.tar.gz  dest=/tmp/

- name: copy_maven

  copy: src=apache-maven-3.3.9-bin.tar.gz  dest=/tmp/

- name: install_tomcat

  shell: /tmp/auto_tomcat.sh

- name: copy_start_script

  copy: src=start_tomcat.sh dest=/usr/local/tomcat/bin/ mode=0755  #mode保留执行权限

- name: copy_stop_script

  copy: src=stop_tomcat.sh  dest=/usr/local/tomcat/bin/ mode=0755 #mode保留执行权限

- name: start_tomcat

  shell: nohup  sh  /usr/local/tomcat/bin/start_tomcat.sh

  register: start_result

- debug: var=start_result  

 

以上任务的start_tomcat需要说明一下:

- name: start_tomcat

  shell: nohup  sh  /usr/local/tomcat/bin/start_tomcat.sh  #脚本的绝对路径

解释:

nohup  :在后台运行此脚本  

sh     :通过shell来运行脚本

 

使用nohup的原因:

Ansible执行命令,默认不加载环境变量,nohup参数让脚本在后台运行,就可以加载里面的环境变量,这也是为什么上面编写的开启和关闭tomcat脚本的主要原因。

 

Templates和vars目录为空,这里不做详述

 

5.jpressplaybook的搭建

[root@ansible roles]# tree jpress/

jpress/

├── files

│   ├── build_jpress.sh

│   └── jpress-web-newest.war

├── handlers

│   └── main.yaml

├── tasks

│   └── main.yaml

├── templates

│   ├── nginx.j2

│   └── server.j2

└── vars

 

5 directories, 6 files

Files目录

[root@ansible files]# ls

build_jpress.sh  jpress-web-newest.war

 

build_jpress.sh脚本明细

[root@ansible files]# vim build_jpress.sh

#!/bin/bash                                                                                                                                        

# build_jpress

 

# 创建jpress的数据库及授权jpress的数据库账号

CMD='/usr/local/mysql/bin'

PASSWD='123123'

USER='jpress'

IPADDR='localhost'

LOGPASS='123123'

DATABASE='jpress'

 

$CMD/mysql -uroot -p$PASSWD -e "create database $DATABASE;" &>/dev/null

$CMD/mysql -uroot -p$PASSWD -e "use $DATABASE;grant all on $DATABASE.* to "$USER"@"$IPADDR" identified by '$LOGPASS';flush privileges;" &>/dev/null

 

 

# 部署Jpress

PAKDIR='/tmp/'

MANDIR='/usr/local/tomcat/webapps/'

WEBDIR='/usr/local/tomcat/webapps/ROOT/'

cd $WEBDIR

rm -rf ./*

cd $MANDIR

rm -rf docs  *m*

cd $PAKDIR

mv jpress-web-newest.war $WEBDIR

 cd $WEBDIR

/usr/local/jdk/bin/jar  xf jpress-web-newest.war      

注意:脚本需要有可执行权限

 

Handlers目录

[root@ansible handlers]# vim main.yaml

---                                                                                                                                                

- name: start_tomcat

  shell: nohup sh /usr/local/tomcat/bin/start_tomcat.sh  #通过开启脚本来调用tomcat自带开启脚本

- name: stop_tomcat

  shell: nohup sh /usr/local/tomcat/bin/stop_tomcat.sh #通过关闭脚本来调用tomcat自带关闭脚本

- name: start_nginx

  shell: /usr/local/nginx/sbin/nginx

- name: reload_nginx

  shell: /usr/local/nginx/sbin/nginx -s reload

 

Tasks目录

[root@ansible tasks]# vim main.yaml

---

- name: copy_script

  copy: src=build_jpress.sh dest=/tmp/ mode=0755

- name: copy_jpress

  copy: src=jpress-web-newest.war dest=/tmp/

- name: build_jpress

  shell: /tmp/build_jpress.sh

- name: stop_tomcat

  shell: nohup sh  /usr/local/tomcat/bin/stop_tomcat.sh                                                                                            

- name: template_server.j2

  template: src=server.j2 dest=/usr/local/tomcat/conf/server.xml backup=yes

  notify: start_tomcat

- name: template_nginx.j2

  template: src=nginx.j2 dest=/usr/local/nginx/conf/nginx.conf backup=yes

  notify: reload_nginx                                    

 

Templates目录

[root@ansible templates]# ls |xargs -n1

nginx.j2  #最终实现jpress服务的nginx的配置文件

server.j2  #最终实现jpress服务的tomcat的配置文件

 

nginx.j2的明细

[root@ansible templates]# vim nginx.j2

worker_processes  {{ ansible_processor_count }};                                                                                                   

events {

    worker_connections  1024;

}

http {

    include       mime.types;

    default_type  application/octet-stream;

    sendfile        on;

    keepalive_timeout  65;

    upstream tomcat_pools {

        server 127.0.0.1:8080;

    }

    server {

        listen       80;

        server_name  localhost;

        location / {

            proxy_pass http://tomcat_pools;

            proxy_set_header host $host;

            proxy_set_header x-forwarded-for $remote_addr;

            proxy_connect_timeout 60;

            proxy_send_timeout 60;

            proxy_read_timeout 60;

            proxy_buffer_size 4k;

            proxy_buffers 4 32k;

            proxy_busy_buffers_size 64k;       }

            proxy_temp_file_write_size 64k;

       }

    }

}                        

 

Tomcat最终的server.j2文件

[root@ansible templates]# vim server.j2

<?xml version='1.0' encoding='utf-8'?>

<!--

  Licensed to the Apache Software Foundation (ASF) under one or more

  contributor license agreements.  See the NOTICE file distributed with

  this work for additional information regarding copyright ownership.

  The ASF licenses this file to You under the Apache License, Version 2.0

  (the "License"); you may not use this file except in compliance with

  the License.  You may obtain a copy of the License at

 

      http://www.apache.org/licenses/LICENSE-2.0

 

  Unless required by applicable law or agreed to in writing, software

  distributed under the License is distributed on an "AS IS" BASIS,

  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

  See the License for the specific language governing permissions and

  limitations under the License.

-->

<!-- Note:  A "Server" is not itself a "Container", so you may not

     define subcomponents such as "Valves" at this level.

     Documentation at /docs/config/server.html

 -->

<Server port="8010" shutdown="SHUTDOWN">  #关闭端口默认为8005,修改非8005端口

  <Listener className="org.apache.catalina.startup.VersionLoggerListener" />

  <!-- Security listener. Documentation at /docs/config/listeners.html

  <Listener className="org.apache.catalina.security.SecurityListener" />

  -->

  <!--APR library loader. Documentation at /docs/apr.html -->

  <Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />

  <!-- Prevent memory leaks due to use of particular java/javax APIs-->

  <Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />

  <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />

  <Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener" />

 

  <!-- Global JNDI resources

       Documentation at /docs/jndi-resources-howto.html

  -->

  <GlobalNamingResources>

    <!-- Editable user database that can also be used by

         UserDatabaseRealm to authenticate users

    -->

    <Resource name="UserDatabase" auth="Container"

              type="org.apache.catalina.UserDatabase"

              description="User database that can be updated and saved"

              factory="org.apache.catalina.users.MemoryUserDatabaseFactory"

              pathname="conf/tomcat-users.xml" />

  </GlobalNamingResources>

 

  <!-- A "Service" is a collection of one or more "Connectors" that share

       a single "Container" Note:  A "Service" is not itself a "Container",

       so you may not define subcomponents such as "Valves" at this level.

       Documentation at /docs/config/service.html

   -->

  <Service name="Catalina">

 

    <!--The connectors can use a shared executor, you can define one or more named thread pools-->

    <!--

    <Executor name="tomcatThreadPool" namePrefix="catalina-exec-"

        maxThreads="150" minSpareThreads="4"/>

    -->

 

 

    <!-- A "Connector" represents an endpoint by which requests are received

         and responses are returned. Documentation at :

         Java HTTP Connector: /docs/config/http.html (blocking & non-blocking)

         Java AJP  Connector: /docs/config/ajp.html

         APR (HTTP/AJP) Connector: /docs/apr.html

         Define a non-SSL/TLS HTTP/1.1 Connector on port 8080

    -->

    <Connector port="8080" protocol="HTTP/1.1"

               connectionTimeout="20000" enableLookups="false" acceptCount="800"

               redirectPort="8443" />

    <!-- A "Connector" using the shared thread pool-->

    <!--

    <Connector executor="tomcatThreadPool"

               port="8080" protocol="HTTP/1.1"

               connectionTimeout="20000"

               redirectPort="8443" />

    -->

    <!-- Define a SSL/TLS HTTP/1.1 Connector on port 8443

         This connector uses the NIO implementation that requires the JSSE

         style configuration. When using the APR/native implementation, the

         OpenSSL style configuration is required as described in the APR/native

         documentation -->

    <!--

    <Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol"

               maxThreads="150" SSLEnabled="true" scheme="https" secure="true"

               clientAuth="false" sslProtocol="TLS" />

    -->

 

    <!-- Define an AJP 1.3 Connector on port 8009 -->

    <!--

<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />

-->  #将AJP协议端口,对我们来说没有用,所以注释掉

 

    <!-- An Engine represents the entry point (within Catalina) that processes

         every request.  The Engine implementation for Tomcat stand alone

         analyzes the HTTP headers included with the request, and passes them

         on to the appropriate Host (virtual host).

         Documentation at /docs/config/engine.html -->

 

    <!-- You should set jvmRoute to support load-balancing via AJP ie :

    <Engine name="Catalina" defaultHost="localhost" jvmRoute="jvm1">

    -->

    <Engine name="Catalina" defaultHost="localhost">

 

      <!--For clustering, please take a look at documentation at:

          /docs/cluster-howto.html  (simple how to)

          /docs/config/cluster.html (reference documentation) -->

      <!--

      <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/>

      -->

 

      <!-- Use the LockOutRealm to prevent attempts to guess user passwords

           via a brute-force attack -->

      <Realm className="org.apache.catalina.realm.LockOutRealm">

        <!-- This Realm uses the UserDatabase configured in the global JNDI

             resources under the key "UserDatabase".  Any edits

             that are performed against this UserDatabase are immediately

             available for use by the Realm.  -->

        <Realm className="org.apache.catalina.realm.UserDatabaseRealm"

               resourceName="UserDatabase"/>

      </Realm>

 

      <Host name="localhost"  appBase="webapps" #定义域名以及web服务根目录

            unpackWARs="true" autoDeploy="true">

        <Context path="" docBase="/usr/local/tomcat/webapps/ROOT" debug="0" reloadable="false" crossContext="true"/>

 

 #context表示一个web服务,即war文件,path是配置uri的路径,为空就是默认到webapps/ROOT下,如果配置了uri则会去webapps下按照配置路径下去找ROOT,reloadable这个属性非常重要,如果为true,则tomcat会自动检测应用程序的/WEB-INF/lib 和/WEB-INF/classes目录的变化,自动装载新的应用程序,可以在不重启tomcat的情况下改变应用程序,所以配置为false。

 

        <!-- SingleSignOn valve, share authentication between web applications

             Documentation at: /docs/config/valve.html -->

        <!--

        <Valve className="org.apache.catalina.authenticator.SingleSignOn" />

        -->

 

        <!-- Access log processes all example.

             Documentation at: /docs/config/valve.html

             Note: The pattern used is equivalent to using pattern="common" -->

        <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"

               prefix="localhost_access_log" suffix=".txt"

               pattern="%h %l %u %t &quot;%r&quot; %s %b" />

 

      </Host>

    </Engine>

  </Service>                                                                                                                                        

</Server>

 

到此lnmt的playbook就部署完成,只剩下测试:

 

Ansible-playbook本地进行测试:

[root@ansible myroles]# ansible-playbook -C lnmt.yaml

 

PLAY [lnmt] ****************************************************************************************************************************************

 

TASK [Gathering Facts] *****************************************************************************************************************************

ok: [lnmt1]

 

TASK [nginx : copy] ********************************************************************************************************************************

ok: [lnmt1]

 

TASK [nginx : debug] *******************************************************************************************************************************

ok: [lnmt1] => 

}

 

TASK [nginx : user] ********************************************************************************************************************************

ok: [lnmt1]

 

TASK [nginx : script] ******************************************************************************************************************************

changed: [lnmt1]

 

TASK [nginx : debug] *******************************************************************************************************************************

ok: [lnmt1] => {

}

 

TASK [mysql : copy] ********************************************************************************************************************************

ok: [lnmt1]

 

TASK [install_mysql] *******************************************************************************************************************************

changed: [lnmt1]

 

TASK [mysql : debug] *******************************************************************************************************************************

ok: [lnmt1] => {

 

TASK [tomcat : copy_script] ************************************************************************************************************************

ok: [lnmt1]

 

TASK [tomcat : copy_jdk] ***************************************************************************************************************************

ok: [lnmt1]

 

TASK [copy_tomcat] *********************************************************************************************************************************

ok: [lnmt1]

 

TASK [tomcat : copy_maven] *************************************************************************************************************************

ok: [lnmt1]

 

TASK [install_tomcat] ******************************************************************************************************************************

skipping: [lnmt1]

 

TASK [tomcat : copy_start_script] ******************************************************************************************************************

ok: [lnmt1]

 

TASK [tomcat : copy_stop_script] *******************************************************************************************************************

changed: [lnmt1]

 

TASK [start_tomcat] ********************************************************************************************************************************

skipping: [lnmt1]

 

TASK [tomcat : debug] ******************************************************************************************************************************

ok: [lnmt1] => {

}

 

TASK [jpress : copy_script] ************************************************************************************************************************

ok: [lnmt1]

 

TASK [copy_jpress] *********************************************************************************************************************************

changed: [lnmt1]

 

TASK [build_jpress] ********************************************************************************************************************************

skipping: [lnmt1]

 

TASK [jpress : stop_tomcat] ************************************************************************************************************************

skipping: [lnmt1]

 

TASK [jpress : template_server.j2] *****************************************************************************************************************

changed: [lnmt1]

 

TASK [jpress : template_nginx.j2] ******************************************************************************************************************

changed: [lnmt1]

 

RUNNING HANDLER [jpress : start_tomcat] ************************************************************************************************************

skipping: [lnmt1]

 

RUNNING HANDLER [jpress : reload_nginx] ************************************************************************************************************

skipping: [lnmt1]

 

PLAY RECAP *****************************************************************************************************************************************

lnmt1                      : ok=20   changed=6    unreachable=0    failed=0    skipped=6    rescued=0    ignored=0  

 

以上说明测试成功

---------------------------------------------------------------------------

 

 

在配置好的虚拟机上进行远程安装部署

 

[root@ansible myroles]# ansible-playbook  lnmt.yaml

 

PLAY [lnmt] ****************************************************************************************************************************************

 

TASK [Gathering Facts] *****************************************************************************************************************************

ok: [lnmt1]

 

TASK [nginx : copy] ********************************************************************************************************************************

changed: [lnmt1]

 

TASK [nginx : debug] *******************************************************************************************************************************

ok: [lnmt1] => {

}

 

TASK [nginx : user] ********************************************************************************************************************************

changed: [lnmt1]

 

TASK [nginx : script] ******************************************************************************************************************************

changed: [lnmt1]

 

TASK [nginx : debug] *******************************************************************************************************************************

ok: [lnmt1] => {

}

 

TASK [mysql : copy] ********************************************************************************************************************************

changed: [lnmt1]

 

TASK [install_mysql] *******************************************************************************************************************************

changed: [lnmt1]

 

TASK [mysql : debug] *******************************************************************************************************************************

ok: [lnmt1] => {

}

 

TASK [tomcat : copy_script] ************************************************************************************************************************

changed: [lnmt1]

 

TASK [tomcat : copy_jdk] ***************************************************************************************************************************

changed: [lnmt1]

 

TASK [copy_tomcat] *********************************************************************************************************************************

changed: [lnmt1]

 

TASK [tomcat : copy_maven] *************************************************************************************************************************

changed: [lnmt1]

 

TASK [install_tomcat] ******************************************************************************************************************************

changed: [lnmt1]

 

TASK [tomcat : copy_start_script] ******************************************************************************************************************

changed: [lnmt1]

 

TASK [tomcat : copy_stop_script] *******************************************************************************************************************

changed: [lnmt1]

 

TASK [start_tomcat] ********************************************************************************************************************************

changed: [lnmt1]

 

TASK [tomcat : debug] ******************************************************************************************************************************

ok: [lnmt1] => {

    }

 

TASK [jpress : copy_script] ************************************************************************************************************************

changed: [lnmt1]

 

TASK [copy_jpress] *********************************************************************************************************************************

changed: [lnmt1]

 

TASK [build_jpress] ********************************************************************************************************************************

changed: [lnmt1]

 

TASK [jpress : stop_tomcat] ************************************************************************************************************************

changed: [lnmt1]

 

TASK [jpress : template_server.j2] *****************************************************************************************************************

changed: [lnmt1]

 

TASK [jpress : template_nginx.j2] ******************************************************************************************************************

changed: [lnmt1]

 

RUNNING HANDLER [jpress : start_tomcat] ************************************************************************************************************

changed: [lnmt1]

 

RUNNING HANDLER [jpress : reload_nginx] ************************************************************************************************************

changed: [lnmt1]

 

PLAY RECAP *****************************************************************************************************************************************

lnmt1                      : ok=26   changed=21   unreachable=0    failed=0    skipped=0    rescued=0    ignored=0  

 

 

 

被管理节点过滤端口:

[root@localhost ~]# netstat -anptu|grep -i "listen"

tcp        0      0 0.0.0.0:3306            0.0.0.0:*               LISTEN      4478/mysqld        

tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      3998/nginx: master 

tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      894/sshd           

tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN      1040/master        

tcp6       0      0 127.0.0.1:8010          :::*                    LISTEN      6105/java          

tcp6       0      0 :::8080                 :::*                    LISTEN      6105/java          

tcp6       0      0 :::22                   :::*                    LISTEN      894/sshd           

tcp6       0      0 ::1:25                  :::*                    LISTEN      1040/master

 

浏览器测试:

 

 

 

 

出现以上画面无法跳转时需要使用以下方法远程重启tomcat服务

 

Ansible远程重启tomcat服务:

此nohup的使用与以上的部署服务的用意相同,让脚本在后台运行来调用变量,因为nohup默认是在后台执行脚本的,而shell的执行是再开启一个子shell来执行脚本的,当执行完后,就回到到了原来的shell,所以环境变量找不到。

[root@ansible myroles]# ansible lnmt -u root -m shell -a 'nohup sh /usr/local/tomcat/bin/stop_tomcat.sh'

lnmt1 | CHANGED | rc=0 >>

tomcat stop_falsenohup: ignoring input

NOTE: Picked up JDK_JAVA_OPTIONS:  --add-opens=java.base/java.lang=ALL-UNNAMED --add-opens=java.base/java.io=ALL-UNNAMED --add-opens=java.base/java.util=ALL-UNNAMED --add-opens=java.base/java.util.concurrent=ALL-UNNAMED --add-opens=java.rmi/sun.rmi.transport=ALL-UNNAMED

[root@ansible myroles]# ansible lnmt -u root -m shell -a 'nohup sh /usr/local/tomcat/bin/start_tomcat.sh'

lnmt1 | CHANGED | rc=0 >>

Tomcat started.

tomcat startupnohup: ignoring input

 

再次通过浏览器访问:

 

至此jpress一键式部署全部完成

posted @   你好我叫阿成  阅读(1165)  评论(0编辑  收藏  举报
编辑推荐:
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
阅读排行:
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
点击右上角即可分享
微信分享提示