利用ansible 自动发布安装

使用本脚本可以自动批量完成中间节点环境的部署工作,包括:Nginx编译安装、添加程序管理脚本、设置开机启动、反向代理配置、证书分发、添加iptables规则等。脚本支持自定义nginx安装版本、设置编译模块、配置监听端口等。
1. Nginx Role规则说明
本脚本用于中间节点(Nginx反向代理)环境的自动化配置,主要内容包括:
安装基础依赖环境;
创建nginx启动用户(支持自定义用户);
下载nginx安装文件(可自定义nginx版本);
解压安装文件;
执行编译安装(可自定义编译参数和模块);
添加管理脚本,用于nginx服务的启动和关闭;
设置开机启动;
分发https证书文件;
反向代理配置;
添加iptables规则,允许访问nginx代理服务。
2. Nginx Role规则基本说明
2.1 目录结构说明
Nginx Role目录结构介绍:
nginx                                        # Nginx Role脚本根目录
├── defaults                          # 脚本默认变量目录
│   └── main.yml                     # 脚本默认变量文件
├── files                                  # 文件目录
│   ├── https_cert                 # 文件目录,用于存放https证书文件
│   └── nginx_start_scripts      # nginx启动脚本
├── handlers                           # 任务处理器
│   └── main.yml                    # 定义了 nginx reload和iptables restarted两个处理器任务
├── tasks                              # 任务目录
│   └── main.yml                   # ansible任务文件,定义了需要执行的自动化任务
├── templates                         #模板目录
│   ├── nginx_config_file.j2     # nginx配置模板,使用了jinja2模版语言进行预定义,可通过变量传递配自定义置内容
│   └── nginx_install.j2           # nginx编译安装执行脚本
├── tests                                # 脚本使用的测试用例,脚本执行案例
│   ├── inventory                  # 脚本执行使用的主机清单
│   └── test.yml                      # 脚本执行调用的playbook剧本
└── vars                                 # 脚本变量目录
    └── main.yml                       # 脚本变量文件

2.2 脚本变量说明
默认变量(nginx/defaults/main.yml)
变量名 默认值 说明
nginx_install true nginx编译安装
nginx_start_scripts true 分发nginx启动脚本
nginx_start_service true 启动nginx服务
nginx_start_on_boot true 设置开机启动
nginx_copy_https_cert false 分发https证书文件
nginx_revproxy_config false 设置反向代理配置
add_iptables_for_nginx false 添加iptables防火墙规则
通过默认变量可以控制脚本执行的内容,在使用本脚本前最好是执行下common脚本,先进行系统的初始优化工作。
脚本变量(nginx/vars/main.yml)
---
nginx_user: nginx                                             # nginx启动用户
nginx_group: nginx                                            # nginx组
nginx_version: 1.15.8                                         # 要安装的nginx版本
download_url: http://nginx.org/download                  # nginx文件下载地址
download_dir: /usr/local/src                                 # nginx文件下载存放目录
install_dir: /usr/local/nginx                               # nginx安装目录

model_config:                                                           # nginx编译安装参数
  - "--user={{ nginx_user }}"
  - "--group={{ nginx_group }}"
  - "--prefix={{ install_dir }}"
  - "--with-http_realip_module"
  - "--with-http_sub_module"
  - "--with-http_gzip_static_module"
  - "--with-http_stub_status_module"
  - "--with-http_ssl_module"
  - "--with-pcre"

可以通过修改nginx_version来修改需要安装的版本,但需要确认下载地址download_url中存在对应版本,并可以下载。
2.3 nginx反向代理配置模版说明
nginx反向代理配置模版(nginx/templates/nginx_config_file.j2)
user {{ nginx_user }};
worker_processes  {{ ansible_processor_vcpus }};
events {
    worker_connections  102400;
}

http {
    include       mime.types;
    default_type  application/octet-stream;
    log_format main '$remote_addr $http_X_Forwarded_For [$time_local] '  
                     '$upstream_addr $upstream_response_time '  
                     '$http_host $request '  
                     '"$status" $body_bytes_sent "$http_referer" '  
                     '"$http_accept_language" "$http_user_agent" '; 
    sendfile        on;
    tcp_nopush      on; 
    tcp_nodelay     on;
    server_tokens  off;
    keepalive_timeout  65;

    
    {% for item in nginx_revproxy_sites %}    # 对nginx_revproxy_sites配置变量进行循环
    {% if item.host == ansible_host %}          # 判断host是否等于当前执行任务的主机地址,如果相等继续执行后面操作
    upstream {{ item.desc }}_backend {         # 使用desc变量内容加上_backend作为upstream名称
        {% for upstream in item.upstreams %}  # 遍历upstreams
           server {{ upstream.address }}:{{ upstream.port }}; # 将遍历结果作为upstream模块集群转发地址(反向代理的回源请求地址,upstream支持多节点的集群负载)
        {% endfor %}
    } 
    server {
        listen       {{ item.listen_port | default(80) }};    # 配置http监听端口,如果没有定义listen_port默认使用80端口
        server_name  {{ item.domains | join(" ") }};          配置访问域名,支持多域名设置
        access_log  logs/access.log  main;

      {% if item.ssl_status %}   # 判断ssl_status状态,如果状态为true,则将http请求跳转到https(跳转会加上listen_ssl_port和请求链接)
        return   301  https://$server_name:{{ item.listen_ssl_port | default(443)   }}$request_uri;
      {% else %}  # 如果ssl_status状态为false,则使用http代理将请求转发到上面定义的upstream集群
        location / {

                proxy_pass http://{{ item.desc }}_backend;
            
            }
      {% endif %}
        }
    {% if item.ssl_status %}    # ssl_status状态为true是进行https反向代理配置和域名证书配置
    server {
        listen       {{ item.listen_ssl_port | default(443) }} ssl;
        server_name  {{ item.domains | join(" ") }};
        ssl_certificate  {{ item.ssl_crt }};
        ssl_certificate_key {{ item.ssl_key }};
                ssl_session_timeout 50m;
                ssl_protocols TLSv1.2;
                ssl_ciphers AESGCM:ALL:!DH:!EXPORT:!RC4:+HIGH:!MEDIUM:!LOW:!aNULL:!eNULL;
                ssl_prefer_server_ciphers on;
        access_log  logs/access.log  main;
        location / {
                proxy_set_header Host $host;
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_request_buffering off;
                proxy_ignore_client_abort on;
                proxy_pass   https://{{ item.desc }}_backend;
        }
    }
    {% endif %}
    {% endif %} 
 {% endfor %}
}

反向代理模版配置说明:
配置模版使用了Jinja2模版语言使用自定义变量来动态进行配置文件的渲染;
user {{ nginx_user }}:使用自定义的用户作为nginx启动用户;
worker_processes {{ ansible_processor_vcpus }}:获取cup核数,设置worker_processes;
其他说明详见模版中注释内容。
3 Nginx role脚本使用说明
在脚本中已经创建了一个简单的使用案例(nginx/tests/)可以作为参考,同时前面已经介绍了默认变量和脚本变量,在脚本使用过程中可以去自定义这些变量内容。
使用脚本前先将脚本目录(nginx)拷贝到/etc/ansible/roles目录下
3.1 基本功能使用
通过以下事例可以完成nginx的编译安装和开机启动配置:
1) 新建一个主机清单文件(nginx/tests/inventory):
[proxy_server]
192.168.0.100
192.168.0.101

这里默认已经使用common脚本进行了系统的初始化配置,可以通过密钥来登陆主机清单中的主机。如果清单中主机没有配置密钥登陆,在定义清单时需要制定远程登陆用户和密码:
[proxy_server]
192.168.0.100 ansible_ssh_user=root ansible_ssh_pass=CPBal1Tid
192.168.0.101 ansible_ssh_user=root ansible_ssh_pass=KJadfiola

新建执行脚本用的playbook剧本(nginx/tests/nginx_site.yml)
---
- hosts: proxy_server
  remote_user: root
  roles:
    - nginx

3) 执行脚本
cd /etc/ansible/roles/nginx/tests/
ansible-playbook nginx_site.yml -i inventory

脚本成功执行完成后,ansible会在inventory清单中的远程主机编译安装nginx,并添加到开机启动。
4)执行结果验证
ansible proxy_server -m shell -a "ps -ef |grep nginx" -i inventory 
192.168.0.100 | CHANGED | rc=0 >>
root      2228     1  0 13:24 ?        00:00:00 nginx: master process /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
nginx     2229  2228  0 13:24 ?        00:00:00 nginx: worker process
root      5781  5780  0 13:36 pts/0    00:00:00 /bin/sh -c ps -ef |grep nginx
root      5783  5781  0 13:36 pts/0    00:00:00 grep nginx

....后面内容省略....

可以看到远程主机已经成功安装了nginx并启动了nginx服务,当然你也可以确认下是否分发了nginx启动脚本和是否设置了开机启动。
3.2 反向代理配置和证书分发
如果想要在安装nginx的同时配置反向代理,和分发证书文件,按照下面步骤进行操作:
1)上传证书文件
将https证书文件上传到nginx/files/https_cert目录。
2)修改nginx/tests/nginx_site.yml文件
---
- hosts: proxy_server
  remote_user: root
  vars:
    nginx_copy_https_cert: true
    nginx_revproxy_config: true
    add_iptables_for_nginx: true
    nginx_revproxy_sites:           # nginx 反向代理配置内容,对照《2.3 nginx反向代理配置模版说明》更便于理解                             
      - host: 192.168.0.100         # 反向代理配置对应的主机
        desc: t_server              # 反向代理集群备注,nginx配置模版中引用它作为upstream名称
        domains:                    # 域名,用于定义server_name,支持多个域名配置
          - example.com
          - www.example.com
        upstreams:                  # nginx反向代理集群配置内容,可以添加多个节点,默认采用轮训方式进行请求转发
          - { address: 192.168.10.11, port: 80}
          - { address: 192.168.10.12, port: 8080}
        listen_port: 80             # http监听端口,如果不设置,默认使用80端口
        listen_ssl_port: 443        # https监听端口,如果不设置,默认使用https端口
        ssl_status: true            # 设置为true启用https配置
        ssl_crt: /etc/ssl/test.com.crt  # 证书文件
        ssl_key:  /etc/ssl/test.com.key  # 证书文件
      - host: 192.168.0.101
        desc: z_server
        domains:
          - example01.com
          - wwww.example01.com
        upstreams:
          - { address: 192.168.0.21, port: 80}
          - { address: 192.168.0.22, port: 80}
        ssl_status: false
  roles:
    - nginx

执行nginx role的playbook剧本说明:
nginx_copy_https_cert:默认变量,用来控制证书文件分发,设置为true,执行证书分发操作;
nginx_revproxy_config:默认变量,用来启用反向代理配置,设置为ture,进行模版变量替换和分发;
add_iptables_for_nginx:默认变量,用来添加iptables规则,需要保证系统已安装iptables-services服务(common基础优化脚本中已经定义安装过程);
nginx_revproxy_sites:nginx反向代理的配置内容,详细说明件上面的备注。

配置注意事项:
如果启用了nginx_copy_https_cert、nginx_revproxy_config、add_iptables_for_nginx这三项配置,必须定义nginx_revproxy_sites;
nginx_revproxy_sites中必定义字段有:host、desc、domain、upstreams、ssl_status;
host: 用来确定反向代理配置对应的主机(该主机必须存在于inventory主机清单中);
ssl_status:当ssl_status状态为true时,需要定义证书文件ssl_crt和ssl_key,其中证书名称必须和上传到nginx/files/https_cert目录中的名称对应;
listen_port(listen_ssl_port): http(https)监听端口,这两个选项不是必须定义,如果在playbook中没有定义,脚本默认会采用80(443)端口,这两个监听端口不能用同一个端口。
配置文件使用的是yaml格式,在定义文件内容时注意缩紧。
作者:james

-------------------------------------------

个性签名:独学而无友,则孤陋而寡闻。做一个灵魂有趣的人!

如果觉得这篇文章对你有小小的帮助的话,记得在右下角点个“推荐”哦,博主在此感谢!

原文地址:https://www.cnblogs.com/jameslove/p/10923927.html