自动化运维之---Ansible基础介绍
Ansible常用语法详解
Ansible命令执行方式有Ad-Hoc、Ansible-plabook两种方式,Ad-Hoc主要用于临时命令的执行,Ansible-playbook可以理解为Ad-Hoc的集合,通过一定的规则编排在一起。
Ansile的通信默认基于SSH,因此我们需要对主机先进行认证。Ansible认证方式有密码和公私钥认证两种方式,其实完全等同于SSH的认证
为了避免Ansible下发指令时输入目标主机密码,通过证书签名达到SSH无密码是一个好的方案,推荐使用ssh-keygen和ssh-copy-id来实现快速证书的生成以及公钥下发,其中ssh-keygen生成一个秘钥对,使用ssh-copy-id来下发生成的公钥,具体生成秘钥对命令如下:
1 #随机生成公私钥对,ssh-keygen是Linux下认证秘钥生成、管理和转换工具,详细用法可参考man文档 2 ssh-keygen -N "" -b 4096 -t rsa -C "stanley@magedu.com" -f /root/.ssh/stanley.rsa 3 #为本机添加秘钥认证 4 ssh-copy-id -i /root/.ssh/stanley.rsa root@localhost
Ansible与Saltstack最大的区别是Ansible无需在被控主机部署任何客户端代理,默认直接通过SSH通道进行远程命令执行或下发配置,相同的都具备功能强大、灵活的系统管理、状态配置,都使用YAML格式来描述配置,两者都提供丰富的模板及API,对云计算平台、大数据都由很好的支持。
Inventory定义主机与组规则
Ansible通过定义好的主机与组规则(Inventory)对匹配的目标主机进行远程操作,配置规则文件默认/etc/ansible/hosts.
定义主机与组
定义主机变量
主机可以指定变量,以便后面供palybook配置使用,比如定义host1及host2上Apache参数http_port及maxRequestsChild,目的是让两台主机产生Apache配置文件httpd.conf差异化,定义格式如下:
定义组变量
组变量的作用域是覆盖所有成员,通过定义一个新块,块名由组名+“:vars”组成,定义格式如下:
同事Ansible支持组嵌套,通过定义一个新块,块名有组名+“:children”组成,格式如下:
分离主机与组特定数据
为了更好规范定义的主机与组变量,Ansible支持将/etc/ansible/hosts定义的主机名与组变量单独剥离出来存放到指定的文件中,将采用YAML格式存放,存放位置规定:“/etc/ansible/group_vars/+组名”和“/etc/ansible/host_vars/+主机名”分别存放指定组名或主机名定义的变量,例如:
例如/etc/ansible/group_vars/dbservers配置文件
匹配目标
已经完成主机与组定义,将讲解如何进行目标(pattern)匹配,格式为ansible <pattern_here> -m <module_name> -a <arguments>。规则方法:
定义别名
Ansible常用模块及API
远程命令模块
功能:模块包括command、script、shell,都可以实现远程shell命令运行。command作为Ansible的默认模块,可以运行远程权限范围所有的shell命令;script功能是在远程主机执行主控端存储的shell脚本文件,相当于scp+shell组合;shell功能是执行远程主机的shell脚本文件或命令。
copy模块
功能:实现主控端向目标主机拷贝文件,类似于scp的功能。
示例:将/home/test.sh文件拷贝至webserver组目标主机/tmp目录下,并更新文件属主及权限
1 ansible webservers -m copy -a "src=/home/test.sh dest=/tmp owner=root group=root mode=0755"
stat模块
功能:获取远程文件状态信息,包括atime、ctime、mtime、md5、uid、gid等信息。
例子:
1 ansible webservers -m stat -a "path=/etc/sysctl.con"
get_url模块
功能:实现远程主机下载指定URL到本地,支持sha256sum文件校验。
yum模块
功能: Linux平台软件包管理操作,常见有yum、apt管理方式。
例子:
1 ansible webservers -m apt -a "pkg=curl state=latest" 2 ansible webservers -m yum -a "name=curl state=latest"
cron模块
功能:远程主机crontab配置
例子:
1 ansible webservers -m cron -a "name='check dir' hour='5,2' job='ls -alh > /dev/null'"
mount模块
功能:远程主机分区挂载
例子:
1 ansible webservers -m mount -a "name=/mnt/data src=/dev/sd0 fstype=ext3 opts=ro state=present"
service模块
功能:远程主机系统服务管理
例子:
ansible webservers -m service -a "name=nginx state=stopped" ansible webservers -m service -a "name=nginx state=restarted" ansible webservers -m service -a "name=nginx state=reloaded"
sysctl包管理模块
功能:远程Linux主机sysctl配置
例子:
1 sysctl: name=kernel.panic value=3 sysctl_file=/etc/sysctl.conf checks=before reload=yessalt '*' pkg.upgrade
user服务模块
功能:远程主机系统用户管理
例子:
1 #添加用户johnd 2 ansible webservers -m user -a "name=johnd comment='John Doe'" 3 #删除用户johnd 4 ansible webservers -m user -a "name=johnd state=absent remove=yes"