Ansible-Roles应用---安装nginx
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执行时按照
tasks
的main.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 }}"