Loading

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目录结构。

image-20230304203837354

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 测试

image-20230304213150243

image-20230304213214395


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();
?>

测试成功

image-20230304222512152


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 测试

image-20230305105744761


已根据需求进行初始化

image-20230305105918016


在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";
 }
?>

成功连接

image-20230305093044207


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 测试

image-20230305095617828


在nfs上查看相关信息,都进行修改和添加了

image-20230305095638014


在web主机上进行挂载测试,没问题

image-20230305095709476

image-20230305095717457


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

image-20230305104230026

image-20230305110021678


三、整体剧本框架

[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
posted @ 2023-09-16 15:43  YinJayChen  阅读(15)  评论(0编辑  收藏  举报