一、ansible简介
ansible是基于python的开发的自动化运维工具。实现了批量系统配置、批量程序部署、批量运行命令等功能。
官方地址
官方文档
中文手册
二、对管理主机的要求
Red Hat, Debian, CentOS, OS X, BSD等等各种版本 需要安装python
三、对托管节点的要求
ansible使用ssh与托管节点通信 默认使用sftp,如果sftp不可以,可以在ansible.cfg配置文件中配置scp的方式。 托管节点需要安装python以上版本。
四、安装
1. 管理节点安装
yum install ansible
2. 配置文件
配置文件详解
配置文件地址:/etc/ansible/ansible.cfg
inventory = /etc/ansible/hosts #托管主机的文件列表文件路径
remote_port = 8090 #托管主机的ssh默认端口
3. 托管主机的文件列表
路径:/etc/ansible/hosts
主机和组
[zu] #方括号内是组名,可以操作一组.
120.92.51.3 #组内ip列表
文件中的host后面可以跟参数
ansible_ssh_host
将要连接的远程主机名.与你想要设定的主机的别名不同的话,可通过此变量设置.
ansible_ssh_port
ssh端口号.如果不是默认的端口号,通过此变量设置.
ansible_ssh_user
默认的 ssh 用户名
ansible_ssh_pass
ssh 密码(这种方式并不安全,我们强烈建议使用 --ask-pass 或 SSH 密钥)
ansible_sudo_pass
sudo 密码(这种方式并不安全,我们强烈建议使用 --ask-sudo-pass)
ansible_sudo_exe (new in version 1.8)
sudo 命令路径(适用于1.8及以上版本)
ansible_connection
与主机的连接类型.比如:local, ssh 或者 paramiko. Ansible 1.2 以前默认使用 paramiko.1.2 以后默认使用 'smart','smart' 方式会根据是否支持 ControlPersist, 来判断'ssh' 方式是否可行.
ansible_ssh_private_key_file
ssh 使用的私钥文件.适用于有多个密钥,而你不想使用 SSH 代理的情况.
ansible_shell_type
目标系统的shell类型.默认情况下,命令的执行使用 'sh' 语法,可设置为 'csh' 或 'fish'.
ansible_python_interpreter
目标主机的 python 路径.适用于的情况: 系统中有多个 Python, 或者命令路径不是"/usr/bin/python",比如 \*BSD, 或者 /usr/bin/python
不是 2.X 版本的 Python.我们不使用 "/usr/bin/env" 机制,因为这要求远程用户的路径设置正确,且要求 "python" 可执行程序名不可为 python以外的名字(实际有可能名为python26).
与 ansible_python_interpreter 的工作方式相同,可设定如 ruby 或 perl 的路径....
五、ansible常用模块和命令
ansible-doc -l 使用这个命令可以查看所有的模块
1. ansible常用模块
1.ping测试是否连通管控主机
命令示例:
ansible ip -m ping
2.可以执行常用shell命令 command模块 命令示例:
ansible seek-nginx -m command -a "hostname"
3.可以上传文件,在上传之前对文件进行备份
copy模块
backup:在覆盖之前将原文件备份,备份文件包含时间信息。有两个选项:yes|no
content:用于替代"src",可以直接设定指定文件的值
dest:必选项。要将源文件复制到的远程主机的绝对路径,如果源文件是一个目录,那么该路径也必须是个目录
directory_mode:递归的设定目录的权限,默认为系统默认权限
force:如果目标主机包含该文件,但内容不同,如果设置为yes,则强制覆盖,如果为no,则只有当目标主机的目标位置不存在该文件时,才复制。默认为yes
others:所有的file模块里的选项都可以在这里使用
src:要复制到远程主机的文件在本地的地址,可以是绝对路径,也可以是相对路径。如果路径是一个目录,它将递归复制。在这种情况下,如果路径使用"/"来结尾,则只复制目录里的内容,如果没有使用"/"来结尾,则包含目录在内的整个内容全部复制,类似于rsync。
validate :The validation command to run before copying into place. The path to the file to validate is passed in via '%s' which must be present as in the visudo example below.
使用示例:
ansible test -m copy -a "src=/root/test dest=/tmp/ backup=yes force=no"
synchronize模块(本地和管控主机都需要安装rsync)
使用rsync同步文件,其参数如下:
archive: 归档,相当于同时开启recursive(递归)、links、perms、times、owner、group、-D选项都为yes ,默认该项为开启
checksum: 跳过检测sum值,默认关闭
compress:是否开启压缩
copy_links:复制链接文件,默认为no ,注意后面还有一个links参数
delete: 删除不存在的文件,默认no
dest:目录路径
dest_port:默认使用的是ansible用来进行ssh连接的端口
dirs:传速目录不进行递归,默认为no,即进行目录递归
rsync_opts:rsync参数部分
set_remote_user:主要用于/etc/ansible/hosts中定义或默认使用的用户与rsync使用的用户不同的情况
mode: push或pull 模块,push模的话,一般用于从本机向远程主机上传文件,pull 模式用于从远程主机上取文件
使用示例:
ansible test -m synchronize -a "src=/root/test2 dest=/tmp/"
"changed": true, 为true为执行成功,changed为false时,为执行失败。执行失败的原因有一个是管控主机已经有相同的文件了。
注意事项
需要在关机主机和管控主机安装rsync才可以使用
4.脚本执行
2. script模块
在管控主机执行本地的脚本
使用示例:
ansible ip -m script -a 'ansible_test.sh'
5.管理服务
3. servcei模块
该模块包含如下选项:
arguments:给命令行提供一些选项
enabled:是否开机启动 yes|no
name:必选项,服务名称
pattern:定义一个模式,如果通过status指令来查看服务的状态时,没有响应,就会通过ps指令在进程中根据该模式进行查找,如果匹配到,则认为该服务依然在运行
runlevel:运行级别
sleep:如果执行了restarted,在则stop和start之间沉睡几秒钟
state:对当前服务执行启动,停止、重启、重新加载等操作(started,stopped,restarted,reloaded)
使用示例
ansible test -m service -a "name=nginx enabled=no"
6.管理定时任务
4.cron模块
用于管理计划任务包含如下选项:
backup:对远程主机上的原任务计划内容修改之前做备份
cron_file:如果指定该选项,则用该文件替换远程主机上的cron.d目录下的用户的任务计划
day:日(1-31,*,*/2,……)
hour:小时(0-23,*,*/2,……)
minute:分钟(0-59,*,*/2,……)
month:月(1-12,*,*/2,……)
weekday:周(0-7,*,……)
job:要执行的任务,依赖于state=present
name:该任务的描述
special_time:指定什么时候执行,参数:reboot,yearly,annually,monthly,weekly,daily,hourly
state:确认该任务计划是创建还是删除,默认为添加。absent选项为删除。
注意:只能删除cron里面带有#Ansible名字标识的。
如果name名字和原来cron里面相同了,则会覆盖之前的定时任务
user:以哪个用户的身份执行
使用示例
添加定时任务
ansible ip -m cron -a 'name="test" minute="33" hour="15" day="14" month="*" weekday="*" job="echo "1">/tmp/1" backup="True"'
删除定时任务
ansible ip -m cron -a 'name="test" state="absent"'
六、ansible常用功能
1.批量添加ssh key
vim /etc/ansible/hosts#添加需要管理的业务主机IP
ansible all -m authorized_key -a "user=root key='{{ lookup('file','/root/.ssh/id_rsa.pub')}}' path='/root/.ssh/authorized_keys' manage_dir=no"--ask-pass -c paramiko
#因为密码都一样,所以只需要输入一次密码即可,如果密码不同 需要自定义
说明
user=root #将秘钥推送到远程主机的哪个用户下
key='{{ lookup('file','/root/.ssh/id_rsa.pub')}}'#指定要推送的秘钥文件所在的路径
path='/root/.ssh/authorized_keys'#将秘钥推送到远程主机的哪个目录下并重命名
manage_dir=no #指定模块是否应该管理authorized_keys文件所在的目录,如果设置为yes,模块会创建目录,以及设置一个已存在目录的拥有者和权限。如果通过 path 选项,重新指定了一个 authorized key 文件所在目录,那么应该将该选项设置为 no
exclusive [default: no]: #是否移除 authorized_keys 文件中其它非指定 key
state (Choices: present, absent) [Default: present]: #present 添加指定 key 到 authorized_keys 文件中;absent 从 authorized_keys 文件中移除指定 key