ansible是一个自动化运维工具的名称,集合了众多运维工具的优点(puppet、fabric、slatstack),实现批量系统配置,程序的部署,批量运行命令等。
基于ssh协议,只要管理员通过ssh登录到一台远程主机上能做的操作,ansible都可以做到
优点:配置非常简单,用起来很方便
缺点:细腻度不够
ansible基于python开发,依赖于:paramiko、PyYaml 和 jinja 三个关键组件
1、host inventory
主机清单:定义客户机,可以对客户机进行分类,如db类、web类等等
2、playbook
剧本:让主机按照我给定的剧本去完成一些事情
3、module
模块:实现一个个功能的程序
4、pluging
插件:实现一些额外的小功能
主配置文件: /etc/ansible/ansible.cfg
此文件主要定义了roles_path的路径,主机清单路径,连接清单中的主机方式等等
配置文件: /etc/ansible/hosts
这个配置文件就是默认的主机清单配置文件,可以通过ansible.cfg 重新定义
可执行文件
ansible
主执行程序,一般用于命令行下执行
ansible-playbook
执行playbook中的任务
ansible-doc
获取各模块的帮助信息
HOST-PATTERN 匹配主机模式,如all表示所有主机
-m 即MOD_NAME 指定模块名,如ping
-a 即MOD_ARGS 指定模块执行的参数
-f 即FORKS 指定生成几个子进行程执行
-C 表示不执行,模拟跑
-u 即Username 指定某主机的用户名
-c 即CONNection 指定连接方式(default smart)
配置
准备三台机器:
主控机 server:192.168.2.150
客户机1 client01:192.168.2.143
客户机2 client02:192.168.2.154
准备工作:做好免密通道,主控机可以免密登录到两台远程主机
怎么建立免密通道看这里: 三步建立免密通道
在主控机上安装 epel源 和 ansible工具
yum install epel-release
yum install ansible
修改 /etc/ansible/hosts 文件(修改前最好先备份)
[webser]
192.168.2.143
192.168.2.154
[nginx]
192.168.2.143
简单使用:在远程主机创建/tmp/test01 目录
命令:ansible all -m shell -a "mkdir /tmp/test01"
all 表示所有远程主机
-m shell 使用shell模块
-a 指定shell的参数
结果中的 rc=0 表示 return code 为0 即命令执行成功
去远程主机查看是否有此目录
从本地copy文件分发到目标主机
常用参数说明
src=源文件路径 注意src=/tmp/ 和src=/tmp 的区别,第一个带/ 表示/tmp里的所有内容复制到目标目录下,第二个不带/ 表示目录递归复制过去
dest=目标路径
content=自行填充的文件内容
owner=属主
group=属组
mode=权限
示例:复制本机的 /test/a.txt 文件到所有远程机的 /test/ 目录下
如果这个目录不存在会自动新建
命令:ansible all -m copy -a "src=/test/a.txt dest=/test/ mode=640"
从远程主机拉取文件到本地
src是远程 dest是本地
示例:拉取所有远程主机的 /etc/hostname 文件到本地的 /tmp/ 目录下
命令:ansible all -m fetch -a "src=/etc/hostname dest=/tmp/"
在远程主机上执行命令,属于裸执行,非键值对显示;不进行shell解析
示例:查看远程主机的 /test 目录
命令:ansible all -m command -a "ls /test/"
command 不会解析管道符号 | 会把 ls /test/ |wc -l 当成一条命令去执行,所以我还是喜欢用shell
跟command一样,只不过shell模块可以解析管道之类的功能
示例:查看远程主机的 /test 目录,并统计文件数量
命令:ansible all -m shell -a "ls /test/ |wc -l"
需要注意:使用command和shell模块在远程执行命令,需要远程主机有这个命令,否则会执行失败
设置文件属性(创建文件)
常用参数说明
path=目标路径
state=文件类型,可取值如下:
absent删除文件和目录、touch新建空文件、directory为目录、link为软链接、hard为硬链接、
group=目录属组
owner=属主
mode=权限
查看file模块帮助信息:ansible-doc -s file
示例:新建 /test2/ 目录,并设置644权限
命令:ansible all -m file -a "path=/test2/ state=directory mode=644"
通过cron模块对目标主机生成计划任务
常用参数说明
分(minute)时(hour)日(day)月(month)周(week)
job=任务,也就是执行什么操作
name=本次计划任务的名称
state=present 生成(默认) 或 absent 删除 (基于name)
yum install -y ntp
安装ntp,一个时间管理服务器
示例:开启定时任务:每三分钟输出当前时间,到/tmp/time.txt文件
命令:ansible all -m cron -a "minute=*/3 job='date >>/tmp/time.txt' name=date_test state=present"
在远程机使用 crontab -l 命令可以查看定时任务
等待三分钟,查看一下/tmp/time.txt 文件
删除定时任务
命令:ansible all -m cron -a "name=date_test state=absent"
故名思义就是yum安装软件包的模块
常用参数说明
enablerepo、disablerepo表示启用与禁用某repo库
name=安装包名
state=(present 或 installed) 表示安装,(absent 或 removed) 表示删除
示例:安装vsftpd
命令:ansible all -m yum -a "name=vsftpd state=installed"
服务管理模块
常用参数说明
name=服务名
state=服务状态 started(启动) stopped(关闭) restarted(重启) reloaded(重新加载)
enabled=是否开机启动 true / false
runlevel=启动级别 (systemed方式忽略)
示例:开启 vsftpd 服务
命令:ansible all -m service -a "name=vsftpd state=started"
把本地的脚本传到远端执行,前提是到远端可以执行,不要把Linux下的脚本同步到windows下执行;
只在远程服务器执行脚本,不上传脚本到远程服务器