Ansible 是什么?
ansible是新出现的自动化运维工具,基于Python开发,集合了众多运维工具(puppet、chef、func、fabric)的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能。
ansible是基于 paramiko 开发的,并且基于模块化工作,本身没有批量部署的能力。真正具有批量部署的是ansible所运行的模块,ansible只是提供一种框架。ansible不需要在远程主机上安装client/agents,因为它们是基于ssh来和远
程主机通讯的。ansible目前已经已经被红帽官方收购,是自动化运维工具中大家认可度最高的,并且上手容易,学习简单。是每位运维工程师必须掌握的技能之一。
Ansible 特点
部署简单,只需在主控端部署Ansible环境,被控端无需做任何操作;
默认使用SSH协议对设备进行管理;
有大量常规运维操作模块,可实现日常绝大部分操作;
配置简单、功能强大、扩展性强;
支持API及自定义模块,可通过Python轻松扩展;
通过Playbooks来定制强大的配置、状态管理;
轻量级,无需在客户端安装agent,更新时,只需在操作机上进行一次更新即可;
提供一个功能强大、操作性强的Web管理界面和REST API接口——AWX平台。
安装 Ansible
对于Ansible来说,实际批量化管理的操作都是基于 ssh 完成的。并且作为一个轻量级的自动化运维工具,它并不需要走一个C/S的模型,也不需要启动服务,仅需要在一台管理节点上面安装对应的软件即可直接使用。由于这个特性,Ansible就避免了像其他自动化运维工具那样(如Puppet),考虑升级版本造成的影响。目前只要机器上安装了 Python 2.6 以上版本,都可以运行Ansible。主机可以是 Red Hat, Debian, CentOS, OS X, BSD等系统,遗憾的是目前不支持Windows系统做控制主机。
实验环境
xiaozhuang1 主 172.25.20.11
xiaozhuang2 被控制 172.25.20.12
下载Ansible并解决依赖性的相关软件
去这里 https://opsx.alibaba.com/ 下载
-rw-r--r-- 1 root root 7968876 8月 16 12:13 ansible-2.4.2.0-2.el7.noarch.rpm
-rw-r--r-- 1 root root 39444 8月 16 12:13 python2-jmespath-0.9.0-5.el7.noarch.rpm
-rw-r--r-- 1 root root 750776 8月 16 12:13 python2-passlib-1.7.0-4.el7.noarch.rpm
-rw-r--r-- 1 root root 480432 8月 16 12:13 python-crypto-2.6.1-1.el7.x86_64.rpm
-rw-r--r-- 1 root root 69940 8月 16 12:13 python-ecdsa-0.11-3.el7.noarch.rpm
-rw-r--r-- 1 root root 117360 8月 16 12:13 python-httplib2-0.9.2-1.el7.noarch.rpm
-rw-r--r-- 1 root root 1022088 8月 16 12:13 python-paramiko-1.15.1-1.el7.noarch.rpm
-rw-r--r-- 1 root root 20556 8月 16 12:13 sshpass-1.05-5.el7.x86_64.rpm
然后用yum install -y * 安装
配置ssh
因为Ansible是基于ssh来实现server的批量化处理
所以让xiaozhuang1和xiaozhuang2之间互相通信
[root@xiaozhuang1 .ssh]# ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
a8:d0:06:4c:b9:f4:c4:62:b9:35:60:ea:25:e1:3f:23 root@xiaozhuang1
The key's randomart image is:
+--[ RSA 2048]----+
| .+= |
|.=B = |
|.=oO . |
|. *o. . |
| E.+o . S |
| .oo. |
| . |
| |
| |
+-----------------+
[root@xiaozhuang1 .ssh]# ls
id_rsa id_rsa.pub known_hosts
[root@xiaozhuang1 .ssh]# ssh xiaozhuang2 #用ssh免密连接xiaozhuang2
Last login: Thu Aug 16 13:28:42 2018 from 172.25.20.250
[root@xiaozhuang2 ~]# 登出
Connection to xiaozhuang2 closed.
ansible的配置,配置主目录/etc/ansible
ansible.cfg为主配置文件。hosts定义了主机组相关的内容。
[root@xiaozhuang1 ~]# cd /etc/ansible/
[root@xiaozhuang1 ansible]# ls
ansible.cfg hosts roles
[root@xiaozhuang1 ansible]# vim ansible.cfg
[root@xiaozhuang1 ansible]#
变更目录
126 private_key_file = /root/.ssh/id_rsa #定义ssh信任的文件目录
定义inventory文件(定义主机组)
[root@xiaozhuang1 ansible]# vim /etc/ansible/hosts
# Ex 2: A collection of hosts belonging to the 'webservers' group
[webservers]
## alpha.example.org
## beta.example.org
172.25.20.11
172.25.20.12
测试:
[root@xiaozhuang1 ansible]# ansible webserver -m command -a 'uptime'
172.25.20.12 | SUCCESS | rc=0 >>
14:17:30 up 2:38, 2 users, load average: 0.01, 0.02, 0.05
常用Ansible模块
Ansible可以通过模块的方式来完成一些原理的管理工作,可以通过ansible-doc -l查看到所有自带的模块。 ansible-doc -s+模块名 可以用来查看具体模块对应的用法。
[root@xiaozhuang1 ansible]# ansible-doc -l
[root@xiaozhuang1 ansible]# ansible-doc -s setup #查看setup(设置)的用法
setup模块
用来收集远程主机的基本信息
[root@xiaozhuang1 ansible]# ansible webserver -m setup
172.25.20.12 | SUCCESS => {
"ansible_facts": {
"ansible_all_ipv4_addresses": [
"172.25.20.12"
],
"ansible_all_ipv6_addresses": [
"fe80::5054:ff:fe4f:9456"
],
"ansible_apparmor": {
"status": "disabled"
},
"ansible_architecture": "x86_64",
"ansible_bios_date": "01/01/2011",
"ansible_bios_version": "0.5.1",
"ansible_cmdline": {
"BOOT_IMAGE": "/vmlinuz-3.10.0-514.el7.x86_64",
"LANG": "zh_CN.UTF-8",
"crashkernel": "auto",
"quiet": true,
...........
...........
"changed": false
}
ping模块
用来查看远程主机的运行状态
[root@xiaozhuang1 ansible]# ansible webserver -m ping
172.25.20.12 | SUCCESS => {
"changed": false,
"ping": "pong"
}
file模块
用来设置文件的属性,用-a指定选项。
file模块相关选项如下:
参数
force 强制,有两个选项:yes或no
group 定义文件/目录的所属组
mode 定义文件/目录的权限
owner 定义文件/目录的属主
path 必选项,定义文件/目录的路径
src 被链接的源文件路径,只应用于state=link的情况
dest 被链接到的路径,只应用于state=link的情况
recurse 递归设置文件的属性,只对目录有效
state 定义文件/目录的参数,常用参数如下:
directory:如果目录不存在,就创建目录
file:即使文件不存在,也不会被创建
link:创建软链接
hard:创建硬链接
touch:如果文件不存在,则会创建一个新的文件,如果文件或目录已存在,则更新其最后修改时间
absent:删除目录、文件或者取消链接文件
[root@xiaozhuang1 ansible]# ansible webserver -m file -a 'state=touch owner=xiaozhuang group=xiaozhuang mode=770 path=/home/mnt'
172.25.20.12 | SUCCESS => {
"changed": true,
"dest": "/home/mnt",
"gid": 1000,
"group": "xiaozhuang",
"mode": "0770",
"owner": "xiaozhuang",
"size": 0,
"state": "file",
"uid": 1000
}
在xiaozhuang2上查看
[root@xiaozhuang2 mnt]# ll /home/mnt
-rwxrwx--- 1 xiaozhuang xiaozhuang 0 8月 16 14:44 /home/mnt
command模块
用以ssh的方式,在远程主机上执行命令
[root@xiaozhuang1 ansible]# ansible webserver -m command -a 'ls /root'
172.25.20.12 | SUCCESS | rc=0 >>
anaconda-ks.cfg
fping-3.10-1.el7.x86_64.rpm
iksemel-1.4-2.el7.centos.x86_64.rpm
php-bcmath-5.4.16-42.el7.x86_64.rpm
php-mbstring-5.4.16-42.el7.x86_64.rpm
tidb-latest-linux-amd64
tidb-latest-linux-amd64.sha256
tidb-latest-linux-amd64.tar.gz
zabbix-agent-3.4.6-1.el7.x86_64.rpm
zabbix-get-3.4.6-1.el7.x86_64.rpm
zabbix-server-mysql-3.4.6-1.el7.x86_64.rpm
zabbix-web-3.4.6-1.el7.noarch.rpm
zabbix-web-mysql-3.4.6-1.el7.noarch.rpm
在xiaozhuang2上
copy模块
将对应的文件复制至远程主机
参数 说明
backup 将源文件备份。
dest 必选项。要将源文件复制到的远程主机的绝对路径,如果源文件是一个目录,那么该路径也必须是个目录
directory_mode 递归设定目录的权限,默认为系统默认权限
force 如果目标主机包含该文件,但内容不同,如果设置为yes,则强制覆盖,如果为no,则只有当目标主机的目标位置不存在该文件时,才复制。默认为yes
src 被复制到远程主机的本地文件,可以是绝对路径,也可以是相对路径。如果路径是一个目录,它将递归复制。在这种情况下,如果路径使用“/”来结尾,则只复制目录里的内容,如果没有使用“/”来结尾,则包含目录在内的整个内容全部复制,类似于rsync。
[root@xiaozhuang1 ansible]# ansible webserver -m copy -a 'dest=/mnt src=/mnt/'
172.25.20.12 | SUCCESS => {
"changed": false,
"dest": "/mnt/",
"src": "/mnt/"
}
更多模块
ansible-doc -l可以罗列ansible所有模块名称
ansible-doc -s 模块名,可以用来查看对应模块的实际用法。
运行脚本
进入安装路径,编辑hosts文件
vim hosts
检查能否ping得通副服务器
ansible webservers -m ping
把文件复制到副服务器上
ansible webservers -m copy -a 'src=/etc/issue dest=/tmp/issu.txt
mode=600'