ansible概述
ansible是基于python开发的自动化运维工具(saltstack),其功能实现基于SSH远程连接服务;ansible可实现批量系统配置、批量文件拷贝、批量运行命令的功能
软件特点
不需要单独安装客户端(no agent),基于系统自身的sshd服务
不需要服务端(no server)
需要依赖大量的模块实现批量管理
配置文件无需配置
批量管理-自动化管理方案
简单/易用/强大的选择是ssh key+shell/pssh方案
方法:
利用ssh key执行命令,并将命令放在脚本里
利用ssh key执行命令,将命令放在脚本里,并加上相应的循环语句或判断语句
sina cfengine/puppet较早,现在基本没有企业使用
门户级别常用puppet批量管理(复杂/笨重)
saltstack:简单,功能强大(配置复杂)
ansible软件实践部署
1、yum安装:需要先配置epel源
2、基于python pip库安装。参考《ansible简易安装》
部署完成后需要生成公钥,并对受管主机进行免密操作,方便日常运维
[root@m01 ~]# rpm -ql ansible|egrep -v '/usr/share/|/usr/lib'
/etc/ansible
/etc/ansible/ansible.cfg #ansible配置文件
/etc/ansible/hosts #定义ansible可以管理的主机信息
/etc/ansible/roles #主要在自动化部署多台主机时应用
/usr/bin/ansible
/usr/bin/ansible-playbook #执行ansible剧本命令
主机管理方法
配置hosts文件文件格式
[group_name]
IP
IP
...
ansible语法参数总结
语法格式
ansible | group_name | -m | command | -a | 'command' |
命令 | 主机组模块名 | 指定模块参数 | 模块名称 | 指定利用模块执行的动作参数 | 执行的命令/脚本 |
命令参数 | 参数说明 |
-m module_name | 相应名称的模块被执行 -m后边是模块的名称 |
-a module_args | 模块参数信息 -a后边是要执行的命令,也可以写一个IP,针对一台机器来执行命令 |
-C,--check | 不做任何改变,只是尝试预言一些可能出现的改变 |
--syntax-check | 执行语法检查再剧本上,但是并不执行剧本 |
ansible常用模块
常用模块 | 模块说明 |
command(重要模块) | 执行命令模块,ansible命令执行默认模块 |
shell(重要模块) | 执行shell脚本模块 |
script(重要模块) | 把脚本发到客户端然后执行,执行脚本命令再远程服务器上 |
copy(重要模块) | 把本地文件发送到远端 |
file | 设定文件属性模块 |
service | 系统服务管理模块 |
cron | 计划任务管理模块 |
yum | yum软件包安装管理模块 |
synchronize | 使用rsync同步文件模块 |
mount | 挂载模块 |
ansible帮助信息系统中查看方法: | ansible-doc -l 查看全部模块列表信息 ansible-doc -s [模块] 查看指定模块用法参数信息 |
ping模块
测试主机连通性
ansible group -m ping
模块概要:
ping是一个简单的测试模块,这个模块在成功连接时返回pong信息。在剧本中没有意义,但能够使用ansible命令验证登陆能力和用于python的配置
非传统ICMP ping,而是先检查是否通过ssh登陆节点,再检查python版本是否满足要求,能满足要求返回pong
command模块
常见模块 | 模块说明 | |
chdir | 在执行命令前通过cd命令进入到指定目录中 | ansible group_name -m command -a "chdir=/tmp ls" |
create | 定义一个文件是否存在,如果不存在运行相应命令,如果存在跳过此步骤 | ansible group_name -m command -a "pwd creates=/tmp/test_file" |
executable | 改变shell使用command进行执行,并且执行时要使用绝对路径 | |
free_from | 命令模块采用自由形式命令运行,即可以输入任意Linux命令 | |
removes | 定义一个文件是否存在,如果存在运行相应命令,如果不存在跳过此步骤 | |
warn | 如果ansible配置文件中定义了命令警告,如果参数设置了no/false,将不会警告此行命令 |
模块概要:
命令模块中的多个参数设置用空格进行分割
命令模块中不能出现"<"">""|"","";"and"&"如需使用这些功能,可用shell模块
注:command模块作为默认模块,在-m不指定具体模块时,采用默认command模块
debug模块
msg:设置打印自定义消息;如果忽略,则打印通用信息
ansible group_name -m debug -a "msg=hello"
模块概要:这个模块会打印语句在执行时,并且能够用于调试变量或表达式,可以不需要停止剧本,可以结合when指令一起进行调试
copy模块
参数 | 参数说明 |
src | 被复制到远程主机的本地文件。如果路径是一个目录,它将递归复制。如果路径使用"/"来结尾,则只复制目录里的内容,如果没有使用"/"来结尾,则包含目录在内的整个内容全部复制 |
remote_src | 如果这个值设置为True,将到远程/目标主机的机器上搜索 |
dest | 必选项。要将源文件复制到的远程主机的绝对路径,如果源文件是一个目录,那么该路径也必须是个目录 |
owner | 设置复制传输后的数据属主信息 |
group | 设置复制传输后的数据属组信息 |
mode | 设置文件数据权限信息(注意4位) |
backup | 在覆盖远端服务器文件之前,将远端服务器源文件备份,备份文件包含时间信息。有两个选项:yes|no |
content | 用于替代"src”,可以直接设定指定文件的值 |
force | 如果目标主机包含该文件,但内容不同。 如果设置为yes,则强制覆盖;如果为no,则只有当目标主机的目标位置不存在该文件时才复制,默认为yes。 |
directory_mode | 递归设定目录的权限,默认为系统默认权限 |
模块概要:
copy模块拷贝文件从本地或远程机器到远程机器的一个目录中,使用fetch模块来拷贝文件从远程区域到本地
如果需要复制文件中插入的变量值,可以使用template模块
将test.txt文件复制到远程主机,权限0600,属主、属组为appuser
ansible group_name -m copy -a "src=/test.txt dest=/tmp/ mode=0600 owner=appuser group=appuser"
移动远程主机上的文件到某个位置remote_src=true参数
拷贝test.txt文件到tmp下,权限600
ansible group_name -m copy -a "remote_src=true src=/opt/test.txt dest=/tmp mode=0600"
通过content定义文件内容,默认不换行
ansible group_name -m copy -a "content=helloworld dest=/opt/test.txt"
shell模块
shell模块在远程执行脚本时,远程主机上一定要有相应的脚本,且脚本路径一致
ansible group_name -m shell -a "sh /path/test.sh"
执行shell语句
ansible group_name -m shell -a "cat /etc/passwd >> /tmp/test.txt"
script模块
script与shell的区别
shell:需要脚本文件都在远端服务器的相同位置才能执行脚本
script:只需要本地有脚本文件,不要将脚本复制到远端服务器,是将脚本的执行过程在远端服务器执行
ansible group_name -m script -a "/test.sh"
file模块
参数 | 参数说明 | |
owner | 设置复制传输后的数据属主信息 | |
group | 设置复制传输后的数据属组信息 | |
mode | 设置文件数据权限信息 | |
dest | 要创建的文件或目录命令,以及路径信息 | |
src | 指定要创建软链接的文件信息 | |
state | 参数 | 参数说明 |
directory | 所有不存在的子目录将会被创建 | |
file | 文件不存在将不能被创建 | |
link | 符号链接(软链接)将被创建或更改 | |
hard | 创建出硬链接 | |
absent | 目录将被递归删除以及文件,链接被取消 注意:定义文件不存在不会失败,只是输出没有发生任何改变的结果 | |
touch | 如果路径不存在将创建一个空文件,如果文件或目录存在将接收更新的文件访问和修改时间 |
创建远端目录
ansible group_name -m file -a "dest=/tmp/test_dir state=directory"
创建远端文件
ansible group_name -m file -a "dest=/tmp/test_txt state=touch"
yum模块
参数 | 参数说明 |
name=name | 指定安装的软件 |
state=installed | 安装 |
远端安装apache
ansible group_name -m yum -a "name=httpd state=installed"
state状态均为过去是ed/d
service模块
参数 | 参数说明 |
name=service name | 服务的名称 |
state=参数 | 停止服务 服务状态信息为过去时 stared/stoped/restarted/reloaded |
enabled=yes | 设置开机自启动 |
重启计划任务服务,name为服务名称,state为动作,并取消开机自启动
ansible group_name -m service -a "name=crond state=restarted enabled=no"
cron模块
参数 | 说明 |
minute | 用于设置计划任务中分钟的值,比如minute=5为每小时的5分钟,默认为* |
hour | 用于设置计划任务中小时的值,与分钟一致 |
day | 用于设置计划任务中日的值 |
month | 用于设置计划任务中月的值 |
weekday | 用于设置计划任务中周几的值 |
special_time | 计划任务的时间设定格式为 @reboot 或者@hourly。@reboot 表示重启时执行,@hourly 表示每小时执行一次,相当于设置成”0 0 * * *” ,这种@开头的时间设定格式则需要使用 special_time 参数进行设置,special_time 参数的可用值有 reboot(重启后)、yearly(每年)、annually(每年,与yearly相同)、monthly(每月)、weekly(每周)、daily(每天)、hourly(每时) 注意:当上述时间单位设定参数都未指定时,计划任务的时间设定默认会被设定为”* * * * *”,这样表示每秒都会执行一次计划任务,所以,在使用cron模块时,我们应该确定对应的时间参数设置正确 |
user | 此参数用于设置当前计划任务所属的用户,默认为root |
job | 用于指定计划任务中需要执行的命令或者脚本 |
name | 此参数用于设置计划任务名称,计划任务名称辉在注释中显示,当不指定计划任务的名称时,会默认为计划任务加注释,计划任务名称应该具有唯一性,方便以后修改名称或删除计划任务 |
state | 当计划任务有名称时,我们可以根据名称修改或删除对应的任务,当删除计划任务时,需要将state设置为absent |
disabled | 当计划任务有名称时,我们可以根据名称使对应的任务失效 注意,此参数除了需要指定任务的名称,还愮同时指定任务的job以及任务的时间设定,而且任务的时间设定必须和对应任务完全相同,否则再注释任务的同时,任务的时间设定会被修改 |
backup | 如果参数设置为yes,那么修改或删除对应的计划任务时,会先对计划任务进行备份,然后再对计划任务进行修改或删除,cron模块会再远程主机的/tmp目录下创建备份文件,以crontab开头并且随机加入一些字符,具体的备份文件名称会在返回信息的backup_file字段中看到,推荐将此参数设置为yes |
创建定时任务,name识别定时任务唯一性,只管理ansible信息
ansible group_name -m cron -a "name=01 minute=*/5 job='/usr/sbin/ntpdate time.nist.gov > /dev/null 2>&1'"
删除定时任务
ansible group_name -m cron -a "name=None minute=*/5"
fetch模块
参数 | 参数说明 |
dest | 将远程主机拉取过来的文件保存在本地的路径信息 |
src | 指定从远程主机要拉取的文件信息,只能拉取文件 |
flat | 默认设置为no,如果设置为yes,将不显示172.16.1.8/etc/信息 |
拉取远端主机文件
ansible group_name -m fetch -a "dest=/tmp src=/tmp/test.txt"
拉取时不创建目录(同名会覆盖)
ansible group_name -m fetch -a "dest=/tmp/ src=/tmp/test.log flat=yes"
mount模块
参数 | 参数说明 |
fstype | 指定挂载文件类型;-t nfs == fstype=nfs |
opts | 设定挂载的参数选项信息;-o ro == opts=ro |
path | 指定挂载点 path=/mnt |
src | 要被挂载的目录设备信息 src=172.16.1.31:/data/w |
state | 01.如果为mountd 在fstab文件中的设备将被激活挂载和适当配置 02.如果为unmounted 设备将被卸载并不会改变fstab文件信息,absent和present只处理fstab,但不影响目前的挂载 |
挂载
ansible group_name -m mount -a "fstype=nfs opts=ro src=xxx.xxx.xxx.xxx:/dirname path=/mnt state=mounted"
卸载
ansible group_name -m mount -a "fstype=nfs opts=ro src=xxx.xxx.xxx.xxx:/dirname path=/mnt state=umounted"
palybook编写
ansible特点:
- 可以实现批量管理、部署
- ad-hoc(批量执行命令)针对临时性的操作
- ansible group_name -m command -a "hostname" <-批量执行命令举例
- 编写剧本(playbook)针对重复性操作
ansible核心功能
- pyYAML:用于ansible编写剧本所使用的语言格式(saltstack-python)
- paramiko:远程连接与数据传输
- Jinja2:用于编写ansible模板信息
playbook编写规则:
- 缩进/空格
- yaml使用一个固定的缩进风格表示数据层结构关系,saltstack需要每个缩进级别由两个空格组成,一定不能使用tab
- 冒号
- 每个冒号前后一定要有空格(以冒号结尾不需要空格,表示路径的模板不需要空格)
- 短横线
- 表示列表项,使用一个短横杠加一个空格,多个项使用同样的缩进级别作为同一个列表的一部分
核心规则:有效的利用空格进行剧本的编写,剧本编写不支持tab
剧本示例:vim httpd.yml
install httpd #名称
- hosts: 192.168.40.110 #所处理的服务器IP,可以为all格式(-(空)hosts:(空)IP/all)
tasks: #要做什么
- name: install httpd #要做的事情
yum: name=httpd state=installed #模块名称:(空)模块对应的功能
剧本检查方法
ansible-playbook --syntax-check httpd.yml ##语法检查
ansible-playbook -C httpd.yml ##剧本模拟(彩排)可以查看修改了哪些内容
完整示例安装、启动和停止、卸载apache
install and uninstall httpd
- hosts: 192.168.40.110
tasks:
- name: install httpd
yum: name=httpd state=installed
- name: start httpd
service:
name: httpd
state: started
enabled: true
- name: stop httpd
service: name=httpd state=stopped
- name: uninstall httpd
yum: name=httpd state=removed
多主机格式
- hosts: 10.1.1.x
tasks:
- name: xxxx
module: name=xxx state=xxxx
- hosts: 10.1.1.x
tasks:
- name: xxxx
module: name=xxx state=xxxx
剧本排错方法
- ansible-playbook编写玩,检查语法和模拟测试运行
- 打开剧本,定位异常问题原因,将剧本中的内容转换成命令执行一次
- 将参数中的脚本文件推送到远程服务器,再远程服务器本地执行脚本
说明:ansible执行时,加上-vvvv显示ansible详细执行过程,也可以定位异常原因