linux 学习笔记-098-自动化运维-playbook 安装 nginx

发布于 2018-05-31  167 次阅读


用 playbook 安装 nginx

思路:先在一台机器上编译安装好 nginx、打包,然后再用 ansible 去下发做这个实验前,请确保两台机器都没安装 nginx、httpd 等,如安装了,请自行删除

创建相关的目录

[root@am-01:~#] cd /etc/ansible/

[root@am-01:/etc/ansible#] mkdir nginx_install

[root@am-01:/etc/ansible#] cd nginx_install/

[root@am-01:/etc/ansible/nginx_install#] mkdir -p roles/{common,install}/{handlers,files,meta,tasks,templates,vars}

[root@am-01:/etc/ansible/nginx_install#] ls roles/common/

files  handlers  meta  tasks  templates  vars

[root@am-01:/etc/ansible/nginx_install#] ls roles/install/

files  handlers  meta  tasks  templates  vars

#roles 目录下有两个角色,common 为安装前的准备工作,install 为安装 nginx 的操作。每个角色下面又有几个目录,handlers 下面是当发生改变时要执行的操作,通常用在配置文件发生改变,重启服务。files 为安装时用到的一些文件,meta 为说明信息,说明角色依赖等信息,tasks 里面是核心的配置文件,templates 通常存一些配置文件,启动脚本等模板文件,vars 下为定义的变量

准备批量安装 nginx 要用到的文件(am-01)

编译安装 nginx

[root@am-01:/etc/ansible/nginx_install#] cd /usr/local/src/

[root@am-01:/usr/local/src#] wget http://nginx.org/download/nginx-1.12.1.tar.gz

[root@am-01:/usr/local/src#] tar zxvf nginx-1.12.1.tar.gz

[root@am-01:/usr/local/src#] cd nginx-1.12.1/

[root@am-01:/usr/local/src/nginx-1.12.1#] ./configure --prefix=/usr/local/nginx

[root@am-01:/usr/local/src/nginx-1.12.1#] make && make install

[root@am-01:/usr/local/src/nginx-1.12.1#] vim /etc/init.d/nginx

#!/bin/bash

# chkconfig: - 30 21

# description: http service.

# Source Function Library

. /etc/init.d/functions

# Nginx Settings

NGINX_SBIN="/usr/local/nginx/sbin/nginx"

NGINX_CONF="/usr/local/nginx/conf/nginx.conf"

NGINX_PID="/usr/local/nginx/logs/nginx.pid"

RETVAL=0

prog="Nginx"

start()

{

    echo -n $"Starting $prog: "

    mkdir -p /dev/shm/nginx_temp

    daemon $NGINX_SBIN -c $NGINX_CONF

    RETVAL=$?

    echo

    return $RETVAL

}

stop()

{

    echo -n $"Stopping $prog: "

    killproc -p $NGINX_PID $NGINX_SBIN -TERM

    rm -rf /dev/shm/nginx_temp

    RETVAL=$?

    echo

    return $RETVAL

}

reload()

{

    echo -n $"Reloading $prog: "

    killproc -p $NGINX_PID $NGINX_SBIN -HUP

    RETVAL=$?

    echo

    return $RETVAL

}

restart()

{

    stop

    start

}

configtest()

{

    $NGINX_SBIN -c $NGINX_CONF -t

    return 0

}

case "$1" in

  start)

        start

        ;;

  stop)

        stop

        ;;

  reload)

        reload

        ;;

  restart)

        restart

        ;;

  configtest)

        configtest

        ;;

  *)

        echo $"Usage: $0 {start|stop|reload|restart|configtest}"

        RETVAL=1

esac

exit $RETVAL

[root@am-01:/usr/local/src/nginx-1.12.1#] cd /usr/local/nginx/conf/

[root@am-01:/usr/local/nginx/conf#] mv nginx.conf nginx.conf.bak

[root@am-01:/usr/local/nginx/conf#] vim nginx.conf

user nobody nobody;

worker_processes 2;

error_log /usr/local/nginx/logs/nginx_error.log crit;

pid /usr/local/nginx/logs/nginx.pid;

worker_rlimit_nofile 51200;

events

{

    use epoll;

    worker_connections 6000;

}

http

{

    include mime.types;

    default_type application/octet-stream;

    server_names_hash_bucket_size 3526;

    server_names_hash_max_size 4096;

    log_format combined_realip '$remote_addr $http_x_forwarded_for [$time_local]'

    ' $host "$request_uri" $status'

    ' "$http_referer" "$http_user_agent"';

    sendfile on;

    tcp_nopush on;

    keepalive_timeout 30;

    client_header_timeout 3m;

    client_body_timeout 3m;

    send_timeout 3m;

    connection_pool_size 256;

    client_header_buffer_size 1k;

    large_client_header_buffers 8 4k;

    request_pool_size 4k;

    output_buffers 4 32k;

    postpone_output 1460;

    client_max_body_size 10m;

    client_body_buffer_size 256k;

    client_body_temp_path /usr/local/nginx/client_body_temp;

    proxy_temp_path /usr/local/nginx/proxy_temp;

    fastcgi_temp_path /usr/local/nginx/fastcgi_temp;

    fastcgi_intercept_errors on;

    tcp_nodelay on;

    gzip on;

    gzip_min_length 1k;

    gzip_buffers 4 8k;

    gzip_comp_level 5;

    gzip_http_version 1.1;

    gzip_types text/plain application/x-javascript text/css text/htm

    application/xml;

    include vhost/*.conf;

    server {

        listen 80;

        server_name localhost;

        index index.html index.htm index.php;

        root /usr/local/nginx/html;

        location ~ \.php$ {

            include fastcgi_params;

            fastcgi_pass unix:/tmp/php-fcgi.sock;

            fastcgi_index index.php;

            fastcgi_param SCRIPT_FILENAME /usr/local/nginx/html$fastcgi_script_name;

        }

    }

}    

[root@am-01:/usr/local/nginx/conf#] /usr/local/nginx/sbin/nginx -t

nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok

nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful

#按照正常流程编译安装好 nginx 并配置好

打包

[root@am-01:/usr/local#] tar zcvf nginx.tar.gz --exclude "nginx.conf" nginx/

[root@am-01:/usr/local#] mv nginx.tar.gz /etc/ansible/nginx_install/roles/install/files/

[root@am-01:/usr/local#] cp nginx/conf/nginx.conf /etc/ansible/nginx_install/roles/install/templates/

[root@am-01:/usr/local#] cp /etc/init.d/nginx /etc/ansible/nginx_install/roles/install/templates/

#打包 nginx 目录,使用"--exclude"参数忽略配置文件,之后把跟批量安装相关的文件放到对应目录

在 common 中配置主配置文件 main.yml

[root@am-01:/usr/local#] cd /etc/ansible/nginx_install/roles/

[root@am-01:/etc/ansible/nginx_install/roles#] vim common/tasks/main.yml

- name: Install initializtion require software

  yum: name="zlib-devel,pcre-devel" state=installed

#在 common 目录下的 tasks 目录中配置 tasks,使用 yum 模块,安装一些必须的依赖包,这里的意思是在安装 nginx 之前,先安装一些依赖包,main 代表这个配置文件为主配置文件

在 install 中配置变量 main.yml

[root@am-01:/etc/ansible/nginx_install/roles#] vim install/vars/main.yml

nginx_user: www

nginx_port: 80

nginx_basedir: /usr/local/nginx

#在 install 目录下的 vars 目录中配置变量,定义了三个变量,分别代表了用户、端口、目录,main 代表这个配置文件为主配置文件

在 install 中配置子配置文件 copy.yml

[root@am-01:/etc/ansible/nginx_install/roles#] vim install/tasks/copy.yml

- name: Copy Nginx Software

  copy: src=nginx.tar.gz dest=/tmp/nginx.tar.gz owner=root group=root

- name: Uncompression Nginx Software

  shell: tar zxf /tmp/nginx.tar.gz -C /usr/local/

- name: Copy Nginx Start Script

  template: src=nginx dest=/etc/init.d/nginx owner=root group=root mode=0755

- name: Copy Nginx Config

  template: src=nginx.conf dest={{ nginx_basedir }}/conf/ owner=root group=root mode=0644

#使用 copy 模块,把打包好的 nginx 包复制到目标主机,并设置所有者和所属组

#使用 shell 模块,把刚复制过去的 nginx 包解压缩到指定目录下

#使用 template 模块,把本机 template 目录下的 nginx 启动文件拷贝到目标主机对应目录下并设置所有者和所属组和权限

#使用 template 模块,把本机 template 目录下的 nginx 配置文件拷贝到目标主机对应目录下并设置所有者和所属组和权限,这里用到了刚设置的目录变量

#这里的原地址直接写了文件名而没有写详细路径,是因为执行这个配置文件的时候,copy 模块会在"/etc/ansible/nginx_install/roles/install/files/"目录下去找对应的文件,template 模块会在"/etc/ansible/nginx_install/roles/install/templates/"目录下查找对应的文件

在 install 中配置子配置文件 install.yml

[root@am-01:/etc/ansible/nginx_install/roles#] vim install/tasks/install.yml

- name: Create Nginx User

  user: name={{ nginx_user }} state=present createhome=no shell=/sbin/nologin

- name: Start Nginx Service

  shell: /etc/init.d/nginx start

- name: Add Boot Start Nginx Service

  shell: chkconfig --level 345 nginx on

- name: Delete Nginx compression files

  shell: rm -rf /tmp/nginx.tar.gz

#使用 user 模块来创建相应的用户,这里使用到了之前设置的用户变量,"state=present"意思为创建该用户,"createhome=no"意思为不创建用户的家目录,"shell=/sbin/nologin"意思为指定用户的 shell 为"/sbin/nologin"

#使用 shell 模块,启动 nginx

#使用 shell 模块,设置 nginx 为开机启动

#使用 shell 模块,删除 nginx 的压缩包

在 install 中配置主配置文件 main.yml,用来调用 copy.yml 和 install.yml

[root@am-01:/etc/ansible/nginx_install/roles#] vim install/tasks/main.yml

- include: copy.yml

- include: install.yml

#使用 include 调用指定的子配置文件

#到这里,两个 roles(角色),common 和 install 均已配置完成

定义同一个入口配置文件,用作把所有配置文件串联起来

[root@am-01:/etc/ansible/nginx_install/roles#] cd ..

[root@am-01:/etc/ansible/nginx_install#] vim install.yml

---

- hosts: am-02

  remote_user: root

  gather_facts: True

  roles:

    - common

    - install

#这里还是针对 am-02 做实验,在实际环境中,可能会是一个主机组

#指定运行配置文件的用户和设置收集主机的信息

#调用两个 roles

执行入口配置文件

[root@am-01:/etc/ansible/nginx_install#] ansible-playbook /etc/ansible/nginx_install/install.yml

PLAY [am-02] *********************************************************************************************************************



TASK [Gathering Facts] ***********************************************************************************************************

ok: [am-02]



TASK [common : Install initializtion require software] ***************************************************************************

changed: [am-02]



TASK [install : Copy Nginx Software] *********************************************************************************************

changed: [am-02]



TASK [install : Uncompression Nginx Software] ************************************************************************************

 [WARNING]: Consider using unarchive module rather than running tar



changed: [am-02]



TASK [install : Copy Nginx Start Script] *****************************************************************************************

changed: [am-02]



TASK [install : Copy Nginx Config] ***********************************************************************************************

changed: [am-02]



TASK [install : Create Nginx User] ***********************************************************************************************

changed: [am-02]



TASK [install : Start Nginx Service] *********************************************************************************************

changed: [am-02]



TASK [install : Add Boot Start Nginx Service] ************************************************************************************

changed: [am-02]



TASK [install : Delete Nginx compression files] **********************************************************************************

 [WARNING]: Consider using file module with state=absent rather than running rm



changed: [am-02]



PLAY RECAP ***********************************************************************************************************************

am-02                      : ok=10    changed=9    unreachable=0    failed=0 

#运行完成

在 am-02 上检查

[root@am-02:~#] netstat -lntp | grep 80

tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      38942/nginx: master

[root@am-02:~#] ps aux | grep nginx

root      38942  0.0  0.0  20500   624 ?        Ss   23:02   0:00 nginx: master process /usr/local/nginx/sbin/nginx -c /usr/localnginx/conf/nginx.conf

nobody    38943  0.0  0.3  22944  3208 ?        S    23:02   0:00 nginx: worker process

nobody    38944  0.0  0.3  22944  3208 ?        S    23:02   0:00 nginx: worker process

#可以见到,nginx 也运行正常了

#至此,使用 playbook 批量安装 nginx 源码包的实验完成了

总结

看图

linux 学习笔记-098-自动化运维-playbook 安装 nginx

扩展

如果是之前远程客户端安装过 nginx 或 httpd 的,必须清理干净,不然有冲突

1.之前编译安装的清理办法:

find / -name "nginx*" -exec rm -rf {} \;

2.如果是之前 yum 安装的清理办法:

rpm -qa nginx

yum remove -y nginx