Ansible
一:Ansible基础介绍
1、背景
在日常服务器运维中,我们经常要配置相同的服务器配置,前期我们都是一台一台的去配置,这种方法操作主要应对于服务器数量不多且配置简单的情况还可以继续这样操作,如果我们后期维护几百服务器或者几万服务器呢? 我应该怎样去快速配置服务器呢?如果需要手动的每台服务器进行安装配置将会给运维人员带来许多繁琐而又重复的工作同时也增加服务器配置的异常,至此自动化运维工具解决我们的瓶颈—Ansible工具。
2、Ansible简介
Ansible是一款基于Python开发的自动化运维工具,主要是实现批量系统配置、批量程序部署、批量运行命令、批量执行任务等等诸多功能。Ansible是一款灵活的开源工具,能够很大程度简化运维中的配置管理与流程控制方式,它利用推送方式对客户系统加以配置,这样所有工作都可在主服务器端完成。Asible是基于模块工作的,其本身没有批量部署的能力,总之只要明白Ansible是一款运维自动化的神器就好了
3、Ansible特性
(1).no agents:不需要在被管控主机上安装任何客户端;
(2).no server:无服务器端,使用时直接运行命令即可;
(3).modules in any languages:基于模块工作,可使用任意语言开发模块;
(4).yaml,not code:使用yaml语言定制剧本playbook;
(5).ssh by default:基于SSH工作;
(6).strong multi-tier solution:可实现多级指挥。
4、Ansible优点
(1).轻量级,无需在客户端安装agent,更新时,只需在操作机上进行一次更新即可;
(2).批量任务执行可以写成脚本,而且不用分发到远程就可以执行;
(3).使用python编写,维护更简单,ruby语法过于复杂;
(4).支持sudo。
5、Ansible 与其它配置管理的对比
选择了目前几款主流的与 Ansible 功能类似的配置管理软件 Puppet、Saltstack,这里所做的对比不针对各个软件的性能作比较,只是对各个软件的特性做个对比。
Puppet | Saltstack | Ansible | |
---|---|---|---|
开发语言 | Ruby | Python | Python |
是否有客户端 | 有 | 有 | 无 |
是否支持二次开发 | 不支持 | 支持 | 支持 |
服务器与远程机器是否相互验证 | 是 | 是 | 是 |
服务器与远程机器通信是否加密 | 是,标准 SSL 协议 | 是,使用 AES 加密 | 是,使用 OpenSSH |
平台支持 | 支持 AIX、BSD、HP-UX、Linux、 MacOSX、Solaris、 Windows | 支持 BSD、Linux、Mac OS X、Solaris、 Windows | 支持 AIX、BSD、 HP-UX、 Linux、Mac OSX、Solaris |
是否提供 web | ui 提供 | 提供 | 提供,不过是商业版本 |
配置文件格式 | Ruby 语法格式 | YAML | YAML |
命令行执行 | 不支持,但可通过配置模块实现 | 支持 | 支持 |
6、Ansible基本架构
Ansible 是一个模型驱动的配置管理器,支持多节点发布、远程任务执行。默认使用 SSH 进行远程连接。无需在被管理节点上安装附加软件,可使用各种编程语言进行扩展。
7、Ansible 工作机制
Ansible 在管理节点将 Ansible 模块通过 SSH 协议(或者 Kerberos、LDAP)推送到被管理端执 行,执行完之后自动删除,可以使用 SVN 等来管理自定义模块及编排
1、管理端支持local 、ssh、zeromq 三种方式连接被管理端,默认使用基于ssh的连接---这部分对应基本架构图中的连接模块;
2、可以按应用类型等方式进行Host Inventory(主机群)分类,管理节点通过各类模块实现相应的操作---单个模块,单条命令的批量执行,我们可以称之为ad-hoc;
3、管理节点可以通过playbooks 实现多个task的集合实现一类功能,如web服务的安装部署、数据库服务器的批量备份等。playbooks我们可以简单的理解为,系统通过组合多条ad-hoc操作的配置文件 。
二:Ansible安装入门
1、Ansible安装
[root@Ansible ~]# dnf -y install centos-release-ansible-29
[root@Ansible ~]# yum -y install ansible
2、配置文件
主配置文件
/etc/ansible/ansible.cfg
主机清单:
/etc/ansible/hosts
角色目录:
/etc/ansible/roles
插件目录:
/usr/share/ansible_plugins/
3. 常用模块
基本模块module_name
command、shell、doc、file、copy、add、script、doc
#doc模块
[root@mysql-01 data]# ansible-doc yum -s
[root@mysql-01 ansible]# ansible dbservers -m ping
[root@mysql-01 ansible]# ansible dbservers -m shell -a 'ls /etc/hosts'
#command模块是默认模式。如下removes=表示如果不存在该文件,则不执行。如果为creates=则表示如果存在该文件则执行。
[root@mysql-01 ansible]# ansible all -a 'removes=/etc/fs cat /etc/hosts'
192.168.31.16 | SUCCESS | rc=0 >>
skipped, since /etc/fs does not exist
192.168.31.18 | SUCCESS | rc=0 >>
skipped, since /etc/fs does not exist
#使用chdir参数,进入etc目录后查看hosts文件
[root@mysql-01 ansible]# ansible all -a 'chdir=/etc/ cat hosts'
192.168.31.18 | CHANGED | rc=0 >>
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.31.16 mysql-01
192.168.31.17 jenkins-git
192.168.31.18 mysql-02
192.168.31.16 | CHANGED | rc=0 >>
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.31.16 mysql-01
192.168.31.17 jenkins-git
192.168.31.18 mysql-02
file模块
#file模块
##通过state参数指定对文件的操作,如创建
[root@mysql-01 ansible]# ansible all -m file -a 'name=/data/ansible/f3 state=touch'
[root@mysql-01 ansible]# ansible all -m shell -a 'ls /data/ansible/f3'
192.168.31.16 | CHANGED | rc=0 >>
/data/ansible/f3
192.168.31.18 | CHANGED | rc=0 >>
/data/ansible/f3
##通过absent参数删除文件
[root@mysql-01 ansible]# ansible all -m file -a 'name=/data/ansible/f3 state=absent'
##通过directory参数创建文件夹
[root@mysql-01 ansible]# ansible all -m file -a 'name=/data/dir1 state=directory'
##通过link参数创建软链接
[root@mysql-01 data]# ansible all -m file -a 'src=/data/ansible dest=/data/ansible.link state=link'
hostname模块
#hostname模块
##通过name参数配置目标主机主机名,会立即生效且永久修改
[root@mysql-01 data]# ansible 192.168.31.18 -m hostname -a 'name=mysql-02'
cron模块
#cron模块
##启用cron
[root@mysql-01 data]# ansible all -m cron -a 'minute=* weekday=1,3,5 job="/usr/bin/wall warning" name=warncron'
[root@mysql-01 data]# crontab -l
#Ansible: warncron
* * * * 1,3,5 /usr/bin/wall warning
#停用cron,需要带job、name参数,通过disabled=true控制,要再次启用,使用disabled=false即可。也可通过state=absent参数完全删除该cron
[root@mysql-01 data]# ansible all -m cron -a 'disabled=true job="/usr/bin/wall warning" name=warncron'
copy、fetch模块
#copy模块,将本地文件复制到远端且设置备份。另外可以设置mode=644 owner=wang等参数。复制文件来源可为本地文件或者content="hello world!"此类由content参数指定的内容。
[root@mysql-01 ansible]# ansible all -m copy -a 'src=/etc/hosts dest=/etc/hosts backup=yes'
#fetch模块,从远端抓取文件到本地,会针对每个主机在本地创建相关目录。
[root@mysql-01 ansible]# ansible db* -m fetch -a 'src=/var/log/messages dest=/data/ansible'
192.168.31.16 | CHANGED => {
"changed": true,
"checksum": "748f4307920e2eb194e5dde46a45f40b9e76c00a",
"dest": "/data/ansible/192.168.31.16/var/log/messages",
"md5sum": "1c94a98fc8065919c44e1f0a2f0e43ce",
"remote_checksum": "748f4307920e2eb194e5dde46a45f40b9e76c00a",
"remote_md5sum": null
}
192.168.31.18 | CHANGED => {
"changed": true,
"checksum": "87e4095e5f908fa96f0b482dcba57a63a0539021",
"dest": "/data/ansible/192.168.31.18/var/log/messages",
"md5sum": "31cb39af78c640b6290f1f3e826f0dc4",
"remote_checksum": "87e4095e5f908fa96f0b482dcba57a63a0539021",
"remote_md5sum": null
}
[root@mysql-01 ansible]# ls
192.168.31.16 192.168.31.18
[root@mysql-01 ansible]# tree
.
├── 192.168.31.16
│ └── var
│ └── log
│ └── messages
└── 192.168.31.18
└── var
└── log
└── messages
shell模块
#command模块无法处理管道等命令,一般用shell模式
[root@mysql-01 ansible]# ansible all -m shell -a "echo $HOSTNAME"
script模块
#script模块在远端运行本地脚本
[root@mysql-01 ansible]# ansible all -m script -a './hostname.sh'
192.168.31.16 | CHANGED => {
"changed": true,
"rc": 0,
"stderr": "Shared connection to 192.168.31.16 closed.\r\n",
"stderr_lines": [
"Shared connection to 192.168.31.16 closed."
],
"stdout": "mysql-01\r\n",
"stdout_lines": [
"mysql-01"
]
}
192.168.31.18 | CHANGED => {
"changed": true,
"rc": 0,
"stderr": "Shared connection to 192.168.31.18 closed.\r\n",
"stderr_lines": [
"Shared connection to 192.168.31.18 closed."
],
"stdout": "mysql-02\r\n",
"stdout_lines": [
"mysql-02"
]
}
yum模块
#yum模块,通过name参数指定安装包,安装多个包在name参数后用“,”隔开即可。
[root@mysql-01 data]# ansible 192.168.31.18 -m yum -a 'name=vsftpd'
##查看已安装的
[root@mysql-01 data]# ansible 192.168.31.18 -m yum -a 'list=installed'
##卸载
[root@mysql-01 data]# ansible 192.168.31.18 -m yum -a 'name=vsftpd state=absent'
##使用本地已有的包,挂载了光盘。
[root@mysql-01 data]# mkdir -p /mnt/cdrom
[root@mysql-01 data]# mount /dev/cdrom /mnt/cdrom/
[root@mysql-01 data]# ll /mnt/cdrom/Packages/vsftpd-3.0.2-28.el7.x86_64.rpm
-rw-rw-r-- 3 root root 175944 10月 15 2020 /mnt/cdrom/Packages/vsftpd-3.0.2-28.el7.x86_64.rpm
#通过copy模块拷贝到远程主机
[root@mysql-01 data]# ansible 192.168.31.18 -m copy -a 'src=/mnt/cdrom/Packages/vsftpd-3.0.2-28.el7.x86_64.rpm dest=/data/ansible'
#通过name指定本地rpm包安装
[root@mysql-01 data]# ansible 192.168.31.18 -m yum -a 'name=/data/ansible/vsftpd-3.0.2-28.el7.x86_64.rpm'
#更新缓存,避免yum安装缓存问题,以下为安装dstat工具
[root@mysql-01 data]# ansible 192.168.31.18 -m yum -a 'update_cache=yes name=dstat'
service模块管理服务
#设置vsftpd服务启动且开机自启动。state状态可设置为stopped,restarted
[root@mysql-01 data]# ansible 192.168.31.18 -m service -a 'name=vsftpd state=started enabled=yes'
user模块管理用户
#创建nginx用户,指定其所属组等信息。还可指定uid,home目录等。通过state=absent参数即可删除用户等信息
[root@mysql-01 data]# ansible 192.168.31.18 -m user -a 'name=nginx shell=/sbin/nologin system=yes groups=root,man'
#查看创建的用户的用户信息
[root@mysql-01 data]# ansible 192.168.31.18 -a 'getent passwd nginx'
192.168.31.18 | CHANGED | rc=0 >>
nginx:x:997:995::/home/nginx:/sbin/nologin
group模块管理组
#创建组,也可指定name参数后通过state=absent删除
2.168.31.18 -m user -a 'name=nginx shell=/sbin/nologin system=yes groups=root,man'
#查看创建的用户的用户信息
[root@mysql-01 data]# ansible 192.168.31.18 -a 'getent passwd nginx'
192.168.31.18 | CHANGED | rc=0 >>
nginx:x:997:995::/home/nginx:/sbin/nologin
group模块管理组
#创建组,也可指定name参数后通过state=absent删除
[root@mysql-01 data]# ansible 192.168.31.18 -m group -a 'name=nginx system=yes gid=80'