用法:
Ansible-playbook [剧本文件名.yml] #执行yaml文件
ansible-playbook test.yml --syntax-check #检查yaml文件语法
ansible-playbook -C test.yml #在本地预测试,类似–syntax-check
-k(–ask-pass) 用来交互输入ssh密码
-K(-ask-become-pass) 用来交互输入sudo密码
-u 指定用户
# ansible-playbook a.yml --syntax-check #检查yaml文件的语法是否正确
# ansible-playbook a.yml --list-task #检查tasks任务
# ansible-playbook a.yml --list-hosts #检查生效的主机
# ansible-playbook a.yml --start-at-task='Copy Nginx.conf' #指定从某个task开始运行
剧本存放目录:/etc/ansible/roles/
剧本: 就是以.yml结尾的可执行文件
ansible剧本详细介绍:https://blog.51cto.com/13630803/2154192
执行yaml文件的注意事项
1、Play的主体部分是task列表,task列表中的各任务按次序逐个在hosts中指定的主机上执行,即在所有主机上完成第一个任务后再开始第二个任务。
2、在运行playbook时(从上到下执行),如果一个host执行task失败,整个tasks都会回滚,请修正playbook 中的错误,然后重新执行即可。
Task的目的是使用指定的参数执行模块,而在模块参数中可以使用变量,模块执行时幂等的,这意味着多次执行是安全的,因为其结果一致。
3、每一个task必须有一个名称name,这样在运行playbook时,从其输出的任务执行信息中可以很好的辨别出是属于哪一个task的。如果没有定义name,‘action’的值将会用作输出信息中标记特定的task。
4、定义一个task,常见的格式:”module: options” 例如:yum: name=httpd
5、ansible的自带模块中,command模块和shell模块无需使用key=value格式
剧本内容说明与语法介绍:
在语法上必须上下对齐,比如hosts和tasks必须对齐,否则会报错
剧本分为以下几部分组成:
--- # 顶头三个[-]开头,类似shell的#!/bin/bash 【一、声明这是playbook文件】
- hosts: web-app # 顶头一个[-]表示一个项目的开始,空格[hosts]定义ansible主机列表【二、主机列表】
remote_user: root # [remote_user]定义主机列表中用于执行命令的用户【三、执行用户】
become: yes # 2.6版本以后的参数,之前是sudo,意思为切换用户运行
become_user: mysql # 指定sudo用户为mysql
tasks: # 定义任务列表【四、任务列表】
- name: add user nginx # 注意[-]后面有空格,任务列表名称(第一条任务说明)
user: name=nginx state=present # 调用[user]模块创建nginx用户,状态为立即创建,可以看帮助[ansible-doc user>]
- name: add group nginx # 任务列表名称(第二条任务说明)
group: name=nginx state=present # 调用[group]模块创建nginx组,状态为立即创建
- name: install nginx # 任务列表名称(第三条任务说明)
yum: name=nginx state=present # 调用[yum]模块安装nginx,状态为立即安装
- name: start nginx # 任务列表名称(第四条任务说明)
service: name=nginx state=started # 调用[service]模块启动nginx,状态为立即启动
- name: scripts test
command: /bin/bash /home/shell/test.sh
1、ansible本机和远端服务器都安装好nginx,然后通过ansible-playbook 直接将Ansible本机的nginx.conf 替换到远端服务器就可以了(回滚也一样)
注意:如果主机列表有300台主机,但其中35台命令没有执行成功怎么办?没关系,ansible 可以执行多次,因为ansible会自动判断配置文件是否发生改变,如果配置文件没有发生改变是不会做修改操作的,只有配置文件发生改变才会覆盖并备份
比如:
copy模块
源文件与目标文件内容相同,则不做修改
源文件与目标文件内容不同,执行备份并覆盖目标文件
command模块之start
目标nginx服务状态为start,则不做修改
目标nginx服务状态为stop,则执行start命令
[root@localhost roles]# cat /etc/ansible/roles/nginx.yml
--- #书写格式声明,类似于#/bin/bash
- hosts: web-app #远程主机列表
remote_user: root #远程主机执行命令用户
tasks: #定义任务列表
- name: cp nginx.conf #任务列表名称(第一条任务说明)
copy: src=/etc/nginx/nginx.conf dest=/etc/nginx/nginx.conf backup=yes 调用copy模块拷贝文件到远端主机并备份
- name: restart nginx #任务列表名称(第二条任务说明)
command: /etc/init.d/nginx restart #调用command模块,启动nginx
- name: check nginx Port #任务列表名称(第三条任务说明)
shell: netstat -npult |grep nginx #调用command模块,查看nginx是否启动
- name: chkconfig nginx add #任务列表名称(第四条任务说明)
shell: echo -e "#nginx start \n/etc/init.d/nginx start" >> /etc/rc.local #加入开机启动
2、使用ansible-playbook 命令执行(没报错表示成功)
[root@localhost roles]# ansible-playbook /etc/ansible/roles/nginx.yml
PLAY [web-app] *****************************************************************************************************************
TASK [Gathering Facts] *********************************************************************************************************
ok: [172.16.12.1]
ok: [172.16.12.5]
ok: [172.16.12.7]
TASK [cp nginx.conf] ***********************************************************************************************************
ok: [172.16.12.1]
ok: [172.16.12.5]
ok: [172.16.12.7]
TASK [restart nginx] ***********************************************************************************************************
changed: [172.16.12.1]
changed: [172.16.12.5]
changed: [172.16.12.7]
TASK [check nginx Port] ********************************************************************************************************
changed: [172.16.12.1]
changed: [172.16.12.5]
changed: [172.16.12.7]
PLAY RECAP *********************************************************************************************************************
172.16.12.1 : ok=4 changed=2 unreachable=0 failed=0
172.16.12.5 : ok=4 changed=2 unreachable=0 failed=0
172.16.12.7 : ok=4 changed=2 unreachable=0 failed=0
1、安装svn服务
2、通过ansible控制webserver组中的服务器检出代码到本地/var/www/html/project1目录
# ansible webserver -a "svn checkout svn://192.168.1.10/project1 /var/www/html/project1 --force --username="wenqiang" --password="wenqiang123" --non-interactive"
一、编写playbook安装nginx
1、环境
2、编写playbook
index.html和nginx.conf.j2需要提前准备好
[root@localhost-10 ~]# cat /etc/ansible/myyaml/nginx.yaml
---
- hosts: webservers
tasks:
# 创建组并制定组ID
- name: create group
group: name=nginx gid=300
# 创建用户并加入组,system表示系统用户,shell表示登陆shell
- name: create user
user: name=nginx uid=300 groups=nginx system=yes shell=/sbin/nologin
# 安装扩展包
- name: install epel-release pachage
yum: name=epel-release state=present
# 安装nginx软件包
- name: install nginx
yum: name=nginx state=present
# 拷贝配置文件
- name: copy nginx.conf
template: src=./nginx.conf.j2 dest=/etc/nginx/nginx.conf
# 拷贝index.html文件
- name: copy index.html
copy: src=./index.html dest=/usr/share/nginx/html/index.html
# 启动nginx服务并设置开机启动
- name: restart nginx
service: name=nginx state=started enabled=yes
3、修改nginx.conf.j2文件
# cat /etc/ansible/myyaml/nginx.conf.j2
worker_processes {{ ansible_processor_vcpus }}; # 远端服务器cpu总核数【系统cpu的总个数=cpu的颗数*每颗CPU的核数】
4、测试nginx.yaml语法并预测试
# ansible-playbook -i /etc/ansible/hosts nginx.yaml --syntax-check # 检测语法
# ansible-playbook -i /etc/ansible/hosts -C nginx.yaml # 预测试
5、执行nginx.yaml
# ansible-playbook -i /etc/ansible/hosts nginx.yaml
6、访问测试
# curl http://192.168.1.13
hello ansible
# curl http://192.168.1.14
hello ansible
一、roles介绍
roles表示角色的意思,主要对playbook文件实行目录结构规范,把原来写在一个剧本里面的文件、模块、任务、变量,拆开放入多个目录中,方便日后调用和维护,使之更加结构化。
1、角色(roles)目录结构如下
角色文件(nginx.yaml)需要和roles处于同级目录
main.yaml文件是管理其他yaml的文件,使用include就能调用其他yaml文件
# tree /root/ansible/
/root/ansible/
├── mysql_role.yaml
├── nginx_role.yaml # 这是nginx角色文件,这个文件需要和roles处于同级目录
├── php_role.yaml
└── rolse # 用于存放角色文件的目录
├── mysql # 第一个角色文件
│ ├── files
│ ├── handlers
│ ├── tasks
│ ├── templates
│ └── vars
├── nginx # nginx角色文件对应的nginx角色目录,由nginx_role.yaml文件调用
│ ├── files # 存放一些文件或包,可以由copy模块调用
│ │ └── index.html
│ ├── handlers # 该目录中的文件由task中的任务来触发,通常由notify触发
│ │ └── main.yaml
│ ├── tasks # 任务目录,里面存放nginx的主要安装文件
│ │ ├── copy.yaml
│ │ ├── group.yaml
│ │ ├── install.yaml
│ │ ├── main.yaml # 其他yaml文件都由main.yaml来管理和调用(使用include调用)
│ │ ├── start.yaml
│ │ └── user.yaml
│ ├── templates # 存放模板文件的目录,比如一些配置文件,由template模块调用
│ │ └── nginx.conf.j2
│ └── vars # 存放变量的目录
│ └── main.yaml
└── php # 第三个角色文件
├── files
├── handlers
├── tasks
├── templates
└── vars
二、通过roles实现nginx的部署
1、先创建nginx角色的目录结构和相关文件
之前通过一个剧本文件(playbook)就可以完成nginx的安装,这次将使用rolse来完成:创建组、创建用户、拷贝文件、安装epel-release和安装nginx、启动nginx
(1) 先创建存放角色的roles目录
[root@localhost-11 ~]# mkdir -p /home/ansible/roles
(2) 再创建nginx角色目录
[root@localhost-11 ~]# mkdir -p /home/ansible/roles/nginx/{files,handlers,tasks,templates,vars}
(3) 创建main.yaml文件、index.html文件、nginx.conf.j2文件
# cd /home/ansible/roles/
# echo "hello ansible" >> nginx/files/index.html
# touch nginx/tasks/main.yaml
# cp /etc/nginx/nginx.conf nginx/templates/nginx.conf.j2 # 提前准备好nginx配置文件并做好优化
(4) 修改nginx.conf.j2文件
# cat /home/ansible/roles/nginx/templates/nginx.conf.j2
worker_processes {{ ansible_processor_vcpus }}; # 远端服务器cpu总核数【系统cpu的总个数=cpu的颗数*每颗CPU的核数】
include /etc/nginx/conf.d/*.conf; # 虚拟主机存放目录
(5) 创建虚拟主机模板文件
# cp /alidata/nginx/conf.d/vhost.conf /home/ansible/roles/nginx/templates/vhosts.conf.j2
# cat /home/ansible/roles/nginx/templates/vhosts.conf.j2
server {
listen 80;
server_name www.abc.org;
location / {
# root html; # 默认站点目录(/alidata/server/nginx-1.11.10/html/)
root /alidata/www/www_xialan_com; # 自定义站点目录
index index.php index.html index.htm;
}
# 禁止访问.svn|.git|.cvs结尾的文件或目录
location ~ .*.(svn|Git|cvs) {
deny all;
}
}
2、创建nginx_role.yaml文件
该文件需要和roles处于同级目录
通过该文件去调用/home/ansible/roles/下的nginx角色目录
# cd /home/ansible/
# cat nginx_role.yaml
---
# 指定主机组
- hosts: webservers
# 调用roles模块:创建role、version变量,这里的nginx就是nginx目录角色
roles:
- { role: nginx, version: 1.16.1 }
3、进入/home/ansible/tasks/目录创建相关任务文件
# cd /home/ansible/roles/nginx/tasks/
(1) 创建 group.yaml
# cat group.yaml
- name: create group
# 调用group模块:创建nginx组并指定gid
group: name=nginx gid=300
(2) 创建 user.yaml
# cat user.yaml
- name: create user
# 调用user模块:创建nginx用户并制定uid,加入nginx组,system表示系统用户,shell表示登陆环境
user: name=nginx uid=300 groups=nginx system=yes shell=/sbin/nologin
(3) 创建 install.yaml
# cat install.yaml
- name: install epel-release package
# 调用yum模块:安装扩展包
yum: name=epel-release state=present
- name: install nginx package
# 调用yum模块: 安装nginx并制定版本 state表示动作, present表示立即安装
yum: name=nginx-{{ version }} state=present
(4) 创建 copy.yaml
# cat copy.yaml
- name: create site directory
# 调用file模块: 创建站点目录
file: name=/alidata/www/www_xialan_com state=directory
- name: copy index.html
# 调用copy模块:src表示原文件会自动去files中找 dest表示目标路径
copy: src=index.html dest=/alidata/www/www_xialan_com/index.html
- name: copy nginx.conf
# 调用template模块:src表示原文件会自动去templates目录中找 dest表示目标路径
template: src=nginx.conf.j2 dest=/etc/nginx/nginx.conf
(5) 创建vhosts.yaml
# cat vhosts.yaml
- name: create vhosts
# 调用template模板:将templates目录中的虚拟站点文件拷贝到目标目录
template: src=vhosts.conf.j2 dest=/etc/nginx/conf.d/vhosts.conf
(6) 创建start.yaml
# cat start.yaml
- name: start nginx
# 调用service模板:启动nginx并加入开机启动
service: name=nginx state=started enabled=yes
(7) 编辑main.yaml
# cat main.yaml
- include: group.yaml # 第一步创建组
- include: user.yaml # 第二步创建用户
- include: install.yaml # 第三部安装软件包
- include: copy.yaml # 第四步拷贝配置文件
- include: vhosts.yaml # 第五步创建虚拟主机
- include: start.yaml # 第六步启动nginx
4、检查语法和预测试
# ansible-playbook -i /etc/ansible/hosts /home/ansible/nginx_role.yaml --syntax-check
playbook: /home/ansible/nginx_role.yaml
# ansible-playbook -i /etc/ansible/hosts -C /home/ansible/nginx_role.yaml
5、执行nginx_role.yaml文件
# ansible-playbook -i /etc/ansible/hosts /home/ansible/nginx_role.yaml
PLAY [webservers] *************************************************************************************
TASK [Gathering Facts] ********************************************************************************
ok: [192.168.1.14]
ok: [192.168.1.13]
TASK [nginx : create group] ***************************************************************************
changed: [192.168.1.14]
changed: [192.168.1.13]
TASK [nginx : create user] ****************************************************************************
changed: [192.168.1.13]
changed: [192.168.1.14]
TASK [nginx : install epel-release package] ***********************************************************
changed: [192.168.1.14]
changed: [192.168.1.13]
TASK [install nginx package] **************************************************************************
changed: [192.168.1.13]
changed: [192.168.1.14]
TASK [nginx : copy index.html] ************************************************************************
changed: [192.168.1.13]
changed: [192.168.1.14]
TASK [copy nginx.conf] ********************************************************************************
ok: [192.168.1.13]
ok: [192.168.1.14]
TASK [start nginx] ************************************************************************************
changed: [192.168.1.13]
changed: [192.168.1.14]
PLAY RECAP ********************************************************************************************
192.168.1.13 : ok=8 changed=6 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
192.168.1.14 : ok=8 changed=6 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
6、测试结果
# curl http://www.abc.org
hello ansible