Ansible一键部署网站
Ansible一键部署网站
一、部署需求
通过Ansible来一键部署blog网站,主要部署这几个软件,nginx、nfs、php、mariaDB、wordpress。
角色 | 主机名 | 公网IP | 内网IP | 服务 |
---|---|---|---|---|
管理机 | ms01 | 10.0.0.61 | 172.16.1.61 | Ansilble |
web服务器 | web01 | 10.0.0.7 | 172.16.1.7 | nginx、php |
存储 | nfs01 | 10.0.0.31 | 172.16.1.31 | nfs |
数据库 | db01 | 10.0.0.51 | 172.16.1.51 | mariaDB |
二、编写剧本
2.1 分析脚本框架
按软件来进行编写剧本,大致可以分为以下roles目录结构。
mkdir -p roles/auto-auth/{files,handlers,tasks,templates}
cp -r roles/auto-auth/ roles/nginx
cp -r roles/auto-auth/ roles/mariadb
cp -r roles/auto-auth/ roles/php
cp -r roles/auto-auth/ roles/nfs-server
cp -r roles/auto-auth/ roles/wordpress
2.2 编写hosts文件和入口文件
[root@ms01 ~]# cat roles/hosts
[all]
172.16.1.7
172.16.1.31
172.16.1.51
[web]
172.16.1.7
[nfs]
172.16.1.31
[db]
172.16.1.51
[all:vars]
ansible_ssh_user=root
ansible_ssh_pass='123456'
[root@ms01 ~]# cat roles/top.yml
---
- hosts: all
roles:
- role: auto-auth
- hosts: web
roles:
- role: nginx
- hosts: web
roles:
- role: php
- hosts: db
roles:
- role: mariadb
- hosts: nfs
roles:
- role: nfs-server
- hosts: web
roles:
- role: wordpress
2.3 auto-auth部分
2.3.1 创建密钥
ssh-keygen -t rsa -f ~/.ssh/id_rsa -N ''
#ssh-keygen命令 用于为“ssh”生成、管理和转换认证密钥,它支持RSA和DSA两种认证密钥
#SSH 密钥默认保留在 ~/.ssh 目录中
#id_rsa:私钥文件
#id_rsa.pub:公钥文件
#known_hosts:ssh访问不同的主机会将公钥记录到此文件,每次访问会核对密钥
2.3.2 分发密钥
在auto-auth/tasks目录下创建main.yml,实现分发 ansible 控制端的 ssh 公钥到远程服务器
[root@ms01 roles]# cat auto-auth/tasks/main.yml
- name: 01. 分发密钥
authorized_key: user=root key={{lookup('file','/root/.ssh/id_rsa.pub')}}
2.3.3 关闭指纹检查
[root@ms01 roles]# vim /etc/ansible/ansible.cfg
host_key_checking = False #跳过检查主机指纹
2.3.4 测试
2.4 nginx部分
2.4.1 编写配置文件
在nginx/files/目录下编写一个default.conf,后续可以让copy模块传送到web主机上
[root@ms01 roles]# cat nginx/files/default.conf
server {
listen 80;
root /app/code/www;
location / {
index index.php;
}
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
2.4.2 安装nginx
在nginx/tasks目录下创建main.yml,内容如下。实现安装、创建网站目录、修改配置并启动nginx
[root@ms01 roles]# cat nginx/tasks/main.yml
- name: 安装nginx
yum:
name: nginx
state: installed
- name: 创建目录
file:
path: /app/code/www/
state: directory
- name: 发送配置文件
copy:
src: default.conf
dest: /etc/nginx/conf.d/default.conf
backup: yes
- name: 启动nginx
systemd:
name: nginx
enabled: yes
state: started
2.5 php部分
2.5.1 编写repo文件
在php/files/目录下写一个yum-php.repo文件来提供php的yum源
[root@ms01 roles]# cat php/files/yum-php.repo
[webtatic-php]
name = php Repository
baseurl = http://us-east.repo.webtatic.com/yum/el7/x86_64/
enabled = 1
gpgcheck = 0
2.5.2 创建变量文件
由于下面j2配置文件需要用到变量,在roles/php目录下创建vars变量目录,在main.yml存放变量
[root@ms01 roles]# cat php/vars/main.yml
web_user: nginx
2.5.3 编写www. conf.j2文件
在php/templates/目录下写php的配置
[root@ms01 roles]# cat php/templates/www.conf.j2
[www]
user = {{ web_user }}
group = {{ web_user }}
listen = 127.0.0.1:9000
listen.allowed_clients = 127.0.0.1
pm = dynamic
pm.max_children = 50
pm.start_servers = 5
pm.min_spare_servers = 5
pm.max_spare_servers = 35
slowlog = /var/log/php-fpm/www-slow.log
php_admin_value[error_log] = /var/log/php-fpm/www-error.log
php_admin_flag[log_errors] = on
php_value[session.save_handler] = files
php_value[session.save_path] = /var/lib/php/session
php_value[soap.wsdl_cache_dir] = /var/lib/php/wsdlcache
2.5.4 安装php
在php/tasks目录下创建main.yml,实现拷贝yum-php.repo到远程主机,提供yum源。同时安装php、修改配置并启动php。
[root@ms01 roles]# cat php/tasks/main.yml
- name: yum源
copy:
src: yum-php.repo
dest: /etc/yum.repos.d/yum-php.repo
backup: yes
- name: 安装php
yum:
name:
- php72w
- php72w-cli
- php72w-common
- php72w-devel
- php72w-embedded
- php72w-gd
- php72w-mbstring
- php72w-pdo
- php72w-xml
- php72w-fpm
- php72w-mysqlnd
- php72w-opcache
- php72w-pecl-memcached
- php72w-pecl-redis
- php72w-pecl-mongodb
state: installed
- name: 修改php配置
template:
src: www.conf.j2
dest: /etc/php-fpm.d/www.conf
backup: yes
- name: 启动php
systemd:
name: php-fpm
enabled: yes
state: started
2.5.5 测试
在web主机上创建测试文件
[root@web01 ~]# cat /app/code/www/index.php
<?php
phpinfo();
?>
测试成功
2.6 mariaDB部分
2.5.1 安装并初始化数据库
在mariadb/tasks目录下创建main.yml,实现安装mariadb以及python操作数据库插件,启动mariadb并进行初始化配置,例如删除无用账户和库,并配置提供给web连接的用户和设置root密码,同时创建wordpress数据库供网站使用。
[root@ms01 roles]# cat mariadb/tasks/main.yml
---
- name: 01.安装mariadb-server、MySQL-python
yum:
name:
- mariadb-server
- MySQL-python
state: installed
- name: 02.启动
systemd:
name: mariadb
enabled: yes
state: started
- name: 03.配置 删除空用户
mysql_user:
name: "{{ item.name }}"
host: "{{item.host}}"
state: absent
update_password: always
loop:
- { name: "" , host: "localhost" }
- { name: "" , host: "{{ ansible_hostname }}" }
- name: 04.配置 删除无用的库(test)
mysql_db:
name: test
state: absent
- name: 05.添加远程用户
mysql_user:
name: web
password: "123123"
host: "172.16.1.%"
priv: "*.*:ALL,GRANT"
state: present
- name: 06.添加数据库
mysql_db:
name: "wordpress"
encoding: "utf8"
state: present
- name: 07.设置密码 root
mysql_user:
name: root
host: localhost
password: "123456"
update_password: always
2.5.2 测试
已根据需求进行初始化
在web主机上创建测试文件
[root@web01 ~]# vim /app/code/www/mysql.php
<?php
//$link_id=mysqli_connect('数据库服务器的ip','用户','密码');
//数据库与php在一起 ip位置写为localhost
//不在一起 ip位置写数据库的ip
$link_id=mysqli_connect('172.16.1.51','web','123123');
if($link_id){
echo "mysql successful by yinjay ! \n";
}else{
echo "you conn is down mysql error \n";
}
?>
成功连接
2.7 nfs部分
2.7.1 创建变量文件
由于下面nfs配置文件需要用到变量,在roles/nfs-server目录下创建vars变量目录,在main.yml存放变量
[root@ms01 roles]# cat nfs-server/vars/main.yml
nfs_user: nginx
nfs_user_uid: 982
nfs_user_gid: 982
2.7.2 编写j2配置文件
在nfs-server/templates/目录下写nfs的配置
[root@ms01 roles]# vim /templates/exports.j2
/data/blog 172.16.1.0/24(rw,all_squash,anonuid={{nfs_user_uid}},anongid={{nfs_user_gid}})
2.7.2 安装nfs
在nfs-server/tasks目录下创建main.yml,实现安装nfs、添加nfs需要用到的用户、目录,修改nfs的配置文件并启动nfs。
[root@ms01 roles]# vim nfs-server/tasks/main.yml
---
- name: 01.安装nfs
yum:
name:
- rpcbind
- nfs-utils
state: installed
- name: 02.创建组 {{nfs_user}}
group:
name: "{{nfs_user}}"
gid: "{{nfs_user_gid}}"
state: present
- name: 03.创建用户 {{nfs_user}}
user:
name: "{{nfs_user}}"
uid: "{{nfs_user_uid}}"
group: "{{nfs_user}}"
state: present
- name: 04.创建目录
file:
name: "{{ item }}"
owner: "{{nfs_user}}"
group: "{{nfs_user}}"
state: directory
loop:
- /data/blog
- name: 05.修改配置文件
template:
src: exports.j2
dest: /etc/exports
backup: yes
- name: 06.启动nfs
systemd:
name: "{{ item }}"
enabled: yes
state: started
loop:
- rpcbind
- nfs
2.7.3 测试
在nfs上查看相关信息,都进行修改和添加了
在web主机上进行挂载测试,没问题
2.8 wordpress部分
2.8.1 上传程序包
上传wordpress到wordpress/files目录下
[root@ms01 roles]# ll wordpress/files/wordpress.zip
-rw-r--r-- 1 root root 21076679 Mar 4 21:06 wordpress/files/wordpress.zip
2.8.2 编写网站配置文件
在nginx/files/目录下编写一个blog.yinjay.com.conf,后续可以让copy模块传送到web主机上
[root@ms01 roles]# vim wordpress/files/blog.yinjay.com.conf
server {
listen 80;
server_name blog.yinjay.com;
root /app/code/wordpress;
location / {
index index.php;
}
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
2.8.2 解压并配置目录权限
在wordpress/tasks目录下创建main.yml,实现创建站点目录、代码解压、添加网站配置文件并让nginx重新加载配置。
[root@ms01 roles]# vim wordpress/tasks/main.yml
- name: 1.创建站点目录
file:
path: /app/code/wordpress
owner: nginx
group: nginx
state: directory
- name: 2.代码解压
unarchive:
src: wordpress.zip
dest: /app/code/wordpress
owner: nginx
group: nginx
- name: 3.添加网站配置文件
copy:
src: blog.yinjay.com.conf
dest: /etc/nginx/conf.d/blog.yinjay.com.conf
backup: yes
notify:
- reload nginx config
在wordpress/handlers下创建main.yml,添加触发器内容
[root@ms01 roles]# cat wordpress/handlers/main.yml
- name: reload nginx config
systemd:
name: nginx
state: reloaded
2.8.3 测试
在window宿主机添加hosts记录
10.0.0.7 blog.yinjay.com
访问blog.yinjay.com
三、整体剧本框架
[root@ms01 ~]# tree roles/
roles/
├── 1.yml
├── auto-auth
│ ├── files
│ ├── handlers
│ ├── tasks
│ │ └── main.yml
│ └── templates
├── hosts
├── mariadb
│ ├── files
│ ├── handlers
│ ├── tasks
│ │ └── main.yml
│ └── templates
├── nfs-server
│ ├── files
│ ├── handlers
│ ├── tasks
│ │ └── main.yml
│ ├── templates
│ │ └── exports.j2
│ └── vars
│ └── main.yml
├── nginx
│ ├── files
│ │ └── default.conf
│ ├── handlers
│ ├── tasks
│ │ └── main.yml
│ └── templates
├── php
│ ├── files
│ │ └── yum-php.repo
│ ├── handlers
│ ├── tasks
│ │ └── main.yml
│ ├── templates
│ │ └── www.conf.j2
│ └── vars
│ └── main.yml
├── top.yml
└── wordpress
├── files
│ ├── blog.yinjay.com.conf
│ └── wordpress.zip
├── handlers
│ └── main.yml
├── tasks
│ └── main.yml
└── templates