使用Ansible进行分离部署lnmp:nginx、php、mysql都通过源码安装
系统 | IP | 主机名 | 角色 |
---|---|---|---|
CentOS 7.4 | 192.168.2.10 | Ansible | Ansible |
192.168.2.8 | nginx | nginx | |
192.168.2.11 | php | php | |
192.168.2.12 | mysqldb | mysqldb |
1、准备工作
1.1、 生成公私钥
[root@Ansible roles]# ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
/root/.ssh/id_rsa already exists.
Overwrite (y/n)? y
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:qfRxoDOzgmuHxg9WHPGAMcSCrzgJM6uQJaB5kiTlIeI root@Ansible
The key's randomart image is:
+---[RSA 2048]----+
|++*oo |
|B+oo + |
|=E. . . . |
|X +. . . o |
|o% o * S . |
|O o . B o |
|oo+.. o . |
|..=o.. |
| o.o. |
+----[SHA256]-----+
[root@Ansible ~]# for i in {8,11,12}; do ssh-copy-id -i 192.168.2.$i ; done
.............
.......
1.2、 创建管理目录
[root@Ansible ~]# cd /etc/ansible/roles/
[root@Ansible roles]# mkdir -p lnmp/roles/{mysql,nginx,php}/{files,handlers,meta,tasks,templates,vars}
[root@Ansible roles]# vim /etc/ansible/hosts
.................
[mysql]
192.168.2.12
[php]
192.168.2.11
[nginx]
192.168.2.8
保存
——————————————————————————————————————————————————————
[root@Ansible roles]# ansible all -m ping
192.168.2.11 | SUCCESS => {
"changed": false,
"ping": "pong"
}
192.168.2.8 | SUCCESS => {
"changed": false,
"ping": "pong"
}
192.168.2.12 | SUCCESS => {
"changed": false,
"ping": "pong"
}
——————————————————————————————————————————————————————————
[root@Ansible roles]# vim lnmp/lnmp.yml #创建lnmp入口文件,用来调用roles
---
- hosts: mysql
remote_user: root
gather_facts: True
roles:
- mysql
- hosts: nginx
remote_user: root
gather_facts: True
roles:
- nginx
- hosts: php
remote_user: root
gather_facts: True
roles:
- php
保存
1.3、文件树(把相关文件上传到相应位置否则会报错)
[root@Ansible roles]# yum -y install tree
[root@Ansible roles]# tree .
.
└── lnmp
├── lnmp.retry
├── lnmp.yml
├── nginx.yml
├── php.yml
└── roles
├── mysql
│ ├── files
│ │ ├── cmake-2.8.6.tar.gz
│ │ └── mysql-5.6.36.tar.gz
│ ├── handlers
│ ├── meta
│ ├── tasks
│ │ ├── copy.yml
│ │ ├── install.yml
│ │ └── main.yml
│ ├── templates
│ │ ├── change_passwd.sh
│ │ ├── my.cnf
│ │ └── mysqld.service
│ └── vars
│ └── main.yml
├── nginx
│ ├── files
│ │ └── nginx-1.18.0.tar.gz
│ ├── handlers
│ ├── meta
│ ├── tasks
│ │ ├── copy.yml
│ │ ├── install.yml
│ │ └── main.yml
│ ├── templates
│ │ ├── nginx
│ │ └── nginx.conf
│ └── vars
│ └── main.yml
└── php
├── files
│ ├── php-5.5.38.tar.gz
│ └── php-fpm.conf
├── handlers
├── meta
├── tasks
│ ├── copy.yml
│ ├── install.yml
│ ├── main.yml
│ └── prepare.yml
├── templates
│ ├── testa.php
│ └── testm.php
└── vars
└── main.yml
23 directories, 29 files
注意:上面的文件树是这个实验完成后查询的
2、mysql角色
[root@Ansible roles]# vim lnmp/roles/mysql/vars/main.yml
MYSQL_VER: 5.6.36
MYSQL_USER: mysql
MYSQL_PORT: 3306
MYSQL_PASSWD: 123.com
SOURCE_DIR: /usr/src
BASE_DIR: /usr/local/mysql
DATA_DIR: /usr/local/mysql/data
保存
——————————————————————————————————————————————————————————————————————
[root@Ansible roles]# vim lnmp/roles/mysql/templates/my.cnf
[mysqld]
basedir = {{ BASE_DIR }}
datadir = {{ DATA_DIR }}
port = {{ MYSQL_PORT }}
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
character_set_server=utf8
init_connect='SET NAMES utf8'
log-error={{ BASE_DIR }}/logs/mysqld.log
pid-file={{ BASE_DIR }}/data/{{ ansible_fqdn }}.pid
skip-name-resolve
explicit_defaults_for_timestamp=true
保存
——————————————————————————————————————————————————————————————————————
[root@Ansible roles]# vim lnmp/roles/mysql/templates/mysqld.service
[Unit]
Description=mysql server
After=network.target
[Service]
User={{ MYSQL_USER }}
Group={{ MYSQL_USER }}
Type=forking
ExecStart={{ BASE_DIR }}/bin/mysqld.sh start
ExecStop={{ BASE_DIR }}/bin/mysqld.sh stop
PIDFile={{ DATA_DIR }}/{{ ansible_fqdn }}.pid
[Install]
WantedBy=multi-user.target
PrivateTmp=false
保存
————————————————————————————————————————————————————————————————————————————
[root@Ansible roles]# vim lnmp/roles/mysql/templates/change_passwd.sh #该脚本用于更改数据库root密码
#!/bin/bash
passwd={{ MYSQL_PASSWD }}
{{ BASE_DIR }}/bin/mysql -uroot -D mysql -e "UPDATE user SET authentication_string=PASSWORD("$passwd") WHERE user='root';"
{{ BASE_DIR }}/bin/mysql -uroot -e "FLUSH PRIVILEGES;"
{{ BASE_DIR }}/bin/mysql -uroot -p$passwd -e "grant all privileges on *.* to root@'%' identified by '$passwd';"
保存
————————————————————————————————————————————————————————————————————————————
[root@Ansible roles]# vim lnmp/roles/mysql/tasks/copy.yml
- name: "创建mysql用户组"
group: name={{ MYSQL_USER }} state=present
- name: "创建mysql用户"
user: name={{ MYSQL_USER }} group={{ MYSQL_USER }} state=present create_home=False shell=/sbin/nologin
- name: "解压cmake源码包"
unarchive: src=cmake-2.8.6.tar.gz dest={{ SOURCE_DIR }}
- name: "解压mysql源码包"
unarchive: src=mysql-5.6.36.tar.gz dest={{ SOURCE_DIR }}
- name: "安装cmake"
shell: "cd /usr/src/cmake-2.8.6 && ./configure && gmake && gmake install"
- name: "安装mysql"
shell: "cd /usr/src/mysql-5.6.36/ && cmake -DCMAKE_INSTALL_PREFIX=/usr/local/mysql -DSYSCONFDIR=/etc -DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci -DWITH_EXTRA_CHARSETS=all && make && make install && chown -R {{ MYSQL_USER }}:{{ MYSQL_USER }} {{ BASE_DIR }} && rm -rf /etc/my.cnf && cp /usr/src/mysql-5.6.36/support-files/mysql.server /usr/local/mysql/bin/mysqld.sh && chmod +x /usr/local/mysql/bin/mysqld.sh"
- name: "拷贝mysql的配置文件"
template: src=my.cnf dest=/etc/my.cnf owner=root group=root
- name: "拷贝mysql服务文件"
template: src=mysqld.service dest=/usr/lib/systemd/system/mysqld.service owner=root group=root
- name: "创建mysql日志存放路径"
file: dest={{ BASE_DIR }}/logs state=directory owner={{ MYSQL_USER }} group={{ MYSQL_USER }}
保存
——————————————————————————————————————————————————————————————————————————————
[root@Ansible roles]# vim lnmp/roles/mysql/tasks/install.yml
- name: "mysql初始化"
shell: "{{ BASE_DIR }}/scripts/mysql_install_db --user={{ MYSQL_USER }} --basedir={{ BASE_DIR }} --datadir={{ DATA_DIR }}"
- name: "配置环境变量"
shell: "ln -snf /usr/local/mysql/bin/* /usr/local/bin/"
- name: "启动mysql并开机启动"
shell: "systemctl daemon-reload && systemctl enable mysqld && systemctl start mysqld"
- name: "拷贝更改密码脚本"
template: src=change_passwd.sh dest={{ SOURCE_DIR }}/change_passwd.sh owner=root group=root
保存
————————————————————————————————————————————————————————————————————————————————
[root@Ansible roles]# vim lnmp/roles/mysql/tasks/main.yml
- include: /etc/ansible/roles/lnmp/roles/php/tasks/prepare.yml
- include: copy.yml
- include: install.yml
保存
3、php角色
[root@Ansible roles]# vim lnmp/roles/php/templates/testa.php #php测试页面"
<?php
phpinfo();
?>
保存
——————————————————————————————————————————————————————
[root@Ansible roles]# vim lnmp/roles/php/templates/testm.php #mysql测试页面
<?php
$link=mysql_connect('192.168.2.11','root','123.com');
if($link) echo "恭喜你,数据库连接成功啦//哈哈哈哈哈!!";
mysqli_close($link);
?>
保存
[root@Ansible roles]# vim lnmp/php.yml
- hosts: php
remote_user: root
gather_facts: True
roles:
- php
保存
——————————————————————————————————————————————————————————————————————————————
修改配置
[root@Ansible roles]# vim lnmp/roles/php/files/php-fpm.conf
........
...
149 user = php
150 group = php
....
164 listen = 192.168.2.11:9000
.....
230 pm.max_children = 60
...
235 pm.start_servers = 6
...
240 pm.min_spare_servers = 3
..
245 pm.max_spare_servers = 6
....
.....
保存
——————————————————————————————————————————————————————————————————————————————
[root@Ansible roles]# vim lnmp/roles/php/tasks/prepare.yml
- name: "安装依赖软件"
yum:
name:
- ncurses-devel
- cmake
- gd
- libxml2-devel
- libjpeg-devel
- pcre-devel
- zlib-devel
- libxml2
- openssl
- openssl-devel
- bzip2
- bzip2-devel
- libpng
- libpng-devel
- gcc
- gcc-c++
- readline
- readline-devel
- freetype
- freetype-devel
保存
——————————————————————————————————————————————————————————————————————————————
[root@Ansible roles]# vim lnmp/roles/php/vars/main.yml
PHP_VER: 5.5.38
PHP_USER: php
PHP_PORT: 9000
SOURCE_DIR: /usr/src
PHP_DIR: /usr/local/php5
MYSQL_DIR: /usr/local/mysql
保存
——————————————————————————————————————————————————————————————————————————————
[root@Ansible roles]# vim lnmp/roles/php/tasks/copy.yml
- name: "创建php用户组"
group: name={{ PHP_USER }} state=present
- name: "创建php用户"
user: name={{ PHP_USER }} group={{ PHP_USER }} state=present create_home=False shell=/sbin/nologin
- name: "解压php包"
unarchive: src=php-{{ PHP_VER }}.tar.gz dest={{ SOURCE_DIR }}
- name: "创建nginx存放html路径"
file: path=/usr/local/nginx/html state=directory
- name: "上传php测试页面"
template: src=testa.php dest=/usr/local/nginx/html
- name: "上传mysql测试页面"
template: src=testm.php dest=/usr/local/nginx/html
保存
——————————————————————————————————————————————————————————————————————————————
[root@Ansible roles]# vim lnmp/roles/php/tasks/install.yml
- name: "编译php"
shell: "cd /usr/src/php-5.5.38/ && ./configure --prefix=/usr/local/php5 --enable-fpm --with-mysql=mysqlnd --with-pdo-mysql=mysqlnd --with-zlib --with-config-file-path=/usr/local/php5 --with-jpeg-dir --enable-mbstring --with-gd --with-openssl --enable-sockets --enable-sysvshm --with-freetype-dir --with-png-dir --with-libxml-dir=/usr --enable-xml --with-mhash --with-config-file-scan-dir=/etc/php.d --with-bz2 --enable-maintainer-zts && make && make install && cp php.ini-development /usr/local/php5/php.ini && ln -sb /usr/local/php5/bin/* /usr/local/bin/ && ln -sb /usr/local/php5/sbin/* /usr/local/sbin/"
- name: "修改php-fpm配置"
copy: src=php-fpm.conf dest=/usr/local/php5/etc/php-fpm.conf
- name: "启动php"
shell: "/usr/local/sbin/php-fpm"
保存
——————————————————————————————————————————————————————————————————————————————
[root@Ansible roles]# vim lnmp/roles/php/tasks/main.yml
- include: prepare.yml
- include: copy.yml
- include: install.yml
保存
4、nginx角色
[root@Ansible roles]# vim lnmp/roles/nginx/templates/nginx.conf nginx配置文件
worker_processes 1;
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;
index index.html index.htm;
}
location ~\.php$ {
root html;
fastcgi_pass 192.168.2.11:9000;
fastcgi_index index.php;
include fastcgi.conf;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
保存
[root@Ansible roles]# vim lnmp/nginx.yml
---
- hosts: nginx
remote_user: root
gather_faots: True
roles:
- nginx
保存
——————————————————————————————————————————————————————————————————————————
[root@Ansible roles]# vim lnmp/roles/nginx/vars/main.yml
NGINX_VER: 1.18.0
NGINX_USER: nginx
NGINX_PORT: 80
SOURCE_DIR: /usr/src
NGINX_DIR: /usr/local/nginx
保存
——————————————————————————————————————————————————————————————————————————
[root@Ansible roles]# vim lnmp/roles/nginx/tasks/copy.yml
- name: "创建nginx用户组"
group: name={{ NGINX_USER }} state=present
- name: "创建nginx用户"
user: name={{ NGINX_USER }} group={{ NGINX_USER }} state=present create_home=False shell=/sbin/nologin
- name: "解压nginx包"
unarchive: src=nginx-{{ NGINX_VER }}.tar.gz dest={{ SOURCE_DIR }}
保存
——————————————————————————————————————————————————————————————————————————
[root@Ansible roles]# vim lnmp/roles/nginx/tasks/install.yml
- name: "编译nginx"
shell: "cd /usr/src/nginx-1.18.0/ && ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_stub_status_module --with-http_dav_module --with-http_addition_module --with-http_sub_module --with-http_flv_module --with-http_mp4_module --with-http_ssl_module --with-http_gzip_static_module && make && make install && ln -sb /usr/local/nginx/sbin/nginx /usr/local/sbin/"
- name: "上传nginx启动脚本"
template: src=nginx dest=/etc/init.d/nginx mode=777
- name: "上传nginx配置文件"
template: src=nginx.conf dest=/usr/local/nginx/conf/nginx.conf
- name: "启动nginx"
shell: /usr/local/nginx/sbin/nginx
保存
——————————————————————————————————————————————————————————————————————————
[root@Ansible roles]# vim lnmp/roles/nginx/tasks/main.yml
- include: /etc/ansible/roles/lnmp/roles/php/tasks/prepare.yml
- include: copy.yml
- include: install.yml
保存
——————————————————————————————————————————————————————————————————————————
[root@Ansible roles]# vim lnmp/roles/nginx/templates/nginx #启动脚本
#!/bin/bash
# chkconfig: - 99 20
# description: Nginx Server Control Script
NP="{{ NGINX_DIR }}/sbin/nginx"
NPF="{{ NGINX_DIR }}/logs/nginx.pid"
case "$1" in
start)
$NP;
if [ $? -eq 0 ]
then
echo "nginx is starting!! "
fi
;;
stop)
kill -s QUIT $(cat $NPF)
if [ $? -eq 0 ]
then
echo "nginx is stopping!! "
fi
;;
restart)
$0 stop
$0 start
;;
reload)
kill -s HUP $(cat $NPF)
if [ $? -eq 0 ]
then
echo "nginx config file is reload! "
fi
;;
*)
echo "Usage: $0 {start|stop|restart|reload}"
exit 1
esac
exit 0
保存
5、验证
[root@Ansible roles]# ansible-playbook -C lnmp/lnmp.yml
PLAY [mysql] **********************************************************************************************************************************
TASK [Gathering Facts] ************************************************************************************************************************
ok: [192.168.2.12]
TASK [mysql : 创建mysql用户组] *********************************************************************************************************************
changed: [192.168.2.12]
TASK [mysql : 创建mysql用户] **********************************************************************************************************************
changed: [192.168.2.12]
TASK [mysql : 解压cmake源码包] *********************************************************************************************************************
skipping: [192.168.2.12]
TASK [mysql : 解压mysql源码包] *********************************************************************************************************************
skipping: [192.168.2.12]
TASK [mysql : 安装cmake] ************************************************************************************************************************
skipping: [192.168.2.12]
TASK [mysql : 安装mysql] ************************************************************************************************************************
skipping: [192.168.2.12]
TASK [mysql : 拷贝mysql的配置文件] *******************************************************************************************************************
changed: [192.168.2.12]
TASK [mysql : 拷贝mysql服务文件] ********************************************************************************************************************
changed: [192.168.2.12]
TASK [mysql : 创建mysql日志存放路径] ******************************************************************************************************************
changed: [192.168.2.12]
TASK [mysql : mysql初始化] ***********************************************************************************************************************
skipping: [192.168.2.12]
TASK [mysql : 配置环境变量] *************************************************************************************************************************
skipping: [192.168.2.12]
TASK [mysql : 启动mysql并开机启动] *******************************************************************************************************************
skipping: [192.168.2.12]
TASK [mysql : 拷贝更改密码脚本] ***********************************************************************************************************************
changed: [192.168.2.12]
PLAY [nginx] **********************************************************************************************************************************
TASK [Gathering Facts] ************************************************************************************************************************
ok: [192.168.2.8]
TASK [nginx : 安装依赖软件] *************************************************************************************************************************
changed: [192.168.2.8]
TASK [nginx : 创建nginx用户组] *********************************************************************************************************************
changed: [192.168.2.8]
TASK [nginx : 创建nginx用户] **********************************************************************************************************************
changed: [192.168.2.8]
TASK [nginx : 解压nginx包] ***********************************************************************************************************************
skipping: [192.168.2.8]
TASK [nginx : 编译nginx] ************************************************************************************************************************
skipping: [192.168.2.8]
TASK [nginx : 上传nginx启动脚本] ********************************************************************************************************************
changed: [192.168.2.8]
TASK [nginx : 上传nginx配置文件] ********************************************************************************************************************
changed: [192.168.2.8]
TASK [nginx : 启动nginx] ************************************************************************************************************************
skipping: [192.168.2.8]
PLAY [php] ************************************************************************************************************************************
TASK [Gathering Facts] ************************************************************************************************************************
ok: [192.168.2.11]
TASK [php : 安装依赖软件] ***************************************************************************************************************************
changed: [192.168.2.11]
TASK [php : 创建php用户组] *************************************************************************************************************************
changed: [192.168.2.11]
TASK [php : 创建php用户] **************************************************************************************************************************
changed: [192.168.2.11]
TASK [php : 解压php包] ***************************************************************************************************************************
skipping: [192.168.2.11]
TASK [php : 上传php测试页面] ************************************************************************************************************************
changed: [192.168.2.11]
TASK [php : 上传mysql测试页面] **********************************************************************************************************************
changed: [192.168.2.11]
TASK [php : 编译php] ****************************************************************************************************************************
skipping: [192.168.2.11]
TASK [php : 修改php-fpm配置] **********************************************************************************************************************
changed: [192.168.2.11]
TASK [php : 启动php] ****************************************************************************************************************************
skipping: [192.168.2.11]
PLAY RECAP ************************************************************************************************************************************
192.168.2.11 : ok=7 changed=6 unreachable=0 failed=0
192.168.2.12 : ok=7 changed=6 unreachable=0 failed=0
192.168.2.8 : ok=6 changed=5 unreachable=0 failed=0
执行过程时间太长,这里省略输出内容
[root@Ansible lnmp]# ansible-playbook lnmp.yml
............................
...................
............
PLAY RECAP ************************************************************************************************************************************
192.168.2.11 : ok=11 changed=10 unreachable=0 failed=0
192.168.2.12 : ok=15 changed=14 unreachable=0 failed=0
192.168.2.8 : ok=9 changed=8 unreachable=0 failed=0
访问测试: 192.168.2.8 192.168.2.8/testa.php 192.168.2.8/testm.php
在连接mysql数据库上还是有点问题具体是什么原因暂时没有发现
报错信息:
Warning: mysql_connect(): Connection refused in /usr/local/nginx/html/testm.php on line 2
6、总结
总体来说,在做这个实验的过程中有很多报错但是已经解决了,都是一些简单的问题,主要问题还是不够熟练各方面的命令,只要思路清晰,就不会失败,办法总比困难多