中文权威指南(马哥团队出版):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 -m -a

命令格式如下:

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"