简介
ansible是自动化运维工具,基于Python开发,集合了众多运维工具(puppet、cfengine、chef、func、fabric)的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能。github地址为https://github.com/ansible/ansible。
ansible是基于模块工作的,本身没有批量部署的能力。真正具有批量部署的是ansible所运行的模块,ansible只是提供一种框架。
框架组成部分
ansible框架主要包括:
- 连接插件connection plugins:负责和被监控端实现通信;
- host inventory:指定操作的主机,是一个配置文件里面定义监控的主机;
- 各种模块核心模块、command模块、自定义模块;
- 借助于插件完成记录日志邮件等功能;
- playbook:剧本执行多个任务时,非必需可以让节点一次性运行多个任务。
特性
- no agents:不需要在被管控主机上安装任何客户端;
- no server:无服务器端,使用时直接运行命令即可;
- modules in any languages:基于模块工作,可使用任意语言开发模块;
- yaml,not code:使用yaml语言定制剧本playbook;
- ssh by default:基于SSH工作;
- strong multi-tier solution:可实现多级指挥。
优点
- 轻量级,无需在客户端安装agent,更新时,只需在操作机上进行一次更新即可;
- 批量任务执行可以写成脚本,而且不用分发到远程就可以执行;
- 使用python编写,维护更简单,ruby语法过于复杂;
- 支持sudo。
安装
ansible安装比较简单,配置epel
源,然后直接通过yum
即可安装。1
2yum install -y epel-release
yum install -y ansible
当然,也可以通过pip
方式安装,pip install ansible
。
需要注意的是此时的安装的ansible
文件位于/usr/local/python/bin
目录下。
配置文件
ansible.cfg文件
ansible读取配置文件的顺序如下
- ansible.cfg(位于当前位置)
- ANSIBLE_CONFIG 一个环境变量
- .ansible.cfg 位于家目录下
- /etc/ansible/ansible.cfg
一般情况下使用配置文件为/etc/ansible/ansible.cfg
。
配置文件中主要参数如下1
2
3
4inventory = /etc/ansible/hosts #指定inventory配置文件
forks = 5 #子进程数量,推荐设置为cpu核心数
sudo_user = root #sudo用户
remote_port = 22 #远程端口
hosts文件
ansible默认配置文件路径为/etc/ansible/hosts
,也可以自定义配置文件路径。
- 常用配置如下
中括号nginx代表nginx主机组,nginx_127、nginx_219代表主机,属于nginx主机组1
2
3[nginx]
nginx_127 ansible_ssh_port=22 ansible_ssh_host=127.0.0.1 ansible_ssh_pass='password'
nginx_219 ansible_ssh_port=22 ansible_ssh_host=192.168.145.219 ansible_ssh_pass='password'
注意:需要安装sshpass这个软件才能使用密码去操作服务器,安装方式yum install -y sshpass
。
- 简化配置
如果使用密钥实现了无密码登录,可以使用下面简化配置1
2
3[nginx]
nginx_127 ansible_ssh_port=22 ansible_ssh_host=127.0.0.1
nginx_219 ansible_ssh_port=22 ansible_ssh_host=192.168.145.219
或者使用更简单的1
2
3[nginx]
127.0.0.1
192.168.145.219
模块
ansible使用比较简单,其中-i可以指定配置文件的路径,不指定默认为/etc/ansible/hosts。
ansible -i /etc/ansible/hosts 指定主机组或者主机 -m 指定模块 -a 指定模块的参数
ping模块
ping模块用来查看服务器是否连接正常,ping模块不需要-a指定参数。1
ansible all -m ping
主机和主机组注意事项:
all 代表所有主机1
2ansible -i /etc/ansible/hosts 192.168.145.219:127.0.0.1 -m ping #自己指定多台主机去操作
ansible -i /etc/ansible/hosts all:\!127.0.0.1 -m ping #不操作127.0.0.1的主机,!需要转义
command模块
command模块不支持使用管道,不建议使用1
2
3ansible all -m command -a "pwd"
ansible all -m command -a "df -h|grep sda1"
ansible all -m command -a "df -h >>/tmp/xiaohuihu"
shell模块
shell模块支持管道1
2
3ansible all -m shell -a "df -h|grep sda1" #支持管道
ansible all -m shell -a "df -h >>/tmp/xiaohuihui" #支持重定向
ansible all -m shell -a "cat /etc/passwd|awk -F':' '{print \$1}'" #得进行转义
raw模块
raw模块使用原始的ssh方式运行命令1
2ansible all -m raw -a "yum install python-simplejson -y"
ansible all -m raw -a "yum install libselinux-python -y"
copy模块
copy模块使用格式为ansible 主机组 -m copy -a ''
可用参数如下
- src: 指定源文件或目录
- dest: 指定目标服务器的文件或目录
- backup: 是否要备份
- owner: 拷贝到目标服务器后,文件或目录的所属用户
- group: 拷贝到目标服务器后,文件或目录的所属群组
- mode: 文件或目录的权限
下发文件1
ansible all -m copy -a "src=/tmp/xiaohuihui/xiaohuihui.txt dest=/usr/local/src/"
下发文件夹1
2ansible all -m copy -a "src=/tmp/xiaohuihui/ dest=/usr/local/src/" #xiaohuihui目录不会拷贝
ansible all -m copy -a "src=/tmp/xiaohuihui dest=/usr/local/src/" #xiaohuihui目录会拷贝
自动备份,备份文件位于dest
目录下1
ansible all -m copy -a "src=/tmp/xiaohuihui/xiaohuihui.txt dest=/usr/local/src/ backup=yes"
控制所属的用户和指定权限1
ansible all -m copy -a "src=/tmp/xiaohuihui/xiaohuihui.txt dest=/usr/local/src/ backup=yes owner=oracle group=oinstall mode=0640"
script模块
script模块能够实现远程服务器批量运行本地的shell脚本1
ansible all -m script -a "/usr/local/src/script"
相当于scp+shell
命令的组合。
当然,ansible还包括其他一些模块,更多的可以通过帮助问题查看。
使用方式1
2
3/usr/local/python/bin/ansible-doc -l #查看总帮助
/usr/local/python/bin/ansible-doc -s shell #查看shell模块的帮助
/usr/local/python/bin/ansible-doc -s raw