中文权威指南(马哥团队出版):http://www.ansible.com.cn/
作用:
ansible是新出现的自动化运维工具,基于Python开发,集合了众多运维工具(puppet、cfengine、chef、func、fabric)的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能。
特性
1.no agent: 不需要在被管控主机上安装任何软件
2.no server: 无服务器端,使用时直接运行命令即可
3.modules in any languages:基于模块工作,可使用任意语言开发模块,
4.yaml,not code:使用yaml语言定制剧本playbook,
5.ssh by default:基于SSH工作
优点
(1)、轻量级,无需在客户端安装agent,更新时,只需在操作机上进行一次更新即可;
(2)、批量任务执行可以写成脚本,而且不用分发到远程就可以执行;
(3)、使用python编写,维护更简单,ruby语法过于复杂;
ansible是基于模块工作的,本身没有批量部署的能力。真正具有批量部署的是ansible所运行的模块,ansible只是提供一种框架。主要包括:
(1)、连接插件connection plugins:负责和被监控端实现通信;
(2)、host inventory:指定操作的主机,是一个配置文件里面定义监控的主机;
(3)、各种模块核心模块、command模块、自定义模块;
(4)、借助于插件完成记录日志邮件等功能;
(5)、playbook(yaml语言):剧本执行多个任务时,非必需可以让节点一次性运行多个任务。
Ansible的安装部署:======================
方法1(推荐):
yum安装-在线安装(EPEL源)
centos6.x:
rpm -ivh https://mirrors.tuna.tsinghua.edu.cn/epel/6/x86_64/epel-release-6-8.noarch.rpm
centos7.x
rpm -ivh https://mirrors.ustc.edu.cn/epel/7/x86_64/e/epel-release-7-10.noarch.rpm
关闭防火墙和selinux:
/etc/init.d/iptables stop
chkconfig iptables off
sed -ri '/^SELINUX=/c\SELINUX=disabled' /etc/selinux/config
setenforce 0
方法2:自己制作本地yum源
方法3:源码安装 不推荐
1、安装ansible:
[root@master ~]# yum install -y ansible
ansible的配置文件:
[root@master ~]# rpm -qc ansible
/etc/ansible/ansible.cfg---------------------ansible的配置文件
/etc/ansible/hosts-------------------------主机配置文件,也叫作ansible Inventory文件。需要被管理的主机都添加在这个里面
/etc/ansible-----------------------------存放ansible配置文件的目录
2、关闭第一次ssh连接时的yes|no提示
vim /etc/ansible/ansible.cfg
# uncomment this to disable SSH key host checking
host_key_checking = False -----------------------这里的注释删除保存退出
或者通过设置环境变量实现
export ANSIBLE_HOST_KEY_CHECKING=False
3、打开ansible日志文件
[root@Allen ~]# vim /etc/ansible/ansible.cfg
log_path = /var/log/ansible.log #删除注释
4、主机配置
vim /etc/ansible/hosts
写法1:
node1.ansible.com
node2.ansible.com
192.168.1.1
写法2:以组的方式
[webserver]
192.168.10.1
192.168.10.2
[dbserver]
192.168.20.1
192.168.20.2
如果有主机的SSH端口不是标准的22端口,可在主机名之后加上端口号,用冒号分隔.SSH 配置文件中列出的端口号不会在 paramiko 连接中使用,会在 openssh 连接中使用.写法如下:
[web]
192.168.1.10:202
192.168.1.11:202
一组相似的 hostname , 可简写如下:
[webservers]
www[01:50].example.com
数字的简写模式中,01:50 也可写为 1:50
还可以定义字母范围的简写模式:
[databases]
db-[a:f].example.com
把一个组作为另一个组的子成员:
[atlanta]
host1
host2
[raleigh]
host2
host3
[southeast:children]
atlanta
raleigh
5、ansible基于SSH的方式工作
免密码登录 或者给予ssh用户名 密码登录
基于用户名,密码(不推荐这种方法。如果都是Linux系统,建议用密钥登录。如果有其他系统可以考虑用用户名密码方式,并且可以定义主机组等)
vim /etc/ansible/hosts
172.16.20.114 ansible_ssh_user=root ansible_ssh_pass=123456
基于密钥(推荐)
Ansible的使用流程:
1、配置基于密钥的SSH
[root@master ~]# ssh-keygen -t rsa 下面一路回车即可
[root@master ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub 172.16.20.114 //拷贝生成的密钥到需要被ansible管理的主机172.16.20.114上
如果提示:-bash: ssh-copy-id: command not found
解决:
由于最小化安装系统,需要安装以下工具
[root@Allen ~]# yum -y install openssh-clients
[root@Allen ~]# ssh 172.16.20.114 //直接ssh登录远程主机,无需输入密码
Last login: Mon Jul 31 17:35:40 2017 from 172.16.20.113
用cat命令查看是否生成产生公钥私钥对
[root@Allen ~]#cat .ssh/id_rsa.pub
ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEA3EUsa29yKTOCi1cK2iOVKGH/teqTjW4K2Lr/iZV+POUFyEvRoV4bw9Xtj86pcttopaKFTx3iMQZAycc1VX3vzRn70CFVO3FgW2gdteMTVGgBDkQmthHtaNS5rymCu/Zo4/DOaPv9RCuVf3by89EoGjNfTVXGtTzlcYJ7TbZyXDrlcU/IzYt0Nd22pEFekhwg23EbGAxfq6vYVju8CvzPmPlCSoAhRSfmkkx/X84ek93M+1lCqZ/cbP4HS5PczIS/PGw0YbIGljqgwg6lso80kJawMmssDB1WY2/dpbqADlQg9ddpupiGZmv22AXDVkNMVTCpQ49Jbd2+rAUMXXCLIQ== root@Allen
3、使用ansible的模块,具体的常用模块我在ansible常用基础模块中写了
# ansible
命令格式如下:
ansible + 主机组名称 + -m + 模块名称 + -a + 参数
主机组名称,即hosts中定义的主机组名称
-m 指使用模块,后加指定的模块名称
-a 指传给模块的参数
在不指定模块时,默认调用command模块。
PATTERN的写法:
某一个主机组的名称 web
所有主机 all, *
写IP地址或系列主机名
one.example.com
one.example.com:two.example.com >>>支持写多个主机名,不同的主机名间使用冒号":"隔开
192.168.1.50
192.168.1.* >>>支持通配符
webservers:!phoenix >>>对属于webservers组中的主机,但不属于phoenix组的主机
webservers:&phoenix >>>对同时属于webservers和phoenix组中的主机进行操作
正则表达式, 必须以~开头
~(web|db).*\.example\.com
小技巧:
1.有时候如果想直接操作某台服务器,但又没有在hosts里定义这台服务器时,可以使用如下命令:
ansible all -i ‘服务器ip,’
注意服务器ip后面要加个逗号 ","
如
ansible all -i ‘10.2.31.201,’ -u test -k -a ‘uptime’
2.有时候我忘记配了哪些主机和组,我又不想看配置文件,有没有什么命令查看?
显示所有的组
ansible test -m debug -a 'var=groups.keys()'
显示所有的组和主机
ansible test -m debug -a 'var=groups'
ansible检查yaml文件是否有错的方法:
ansible-playbook webservice.yml --syntax-check
查看ansible-playbook执行的详细信息,可以多加几个v,这样会越详细:
ansible-playbo webservice.yml -vvv
在执行一个 playbook 之前,想看看这个 playbook 的执行会影响到哪些 hosts,你可以这样做:
ansible-playbook playbook.yml --list-hosts
并行的运行 playbook,并行的级别 是10(译者注:是10个并发的进程?):
ansible-playbook playbook.yml -f 10
命令行中传递变量
ansible-playbook release.yml --extra-vars "version=1.23.45 other_variable=foo"
剧本中设置,在命令行传递变量。比如为playbook设置主机群组或用户.
---
- hosts: '{{ hosts }}'
remote_user: '{{ user }}'
tasks:
- ...
ansible-playbook release.yml --extra-vars "hosts=vipers user=starbuck"