1. 程式人生 > 其它 >Ansible實現LNMP+LNMT一鍵式部署

Ansible實現LNMP+LNMT一鍵式部署

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一鍵式部署全部完成

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一鍵式部署全部完成