一、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