Ansible项目lnmp分离部署

使用Ansible进行分离部署lnmp:nginxphpmysql都通过源码安装

系统IP主机名角色
CentOS 7.4192.168.2.10AnsibleAnsible
192.168.2.8nginxnginx
192.168.2.11phpphp
192.168.2.12mysqldbmysqldb

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、总结

总体来说,在做这个实验的过程中有很多报错但是已经解决了,都是一些简单的问题,主要问题还是不够熟练各方面的命令,只要思路清晰,就不会失败,办法总比困难多

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

乘浪初心

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值