一、介绍
1、定义:
ansible是自动化运维工具,基于Python开发,具有批量系统配置、批量程序部署、批量运行命令等功能。
ansible是基于 paramiko(框架) 开发的,并且基于模块化工作,本身没有批量部署的能力。真正具有批量部署的是ansible所运行的模块。ansible基于ssh来和远程主机通讯,不需要在远程主机上安装client/agents。
2、ansible 特点:
① 部署简单,只需在主控端部署Ansible环境,被控端无需做任何操作,没有agent。
② 默认使用SSH协议对设备进行管理。
③ 有大量常规运维操作模块,可实现日常绝大部分操作。
④ 通过Playbooks(剧本)来定制强大的配置、状态管理。
3、ansible 任务执行模式:
Ansible系统由控制主机对被管节点的操作方式可分为两类,即ad-hoc和playbook:
① ad-hoc(点对点)模式:使用单个模块,支持批量执行单条命令。 ad-hoc 命令是一种可以快速输入的命令,相当于bash中的一句shell。
② playbook(剧本)模式:是Ansible主要管理方式,playbook通过多个task集合完成一类功能,如Web服务的安装部署、数据库服务器的批量备份等。可以简单地把playbook理解为通过组合多条ad-hoc操作作的配置文件。
二、ansible 指令
1、安装ansible:
使用yum 安装
yum install epel-release -y
yum install ansible --y
2、ansible配置文件:
列出配置文件:rpm -qc ansible
vim /etc/ansible/ansible.cfg
① sudo_user:设置默认执行命令的用户,sudo_user = root。
② remote_port:这是指定连接的管理端口,默认是22 (SSH端口),remote_port = 22。
③ host_key_checking:设置是否检查SSH主机的密钥。可以设置为True或False,host_key_checking = False。
④ timeout:设置SSH连接的超时间隔,单位是秒,timeout = 60。
⑤ log_path:设置log_path把Ansible系统的输出记录到日志文件中,log_path = /var/log/ansible.log。
3、ansible 命令格式:
ansible <host-pattern> [-f forks] [-m module_name] [-a args]
● <host-pattern> 指定要执行操作的目标主机或主机集合。它可以是一个IP地址,也可以是一个库存文件中定义的主机分组名称。
● [-f forks] 用于设置并发执行任务的最大进程数。
● [-m module_name] 用于指定要使用的Ansible模块,Ansible模块是执行特定任务的独立单元。
● [-a args] 用于传递给指定模块的参数。
4、ansible 秘钥验证:
① 生成秘钥:
ssh-keygen -t rsa
② 向管理的主机发送秘钥:
ssh-copy-id root@IP
三、ad-hoc(点对点)模块的使用
1、设置 hosts 远程被控制主机:
vim /etc/ansible/hosts
定义hosts 有3类:
① Ex 1:未分组的主机,在任何组头之前指定。
② Ex 2:分组的主机。
③ Ex 3:和数据库有关的服务器集合。
ping模块测试连通性:ansible all -m ping
对库存文件中定义的所有主机执行操作,使用的模块是 ping。
2、command 模块:
(1) 介绍:
-m command:指定了使用的模块是 command,command 模块用于在远程主机上执行命令。
选项:
chdir:在执行命令之前,先切换到该目录。
creates=文件名,当这个文件存在,则传递给command模块的命令不执行。
removes=文件名,当这个文件不存在,则传递给command模块的命令不执行。
(2) 实例:
① ansible web -m command -a 'chdir=/app ls'
在web组中的主机执行 ls 命令,执行前先切换到 /app 目录下。
② ansible web -m command -a 'creates=/app/f1 touch /app/f2'
在web组中的主机执行 touch /app/f2 命令,当 /app/f1 文件存在时则不执行。
③ ansible web -m command -a 'removes=/app/f1 touch /app/f2'
在web组中的主机执行 touch /app/f2 命令,当 /app/f1 文件不存在时则不执行。
3、shell 模块:
shell模块用于在远程主机上调用shell解释器运行命令,shell模块可以利用shell的功能,如管道(|)、重定向、变量扩展等。
ansible web -m shell -a 'cat /etc/passwd |grep root'
4、copy 模块:
(1) 介绍:
copy 模块可用于复制文件到远程主机。
用法:
复制文件:-a "src= dest= "
给定内容生成文件:-a "content= dest= "
(2) 实例:
① ansible web -m copy -a "src=/root/app/f3 dest=/app"
把控制端的 /root/app/f3 文件,copy 到被控制端的 /app 下。
② ansible web -m copy -a "content='hello' dest=/app/f3 mode=222 backup=yes"
将被控制端的 /app/f3 文件写入 hello,修改权限为 222,并执行备份操作。
5、file 模块:
(1) 介绍:
Ansible的file模块用于管理和操作远程主机上的文件系统对象,可以方便地创建、删除、修改文件和目录属性,以及管理符号链接。
创建目录:-a "path= state=directory"
创建链接文件:-a "path= src= state=link"
删除文件:-a "path= state=absent"
● state=:
directory:创建目录。
link:创建软链接。
hard:创建硬链接。
touch:如果文件不存在,则会创建一个新的文件,如果文件或目录已存在,则更新其最后修改时间。
absent:删除目录、文件或者取消链接文件。
(2) 实例:
① ansible web -m file -a "path=/app/f4 state=directory"
在被控制端,创建f4目录。
② ansible web -m file -a "path=/app/f11 src=/app/f1 state=link"
被控制端的 /app/f1 创建一个软链接 f11。
6、fetch 模块:
从远程某主机获取文件到本地。
dest:用来存放文件的目录。
src:在远程拉取的文件,必须是一个file,不能是目录。
ansible web -m fetch -a "src=/app/f1 dest=/app/"
从远程获取到本地的文件,会保存到以远程主机的IP 为名的目录中,并且保持原文件的目录结构:
7、cron 模块:
(1) 介绍:
cron模块是一个专门用于管理远程主机上定时任务的模块。
常见参数:
name:为Cron任务指定一个唯一名称,用于标识和管理该任务。若定义的名字没有修改,会把前一次定义的计划任务覆盖。
job:指定要运行的命令或脚本是什么。
state:指定状态,present表示添加定时任务,是默认设置;absent表示删除定时任务。
minute, hour, day, month, weekday:指定Cron任务执行的时间单位。
user:指定Cron任务所属的用户,默认是root。
backup:设置为yes时,在修改Cron条目前备份原始Cron配置文件。
(2) 实例:
① ansible web -m cron -a "name='Clear the iptable' minute=*/5 job='/sbin/iptables -F'"
在远程主机上执行定时任务,每5分钟清空一次防火墙。
② ansible web -m cron -a "name='Clear the iptable' minute=*/5 job='/sbin/iptables -F' state=absent"
删除定时任务。
8、yum 模块:
(1) 介绍:
yum 模块用于管理远程主机上的软件包。
常用参数:
name:所安装的包的名称
state:present安装, latest安装最新的, absent 卸载软件。
disable_gpg_check:是否禁止GPG checking,只用于`present' or `latest'。
(2) 实例:
① ansible web -m yum -a "name=dstat state=present disable_gpg_check=yes"
安装dstat 包,忽略gpg_check。
卸载 dstat 包:ansible web -m yum -a "name=dstat state=absent"
② 可以结合copy模块,将安装包发送到远程主机,再安装:
ansible web -m copy -a "src=/root/zabbix-release-3.4-2.el7.noarch.rpm dest=/app"
ansible web -m yum -a "name=/app/zabbix-release-3.4-2.el7.noarch.rpm state=present disable_gpg_check=yes"
9、service 模块:
(1) 介绍:
Ansible的service模块是一个专门用于管理远程主机上系统服务的模块。它提供了对服务进行启动、停止、重启、重新加载、查询状态以及设置开机自启动等操作。
常用参数:
name:服务名称。
state:started启动服务,stopped停止服务,restarted重启服务,reloaded重载配置
enabled #设置开机启动。
(2) 实例:
① 在远程主机安装nginx:
ansible web -m yum -a "name=nginx state=present disable_gpg_check=yes"
② 开启远程主机的nginx 服务:
ansible web -m service -a "name=nginx state=started"
③ 查询远程主机的 80 端口:
ansible web -m shell -a "ss -nutlp |grep 80"
10、user 模块:
(1) 介绍:
常用参数:
name:指定用户名
comment:用户的描述信息
group:指定基本组
groups:指定附加组,如果指定为(groups=)表示删除所有组
home:指定用户家目录
shell:指定默认shell
state:设置帐号状态,不指定为创建,指定值为absent表示删除
uid:指定用户的uid
(2) 实例:
ansible web -m user -a 'name=Bean1 uid=1111 group=bean shell=/bin/bash home=/app/Bean'
删除用户:
ansible web -m user -a "name=Bean1 state=absent"
11、group 模块:
常用参数:
gid:设置组的GID号
name:管理组的名称
state:指定组状态,默认为创建,设置值为absent为删除
ansible web -m group -a 'name=tom state=present'
12、script 模块:
在远程主机上执行服务器端的脚本文件。
实例:
① 在服务器端编写一个脚本:
vim /app/test.sh
#!/bin/bash
date >> /app/disk_total.log
df -lh >> /app/disk_total.log
② 在远程主机上执行该脚本:
ansible web -m script -a '/app/test.sh'
查看文件是否生成:
ansible web -m command -a "chdir=/app ls"
查看文件内容:
ansible web -m shell -a "cat /app/disk_total.log"
13、setup 模块:
facts 组件是 Ansible 用于采集远程机器设备信息的一个功能,可以使用setup 模块查机器的所有facts信息。setup模块下经常使用的一个参数是filter 参数,用于对facts信息进行匹配筛选。
实例:查询10.1.1.60主机的全部信息
ansible 10.1.1.60 -m setup
筛选内存信息:
ansible 10.1.1.60 -m setup -a "filter='*mem*'"
四、Ansible playbook 的使用
1、介绍:
playbook由YMAL语言编写,是ansible用于配置,部署和管理被控节点的剧本。通过 playbook 的详细描述,执行其中的一系列tasks,可以让远端主机达到预期的状态。
执行一些简单的任务,使用ad-hoc命令可以方便的解决问题,但是需要大量的操作时候,最好使用playbook。
playbook 方便的重用代码,移植到不同的机器上。
2、语法:
① 文件的第一行应该以 "---" (三个连字符)开始,表明YMAL文件的开始。
② 在同一行中,#之后的内容表示注释。
③ YMAL中的列表元素以"-"开头然后紧跟着一个空格,后面为元素内容。
例如 - apple - banana - orange。
④ 同一个列表中的元素应该保持相同的缩进,否则会被当做错误处理。
⑤ play中hosts,variables,roles,tasks等对象的表示方法都是键值,中间以":"分隔,":"后面还要增加一个空格。
3、Playbooks 配置文件的基础组件:
① hosts:运行指定任务的目标主机。每个playbook都必须指定hosts,可以使用系统默认的/etc/ansible/hosts,也可以自己编辑,在运行的时候加上 -i 选项,指定清单的位置即可。
② remoute_user:在远程主机上执行任务的用户,指定远端主机中的哪个用户来登录远端系统。
③ tasks:任务列表,指定远端主机将要执行的一系列动作。tasks的核心为ansible的模块。
④ templates:包含了模板语法的文本文件。
⑤ variables:变量。
⑥ handlers:由特定条件触发的任务,当某任务的状态在运行后为changed时,可通过"notify"通知给相应的 handlers。
4、Playbooks 的编写与执行:
(1) 编写一个剧本:
vim /etc/ansible/web.yml
在远程主机上安装nginx,将本机上的nginx配置文件拷贝给远程主机,开启nginx服务。
- hosts: web
remote_user: root
tasks:
- name: yum install nginx
yum: name=nginx state=latest
- name: copy nginx.conf
copy: src=/app/nginx.conf dest=/etc/nginx/nginx.conf backup=yes
tags: reloadnginx
- name: start service
service: name=nginx state=started
tags: startnginx
tags:为任务添加标签。标签可用于在执行Playbook时筛选要执行的任务,例如只运行带有特定标签的任务。
检查剧本的语法:
ansible-playbook /etc/ansible/web.yml --syntax-check
(2) 在剧本中加入handlers 触发任务:
在Ansible剧本(Playbook)中,handlers 起着延迟执行某些特定任务的作用。一个典型的例子是配置Web服务器,如果在剧本中修改了Nginx或Apache的配置文件,可以编写一个handler来重启服务,并在修改配置的任务后面添加notify指令指向该handler,重启服务以使新配置生效。
vim /etc/ansible/web.yml
handlers:
- name: reload
service: name=nignx state=restarted
(3) 在剧本中加入variables 变量:
① 变量可以不定义在playbook 中,直接在命令行给出。
- name: start service
service: name={{ servername }} state=started
tags: start{{ servername }}
ansible-playbook web.yml -e servername=nginx -t startnginx
-e servername=nginx 指定变量的值为nginx ; -t startnginx 执行这个标签的操作。
② 变量可以直接定义在playbook 中
- hosts: web
remote_user: root
vars:
- servername: nginx
tasks:
- name: yum install {{ servername }}
yum: name={{ servername }} state=latest
- name: copy {{ servername }}.conf
copy: src=/app/{{ servername }}.conf dest=/etc/{{ servername }}/{{ servername }}.conf backup=yes
notify: reload
tags: reload{{ servername }}
- name: start service
service: name={{ servername }} state=started
tags: start{{ servername }}
handlers:
- name: reload
service: name={{ servername }} state=restarted
执行剧本:
ansible-playbook /etc/ansible/web.yml
检验:查看远程主机的80端口:
五、Ansible Role
1、介绍:
role 是通过分别将变量(vars)、文件(file)、任务(tasks)、模块(modules)及处理器(handlers)放置于单独的目录中,以层次性、结构化地组织 playbook。
● 目录结构:
① 角色名
② files:存放需要复制到远程主机的静态文件,如证书、配置备份等。
③ handlers:定义事件触发的任务 (main.yml),比如服务重启。
④ tasks:包含主要执行的任务列表 (main.yml)。
⑤ templates:金甲模板,存放模板文件,支持变量替换。
⑥ vars:自定义变量。
2、编写 Role:
(1) 创建目录结构:
cd /etc/ansible
mkdir roles/nginx/{files,handlers,tasks,templates,vars} -p
touch roles/site.yaml roles/nginx/{handlers,tasks,vars}/main.yaml
echo 1234 > roles/nginx/files/index.html
cp /etc/nginx/nginx.conf roles/nginx/templates/nginx.conf.j2
(2) 编写任务:
vim /etc/ansible/roles/nginx/tasks/main.yaml
- name: install nginx packge
yum: name=nginx state=latest
- name: copy index.html
copy: src=/etc/ansible/roles/nginx/files/index.html dest=/usr/share/nginx/html/index.html
- name: copy nginx.conf template
template: src=/etc/ansible/roles/nginx/templates/nginx.conf.j2 dest=/etc/nginx/nginx.conf
notify: restart nginx
- name: make sure nginx service running
service: name=nginx state=started enabled=yes
(3) 编写配置文件:
vim /etc/ansible/roles/nginx/templates/nginx.conf.j2
worker_connections {{ worker_connections }};
(4) 编写变量:
vim /etc/ansible/roles/nginx/vars/main.yaml
worker_connections: 1024
(5) 编写 handlers:
vim /etc/ansible/roles/nginx/handlers/main.yaml
- name: restart nginx
service: name=nginx state=restarted
(6) 编写剧本:
vim /etc/ansible/roles/site.yaml
- hosts: 10.1.1.60
roles:
- nginx
3、执行 Role:
(1) 语法测试:
ansible-playbook site.yaml --syntax-check
(2) 执行:
ansible-playbook /etc/ansible/roles/site.yaml