Ansible-Roles应用—安装nginx

nginx-role目录结构

/etc/ansible/roles
├── nginx.yml  
# 最终执行的yml文件,以role功能调用roles目录下的nginx角色中的所有main.yml
└── nginx
   ├── defaults
   ├── files
   │   ├── nginx   # nginx启动脚本
   │   └── nginx-1.11.1.tar.gz  # nginx安装包
   ├── handlers
   │   └── main.yml  # 写了nginx的启动yml语句
   ├── meta
   ├── tasks
   │   ├── evir.yml # 做软链并创建程序用户的yml语句
   │   ├── install.yml # 源码编译安装的yml语句
   │   ├── main.yml  # 用来调用tasks目录中的三个yml文件的顺序
   │   └── script.yml  # 复制nginx脚本的yml语句
   ├── templates
   └── vars
       └── main.yml # 所有nginx目录下的yml语句中使用的变量
将安装nginx的所需tar包和nginx启动脚本,放在`/etc/ansible/roles/nginx/files`/目录中,脚本文件如下,注意安装目录路径
vim /etc/ansible/roles/nginx/files/nginx
#!/bin/bash
#chkconfig:- 99 20
#description:Nginx Service Control Script
PROG="/usr/local/nginx/sbin/nginx"
PIDF="/usr/local/nginx/logs/nginx.pid"
case "$1" in
        start)
        $PROG
;;
        stop)
        kill -s QUIT $(cat $PIDF)
;;
        restart)
        $0 stop
        $0 start
;;
        reload)
        kill -s HUP $(cat $PIDF)
;;
        *)
        echo "Usage: $0 {start|stop|restart|reload}"
        exit 1
esac
exit 0

nginx.yml

最终使用ansible-playbook执行的yml文件,路径为/etc/ansible/roles/nginx.yml,所有角色最终要执行的脚本,最好都在/etc/ansible/roles/目录下

cat /etc/ansible/roles/nginx.yml 
- hosts: webserver
  remote_user: root
  roles:
    - role: nginx  
    # 最终执行的yml文件中只需要调用nginx角色即可,也就是roles目录下的nginx目录

现在就来看/etc/ansible/roles/nginx目录中的各个文件

nginx/tasks/main.yml

在yml执行时找到角色后会直接进入tasks目录的main.yml来进行执行任务,这个文件中可以直接写需要执行的各个task

如:可以将所有的任务都写在这个文件是没有问题的

cat /etc/ansible/roles/nginx/tasks/main.yml 
- name: install nginx
  yum: name=nginx

如果步骤太多,可以分为几大步来执行的话,也可以在tasks目录中编写其他的yml文件,然后使用main.yml来将其他名字的yml进行排序执行,如下:

cat /etc/ansible/roles/nginx/tasks/main.yml 
- import_tasks: install.yml # 此文件为解压nginx包的task
- import_tasks: evir.yml  # 此文件为调整nginx命令环境,以及创建用户的步骤
- import_tasks: script.yml  # 此文件为给被控端传送nginx启动脚本并启动服务的

然后接着来看第一步的解压nginx包的文件

nginx/tasks/install.yml

在yml执行时按照tasksmain.yml文件排列好的顺序执行,首先执行install.yml

cat /etc/ansible/roles/nginx/tasks/install.yml 
- name: chive mulu  # 解压到被控端的/usr/src
  unarchive: src=nginx-1.11.1.tar.gz dest=/usr/src
  # 这里的tar.gz文件已经存放在了nginx/files/目录中,不需要指定绝对路径
- name: yum install dependencies # 安装依赖关系
  yum: name={{nginxde}}  # 这是yml引用变量的方法,变量的赋值在nginx/vars/main.yml文件中写入
- name: make install nginx # 编译安装nginx
  shell: ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_stub_status_module --with-pcre && make && make install
  args:
    chdir: /usr/src/{{nginxdir}}

接着看tasks目录main.yml文件中第二个顺序的yml文件

nginx/tasks/evir.yml

install.yml文件执行完成后,会按照tasks/main.yml的排序执行evir.yml文件,文件内容如下:

cat /etc/ansible/roles/nginx/tasks/evir.yml 
- name: command environment  # 将nginx命令做软链接
  file: src={{installdir}}/sbin/nginx dest=/usr/local/sbin/nginx state=link
- name: create nginx user  # 创建nginx程序用户
  user: name=nginx create_home=no shell=/sbin/nologin state=present

来看最后执行的yml文件

nginx/tasks/script.yml

执行完此文件也就最后的任务都执行完毕了,文件内容如下:

cat /etc/ansible/roles/nginx/tasks/script.yml 
- name: nginx start script  # 复制nginx启动脚本到被控端,
  copy: src=nginx dest=/etc/init.d/nginx # nginx文件也存在nginx/files/目录中
- name: permiss  # 为nginx脚本授予执行权限
  file: path=/etc/init.d/nginx mode=0755
- name: add system service  # 将nginx添加为系统服务
  shell: chkconfig --add nginx
- name: open system auto started  # 设置nginx开机自启
  shell: systemctl enable nginx
- name: check nginx syntax   # 检查nginx配置文件语法
  shell: nginx -t > /tmp/test.txt
  notify: start nginx

文件最后采用了notify触发器来调用handlers目录中的main.yml文件名为start nginx的触发器,然后来看一下handlers目录中是怎么写的

nginx/handlers/main.yml

上一篇文章说到handlers大部分是用来修改文件后来重启服务使用的,文件内容如下:

cat /etc/ansible/roles/nginx/handlers/main.yml 
- name: start nginx # notify调用的就是这个名字
  service: name=nginx

nginx/vars/main.yml

在几个文件中也用到了自己设定好的变量,变量目录是vars,看一下其中的变量目录是怎么写的,文件内容如下

cat /etc/ansible/roles/nginx/vars/main.yml 
# 变量名: 变量值
# 使用{{}}调用变量名即可
nginxdir: nginx-1.11.1 
installdir: /usr/local/nginx
nginxde: pcre-devel,openssl-devel,gcc,gcc-c++,zlib-devel
```



以上就是一个小型的roles的应用

直接执行`nginx.yml`即可,使用语法检测不实际,除了`nginx.yml`每个的语法都会有错误,因为格式不是完全的ansible的playbook的格式,只有`nginx.yml`符合格式

`ansible-playbook /etc/ansible/roles/nginx.yml`

如果某个文件语法不对会在执行的时候报指定文件的错误,如:

```shell
ERROR! Syntax Error while loading YAML.
  found unacceptable key (unhashable type: 'AnsibleMapping')
 # 看这里就是指定文件的报错
The error appears to be in '/etc/ansible/roles/nginx/tasks/install.yml': line 8, column 13, but may
be elsewhere in the file depending on the exact syntax problem.
 
The offending line appears to be:
 # 这里是该文件指定的报错位置
  args:
    chdir: {{ nginxdir }}
            ^ here
We could be wrong, but this one looks like it might be an issue with
missing quotes. Always quote template expression brackets when they
start a value. For instance:

    with_items:
      - {{ foo }}

Should be written as:

    with_items:
      - "{{ foo }}"

ansible中文权威指南

评论




正在载入...
PoweredHexo
HostedAliyun
DNSAliyun
ThemeVolantis
UV
PV
BY-NC-SA 4.0