一、简介
ansible是新出现的自动化运维工具,基于Python开发,集合了众多运维工具(puppet、chef、func、fabric)的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能。
ansible是基于 paramiko 开发的,并且基于模块化工作,本身没有批量部署的能力。真正具有批量部署的是ansible所运行的模块,ansible只是提供一种框架。
ansible不需要在远程主机上安装client/agents,因为它们是基于ssh来和远程主机通讯的。
ansible目前已经已经被红帽官方收购,是自动化运维工具中大家认可度最高的,并且上手容易,学习简单。是每位运维工程师必须掌握的技能之一
特点:
- 部署简单,只需在主控端部署Ansible环境,被控端无需做任何操作;
- 默认使用SSH协议对设备进行管理;
- 有大量常规运维操作模块,可实现日常绝大部分操作;
- 配置简单、功能强大、扩展性强;
- 支持API及自定义模块,可通过Python轻松扩展;
- 通过Playbooks来定制强大的配置、状态管理;
- 轻量级,无需在客户端安装agent,更新时,只需在操作机上进行一次更新即可;
- 提供一个功能强大、操作性强的Web管理界面和REST API接口——AWX平台。
二、安装
系统 Centos 7.9
#查看yum源中ansible版本
yum list all *ansible*
#安装
yum install ansible
没有就更新yum源
[ansible]
name=ansible
baseurl=https://mirror.tuna.tsinghua.edu.cn/epel/7/x86_64/
gpgcheck=0
主要配置文件路径
/etc/ansible/ansible.cfg
/etc/ansible/hosts
三、简单应用
ansible通过ssh实现配置管理、应用部署、任务执行等功能,因此,需要事先配置ansible端能基于密钥认证的方式联系各被管理节点。
认证:
#ssh-keygen
#ssh-copy-id -i /root/.ssh/id_rsa.pub root@xx.xx.xx.xx
如何查看模块帮助
ansible-doc: Show Ansible module documentation
-l,--list List available modules
-s, --snippet Show playbook snippet for specified module(s)
例:ansible-doc -s yum(模块名)
基本命令基本用法
ansible <host-pattern> [-f forks] [-m module_name] [-a args]
-f forks: 启动的并发线程数
-m module_name: 要使用的模块,不指定时默认为command
-a args: 模块特有的参数
修改配置文件
vim /etc/ansible/hosts
[webservers]
alpha.example.org
beta.example.org
192.168.1.100
192.168.1.110
例:
ansible 192.168.1.1 -m command -a 'date' #单机运行
ansible webservers -m command -a 'date' #服务器组都运行
ansible webservers -m command -a 'tail -2 /etc/passwd'
ansible webservers -a 'tail -2 /etc/passwd' #使用默认模块,意义同上
常用模块
cron模块
ansible-doc -s cron
cron:
state:
present: 安装
absent: 移除
例:
在linux的crontab任务中,格式如下:
*/10 * * * * /bin/echo "hello world"
ansible中格式如下:
ansible webservers -m cron -a 'minute="*/10" job="/bin/echo hello world" name="test cron job"'
#每10分钟执行一次,同上面的crontab,只指定了minute,其他不写默认为* ,并赋给任务名name为"test cron job"
#未指定state参数,默认为present
同理,删除操作为:
ansible webservers -m cron -a 'minute="*/10" job="/bin/echo hello world" name="test cron job" state="absent" '
查看上述命令安装结果
ansible webservers -a 'crontab -l'
例:
ansible myweb -m cron -a ' minute="*/10" hour="2" day="25" job="/usr/bin/echo hello world!" name="test job"'
user模块
ansible-doc -s user
默认创建
ansible myweb -m user -a 'name="danny1"'
删除用户
ansible myweb -m user -a 'name="danny1" state=absent'
group模块
ansible myweb -m group -a 'name=mysql gid=306 system=yes'
创建mysql用户
ansible myweb -m user -a 'name=mysql uid=306 system=yes group=mysql'
copy模块
ansible myweb -m copy -a 'src=/etc/my.cnf dest=/tmp/my.cnf.ansible owner=root mode=644'
使用content直接生成文件内容,取代src,两者不共存
ansible myweb -m copy -a 'content="hello danny" dest=/tmp/danny.ansible'
file模块
设定文件属性
ansible myweb -m file -a 'owner=mysql group=mysql mode=644 path=/tmp/my.cnf.ansible'
生成符号链接
ansible myweb -m file -a 'path=/tmp/my.cnf.link src=/tmp/my.cnf.ansible state=link'
ping模块
测试远程主机的连通性
ansible webservers -m ping
service模块
查看远程服务状态
ansible webservers -a 'service mysqld status'
启动mysql服务并设置开机自启
ansible myweb -m service -a 'enabled=true name=mysqld state=started'
enabled:是否开机自启,取值为true或者false
shell模块
远程执行命令
通过下面命令操作,设置用户密码不会成功,会被直接当初字符串处理
ansible myweb -m command -a 'echo danny123 | passwd --stdin user1'
此时就应使用shell模块了,可以解析命令
ansible myweb -m shell -a 'echo danny123 | passwd --stdin user1'
所以在使用管道、变量等复杂命令时,建议使用shell模块,默认的command模块不解析
script模块
将本地脚本复制到远程主机,并运行
ansible webservers -m script -a '/tmp/test.sh'
yum模块
程序包的安装/卸载
name:指明要安装的程序包名,可以指定版本号,不指定安装最新版
安装
ansible myweb -m yum -a 'name=lrzsz'
卸载
ansible myweb -m yum -a 'name=lrzsz state=absent'
setup模块
收集远程主机的facts(操作系统版本、IP地址、主机名等)
每个被管理节点,在接收并运行管理命令之前,会将自己主机的相关信息,如:操作系统版本、IP地址等报告给远程的ansible主机
ansible myweb -m setup
好记性不如烂笔头,最难不过坚持