Ansible概述
Ansible是近年越来越火的一款开源运维自动化工具,通过Ansible可以实现运维自动化,提高运维工程师的工作效率,减少人为的失误。Ansible通过本身集成的非常丰富的模块实现各种管理任务,其自带模块超多上千个。更为重要的是,它的操作非常简单,即使新手也比较容易上手,但它提供的功能确实非常丰富,在运维领域,它几乎可以做任何事。
Ansible自2012年发布以来,很快在全球流行。其特点表现如下:
- 基于Python开发,比较容易二次开发
- 提供丰富的内置模块,基本满足工作需求
- 管理模式简单,一条命令可以影响上千台服务器
- 被控制端无需安装任何软件,通过SSH通信
Ansible没有客户端,所以不需要在被管理主机添加代理程序,通过SSH完成底层通信,而SSH在Linux的发行版本中默认已经安装并启用。而在Windows系统下,则依赖于PowerShell,Ansible要求管理端必须是Linux系统,在管理节点通过应用模块将指令发送到被管理主机上,并在执行完毕后自动删除产生的临时文件。
根据ansible使用过程中的不同角色,可将其分为以下三个部分。
使用者:如何使用ansible实现自动化运维?
ansible工具集:ansible可以实现那种功能。
作用对象:ansible可以影响那种主机
1. 使用者
CMDB:CMDB存储和管理者企业IT架构中的各项配置信息,是构建ITIL项目的核心工具,运维人员可以组合CMDB和Ansible,通过CMDB直接下发指令调用Ansible工具集完成操作者所希望达到的目标。
PUBLIC/PRIVATE方式:Ansible除了丰富的内置模块外,同时还提供丰富的API语言接口,如PHP、Python、PERL等多种流行语言,基于PUBLIC/PRIVATE,Ansible以API调用的方式运行。
Ad-Hoc命令集:Users直接通过Ad-Hoc命令集调用Ansible工具集来完成任务。
Playbooks:Users预先编写好Ansible Playbooks,通过执行Playbooks中预先编排好的任务集,按序执行任务。
2.Ansible工具集
- Ansible Playbooks:任务脚本,任务集配置文件
- Inventory:ansible管理主机清单
- Modules:功能模块,一般内置,也可自定义
- API:第三方应用程序接口
3.作用对象
Ansible的作用对象不仅仅是Linux和非Linux操作系统的主机,也可以作用于各类PUBLIC/PRIVATE、商业和非商业设备的网络设施。
使用者使用Ansible或Ansible-Playbooks时,在服务器终端输入Ansible的Ad-Hoc命令集或Playbooks后,Ansible会遵循预选安排的规则将Playbooks逐步拆解为Play,再将Play组织成Ansible可以识别的任务,随后调用任务涉及的所有模块和插件,根据Inventory中定义的主机列表通过SSH将任务集以临时文件或命令的形式传输到远程客户端执行并返回执行结果,如果是临时文件则执行完毕后自动删除。
ansible的配置
1.安装ansible
1)yum安装ansible
本地yum并没有自带ansible的安装包
yum install https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
或者下载ansible的包,通过yum安装
链接:https://pan.baidu.com/s/1wTqqJciyxcqN5fzIlJkJbw
提取码:w0ck
yum -y install ansible
2)验证安装结果
[root@localhost ~]# ansible --version
ansible 2.3.1.0
config file = /etc/ansible/ansible.cfg
configured module search path = Default w/o overrides
python version = 2.7.5 (default, Nov 6 2016, 00:28:07) [GCC 4.8.5 20150623 (Red Hat 4.8.5-11)]
3)创建ssh免交互登录
[root@localhost ~]# ssh-keygen //生成密钥对
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa): //密钥对存放路径
Created directory '/root/.ssh'.
Enter passphrase (empty for no passphrase):
//输入私钥保护密码,直接按Enter键表示无密码
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:
36:9f:34:06:b2:d4:7d:64:81:34:9e:8c:a2:fd:6b:27 [email protected]
The key's randomart image is:
+--[ RSA 2048]----+
| .o.+. |
| . =.= |
| + + = . |
| + + . . |
| . o S + |
| o = o |
| . o |
| E.. |
| ..o |
+-----------------+
[root@localhost ~]# ssh-copy-id [email protected] //复制公钥到远端192.168.1.2
[root@localhost ~]# ssh-copy-id [email protected] //复制公钥到远端192.168.1.3
[root@localhost ~]# ssh-copy-id [email protected] //复制公钥到远端192.168.1.4
[root@localhost ~]# ssh-copy-id [email protected] //复制公钥到远端192.168.1.5
测试是否可以远程免密码等入
[root@localhost ~]# ssh 192.168.1.2 //远程访问192.168.1.2
Last login: Tue Feb 11 11:19:46 2020 from 192.168.1.1
[root@localhost ~]# ssh 192.168.1.3
Last login: Tue Feb 11 11:19:46 2020 from 192.168.1.1
[root@localhost ~]# ssh 192.168.1.4
Last login: Tue Feb 11 11:19:46 2020 from 192.168.1.1
[root@localhost ~]# ssh 192.168.1.5
Last login: Tue Feb 11 11:19:46 2020 from 192.168.1.1
到此,已经完成Ansible的部署,接下来就可以通过Ansible对设备进行管理了。
2.ansible配置
Inventory是Ansible管理主机信息的配置文件,相当于系统Hosts文件的功能,默认存放在/etc/ansible/hosts。在hosts文件中,通过分组来组织设备,Ansible通过Inventory来定义主机和分组,通过在ansible命令中使用选项-i或–inventory-file来指定Inventory。比如:
[root@localhost ~]# ansible -i /etc/ansible/hosts web -m ping
如果使用默认的Inventory文件(/etc/ansible/hosts),也可以不指定Inventory文件,比如:
[root@localhost ~]# ansible web -m ping
Ansible通过设备列表以分组的方式添加到/etc/ansible/hosts文件来实现对设备的管理,所以在正式管理之前,首先要编写好hosts文件。hosts文件中,以[ ]包含的部分代表组名,设备列表支持主机名和IP地址。默认情况下,通过访问22端口(SSH)来管理设备。若目标主机使用了非默认的SSH端口,还可以在主机名称之后使用冒号加端口标明,以行为单位分隔配置。另外,hosts文件还支持通配符
[root@localhost ~]# vim /etc/ansible/hosts
[web]
192.168.1.2
192.168.1.3
192.168.1.4
192.168.1.5
1)通过命令查看httpd服务状态(前提:node1、node2安装httpd)
①管理单台主机
只对web组中192.168.1.2主机操作,通过–limit参数限定主机的变更
ansible web -m command -a "systemctl status httpd" --limit "192.168.1.2"
//-a指定命令
//-m指定模块
②管理清单内主机组
ansible web -m command -a "systemctl status httpd"
3.Ansible命令
1)ansible
ansible主要用在:
非固化需求
临时一次性操作
二次开发接口调用
非固化需求是指临时性的维护,如查看web服务器组磁盘使用情况、复制一个文件到其他机器等。类似这些没有规律的、临时需要做的任务,我们成为非固化需求,临时一次性操作。语法如下:
Ansible <host-pattern> [options]
可用选项如下:
-v:输出详细的执行过程
-i PATH(--inventory=PATH):指定inventory信息,默认为/etc/ansible/hosts
-f NUM:并发线程数,默认为5个线程
--private-key=PRIVATE_KEY_FILE:指定密钥文件
-m:指定模块
-M:指定模块存放目录,默认为/usr/share/ansible
-a:指定模块参数
-u:指定远程主机以username运行命令
-l:限制运行主机
--list-host:列出符合条件的主机列表
①命令ping所有主机
ansible all -f 5 -m ping
②列出所有主机
ansible web --list
③查看web组清单主机磁盘使用情况
ansible web -m command -a "df -hT"
三种颜色来表示执行结果:
- 红色:表示执行过程出现异常;
- 橘黄颜色:表示命令执行后目标有状态变化;
- 绿色:表示执行成功且没有目标机器做修改
2)Ansible-doc
Ansible-doc用来查询ansible模块文档的说明,类似于man命令,针对每个模块都有详细的用法说明及应用案例介绍,语法如下:
ansible-doc [options] [module……]
[root@localhost ~]# ansible-doc -l
//列出所支持的模块
[root@localhost ~]# ansible-doc ping
//关于ping模块的说明信息
> PING (/usr/lib/python2.7/site-packages/ansible/modules/system/ping.py)
A trivial test module, this module always returns `pong' on successful contact. It
does not make sense in playbooks, but it is useful from `/usr/bin/ansible' to verify
the ability to login and that a usable python is configured. This is NOT ICMP ping,
this is just a trivial test module.
EXAMPLES:
# Test we can logon to 'webservers' and execute python with json lib.
ansible webservers -m ping
MAINTAINERS: Ansible Core Team, Michael DeHaan
METADATA:
Status: ['stableinterface']
Supported_by: core
3)Ansible-playbook
Ansible-playbook是日常应用中使用频率最高的命令,类似于Linux中的sh或source命令,用来执行系列任务。其工作机制:通过读取预先编写好的playbook文件实现集中处理任务。Ansible-playbook命令后跟yml格式的playbook文件,playbook文件存放了要执行的任务代码,命令使用方式如:
Ansible-playbook playbook.yml
//playbook.yml文件要提前编写好,建议使用绝对路径
4)Ansible-console
Ansible-console是Ansible为用户提供的一款交互式工具,类似于Windows的cmd或者是Linux中shell。用户可以在ansible-console虚拟出来的终端上像shell一样使用Ansible内置的各种命令,这为习惯于使用shell交互式方式的用户提供了良好的使用体验。在终端输入ansible-console命令后,显示如下
[root@localhost ~]# ansible-console
Welcome to the ansible console.
Type help or ? to list commands.
//输入help或?获取帮助
root@all (2)[f:5]$ cd web //使用cd命令切换主机或分组
root@web (2)[f:5]$ list //列出当前的设备
192.168.1.2
192.168.1.3
//支持Tab键补全,快捷键Ctrl+D或Ctrl+C即可退出当前的虚拟终端
4.ansible模块
(1)command模块
使用命令关闭selinux和防火墙
ansible web -m command -a "setenforce 0"
ansible web -m command -a "systemctl stop firewalld"
使用chdir切换目录
ansible web -m command -a "chdir=/tmp ls ./"
(2)shell模块:通过调用被管理主机的shell运行命令,支持管道和重定向
使用echo 和 > 创建文件
ansible web -m shell -a 'echo "hello" >> /tmp/hello.txt'
(3)copy模块:复制文件到远程主机
主要参数:dest 目标位置
src 源文件路径
mode 目标权限
owner 目标文件属主
group 目标文件属组
content 可选内容复制,不能与src共用
复制本机/etc/hosts到远程主机/tmp,权限777
ansible web -m copy -a "src=/etc/hosts dest=/tmp mode=777 owner=nobody group=root"
(4)hostname模块:管理远程主机主机名,把node3主机名改为demo
ansible node3 -m hostname -a "name=demo"
(5)yum模块:对远程主机,管理yum程序
参数:
name:程序包名称
state=present|latest|absent:present表示安装、latest表示安装最新版本、absent表示卸载
disablerepo:临时禁用某个yum仓库
enablerepo:临时启用仓库
conf_file:yum运行时临时启用的配置文件,不是默认文件
diable_gpg_check=yes|no:是否启用完整性校验
使用yum模块,远程安装node1的httpd服务
ansible node1 -m yum -a "name=httpd state=present"
(6)service模块:管理远程主机服务
name:服务名
state=started|stoped|restarted:启动|关闭|重启
enabled=yes|no:服务是否开机自启动
runlevel:服务在那个级别开机自启动
设置node1的httpd服务开机自动启动
(7)user模块:管理远程主机的用户帐号
name:账号名
state=present|absent:present表示创建、absent表示删除
system=yes|no:是否为系统账号
uid:用户uid
group:基本组
groups:附加组
shell:默认shell
home:宿主目录
move_home=yes|no:如果宿主目录已存在,是否移动宿主目录
password:密码
comment:注释
remove=yes|no:删除用户时,是否删除宿主目录
所有web组主机创建用户user1,密码user1
ansible web -m user -a "name=user1 system=yes uid=666 group=root groups=sshd shell=/sbin/nologin home=/home/user1 password=user1"
删除web组主机user1用户
ansible web -m user -a "name=user1 remove=yes state=absent"