Ansible是什么?
Ansible是一个开源自动化运维平台。Ansible是一个可以在Ansible Playbook中完美描述IT应用架构的简单的自动化语言。它也是一个运行Ansible Playbook的自动化引擎。
Ansible可以管理强大的自动化任务,并且可以适应许多不同的工作流和环境。同时,Ansible的新使用者可以非常快速的使用它并将其带入生产环境。
Ansible是Python写的,是Agentless(无代理),建议在中小型环境中使用。
Ansible的核心理念就是一个主机(主控端)能够控制多台别的主机(被控端)。
Ansible如果在大型环境中使用,也就是被控端特别多的情况下,那么速度效率就会非常的慢。
相比之下,SaltStack(也非常流行)也是Python写的,一般需要部署agent(也可以叫做代理),由于使用了代理,因此其执行的效率更高,比起Ansible高多了。
Ansible的特点?
1、简单
Ansible Playbook是容易理解的,容易看懂的。Playbook是非常容易理解和修改的自动化工具。不需要特别复杂的编程能力就可以写Playbook。Playbook按照顺序执行task。Playbook简单涉及让每个团队都能很容易的上手使用。
2、强大
你可以使用Ansible来部署应用,进行配置管理,工作流自动化运维,网络自动化运维。Ansible可用于协调整个应用程序生命周期。
3、无代理
Ansible是一种无代理的架构。通常,Ansible通过使用OpenSSH或WinRM来连接到被管理的主机并且经常(但不全是)通过向被管理主机推送叫Ansible模块的小程序来运行task。这些程序用于将系统至于特定的期望状态。任何被推送的模块当Ansible任务执行完成之后会被移除。你可以很快的上手Ansible,因为Ansible在被管理主机上不需要任何特殊的代理。因为被控端没有代理,所以Ansible是更高效(这里的高效指的是不用刻意花费时间部署agent)的并且比其它的自动化运维工具更安全。
Ansible的优势?
1、跨平台支持
Ansible的无代理特性支持Linux、Windows、Unix、Mac和网络设备,无论物理机、虚拟机、云主机和容器环境都可以支持
2、容易懂、容易上手
被写成YAML的text文件的Ansible Playbook是容易懂的,并且能够帮助任何人快速理解并上手
3、完美应用描述
Ansible Playbook可以进行任何更改,并且可以描述和记录应用程序环境的各个方面
4、简单的版本管理
Ansible Playbook和Project是明文的text(也可以加密),它们可以像代码一样对待并放置在现有的版本控制系统中
5、支持动态的Inventories
Ansible管理的计算机列表可以从外部源动态更新,以便始终捕获所有托管服务器的正确最新列表,无论基础架构或者位置如何
6、与其它系统轻松集成的编排
HP SA、Puppet、Jenkins、Red Hat Satellite和其它的在你环境中的系统都可以被集成到你的Ansible中
Ansible:DevOps的语言?
开发测试,问答测试,操作,管理,外包,交流是DevOps的关键。
Ansible是第一种可以跨IT读写的自动化语言,它也是唯一能够从开始到结束自动化应用程序生命周期和连续交付管道的自动化引擎。
Ansible概念和架构?
1、控制节点
在Ansible的架构中有两种类型的机器,一类是控制节点(主控端),一类是被管理主机(被控端)。Ansible被安装并且运行在控制节点上(主控端),并且这类机器上有你的项目文件的副本。控制节点是管理员的笔记本,也可以是一个被很多管理员共同使用的系统,也可以是一个运行Ansible Tower的服务器。
2、被管理主机-Inventory
被管理主机被列在Inventory中,Inventory将这些被管理主机组织进不同的group中进行管理,Inventory可以被定义在静态的text文件中,或者被定义在动态的脚本中。
3、Playbook
不用写复杂的脚本,Ansible用户创建高等级的Play来保证主机处在特定的状态。一个剧本在一个主机上执行一系列的任务,这些剧本在text文件中被表达为YAML的格式,包含一个或更多的Play叫做Playbook。
4、Task
每个Task运行一个带着特定参数的Module,每个Module都是一段很少的代码,该代码可以用Python、PowerShell或者其它的语言来编写。每个模块本质上都是工具包中的工具。Ansible附带了一千多个可用于执行各种自动化任务的有用模块。这些模块可以用来操控系统中的文件,安装软件或者做系统调用。
5、安全的多次运行-幂等性
当在Task中使用模块时,模块通常确保关于机器的某些特定事物处于特定状态。例如,当Task使用模块来确定一个文件是否存在,或者是否有特定的权限和内容,而使用不同模块的任务可以确保挂载了特定的文件系统。如果系统不在那个状态,Task会将系统设置成那个状态。如果系统已经处在了那个状态,它将什么都不会做。如果一个Task失败了,Ansible的缺省行为是为失败的主机终止剩余的剧本,并且回滚到主机没有跑Ansible Task之前的状态。Task、Play和Playbook是幂等性的。你可以在同样的主机上安全的运行多次同样的Task、Play和Playbook,并且当你的系统处在正确的状态时,Task、Play和Playbook运行后将不会对被控端做任何改变。
6、Ansible插件
ansible插件是增强ansible的核心功能的代码片段,ansible使用插件架构来实现丰富,灵活和可扩展的功能集。Ansible提供了许多方便的插件,也可以轻松编写自己的插件。
7、Ansible架构
Ansible架构是无代理的。通常,当一个管理员运行一个Ansible Playbook或者Ad Hoc命令时,主控端通过使用OpenSSH或者WinRM来连接到被控端。这意味着在被控端不必安装特定的代理软件,并且不必允许特殊的网络流量传输到非标准端口。
8、Ansible Tower
红帽的Ansible Tower是一个帮助你增加安全、控制力和扩展性的企业框架。你可以使用它来控制谁能接入并且在你的主机上运行playbook,不必用户传输或者看到内容就能共享OpenSSH凭据,记录所有的Ansible工作日志,管理Inventory等等。它提供一个基于Web的UI和Restful的API。它不是Ansible的核心组件,却是一个帮助你高效使用Ansible的产品。
9、Ansible的工作方式(图片)
Ansible的特性?
1、模块化
调用特定的模块,完成特定的任务
2、有3大关键模块
Paramiko、PyYAML、Jinja2
3、支持自定义模块
可自己编写模块
4、基于Python语言实现
目前是Python2版本,不支持Python3版本
5、部署简单
基于Python和OpenSSH(默认已安装),无代理
6、安全
基于OpenSSH
7、支持playbook编排任务
方便、简单
8、幂等性
即一个任务执行一遍和执行n遍效果一样,不因重复执行带来意外情况
9、无需代理
不依赖PKI(无需ssl)
10、可使用任何编程语言写模块
支持多语言编写模块
11、YAML格式
编排任务时支持丰富的数据结构
12、较强大的多层解决方案
支持role方式,更合理和高效的利用playbook
Ansible主要组成部分?
1、Ansible Playbook
任务剧本(任务集),编排定义Ansible任务集的配置文件,由Ansible顺序依次执行,通常是Json格式的YML文件
2、Inventroy
Ansible管理主机的清单,默认是/etc/ansible/hosts
3、Modules
Ansible执行命令的功能模块,多数为内置核心模块,也可以自定义
4、Plugins
模块功能的补充,如连接类型插件、循环插件、变量插件、过滤插件等,该功能不常用
5、Api
供第三方程序调用的应用程序编程接口
6、Ansible
组合Inventory、Api、Modules、Plugins的绿框,可以理解为ansible命令工具,其为核心执行工具
Ansible主要操作对象?
1、Hosts主机
即Linux、Mac、Windows、虚拟机、云主机或者容器化主机
2、Networking网络设备
路由器和交换机等
3、注意事项
1、执行ansible的主机一般称为主控端,中控,master、堡垒机或者控制节点
2、主控端Python版本需要2.6或者以上
3、被控端Python版本小于2.4需要安装python-simplejson
4、被控端如开启SELinux需要安装libselinux-python
5、Windows不能作为主控端
6、如果被控端是Windows,那么必须在Windows上安装0.2.2或者更新版本的Python-winrm
7、如果被控端是Windows,那么需要使用PowerShell 3.0或者更新的版本而不是Python,除此之外被控端的PowerShell需要有远程配置
利用Ansible实现管理的方式?
1、Ad-Hoc
即ansible单条命令,主要用于临时场景使用
2、Ansible-Playbook
主要用于长期规划好的,大型项目的场景,需要有前提的规划
3、Role
Role是一种特殊的Ansible-Playbook方式
Ansible命令执行来源?
1、User
普通用户,即System Admin
2、Cmdb
配置管理数据库,Api调用
3、Public/Private Cloud Api调用
即被云端的Api调用
4、User -> Ansible Playbook -> Ansible
用户使用Ansible Playbook,然后调用Ansible
Ansible-Playbook执行过程?
1、将已有编排好的任务集写入Ansible-Playbook
2、通过ansible-playbook命令分拆任务集至逐条ansible命令,按预定规则逐条执行
如何初始化Ansible?
1、查看Python版本,确保Python版本可用
yum list installed python
2、安装Python(如有必要)
yum install -y python
3、安装epel源(Ansible是在EPEL源中的软件包)
yum install -y epel
4、安装Ansible
yum install -y ansible
Ansible查找配置文件的优先级顺序?
1、$ANSIBLE_CONFIG
2、./ansible.cfg
3、~<当前用户>/.ansible.cfg
4、/etc/ansible/ansible.cfg
Inventory文件的定义?
Inventory文件定义了一系列被管理的主机,这些被管理的主机可以被放到group中。group可以包含child group,并且一个主机可以属于多个组,Inventory文件中也可以设置变量来指定主机和组。
Inventory文件的种类?
Inventory文件分为静态和动态两种,动态的Inventory可以被脚本生成或者其它的程序生成。
什么是静态Invenrtory文件?
静态Inventory文件和Windows的ini文件很类似。静态Inventory文件可以通过主机名或者ip地址来指定被管理主机,每行代表一个主机。
静态Inventory文件的常规写法?
1、常规写法
web1.example.com
web2.example.com
db1.example.com
db2.example.com
192.168.1.1
2、主机组
[websrvs]
web1.example.com
web2.example.com
192.168.1.1
[dbsrvs]
db1.example.com
db2.example.com
3、被管理主机可以在多个组中
[websrvs]
web1.example.com
web2.example.com
192.168.1.1
[dbsrvs]
db1.example.com
db2.example.com
[production]
web1.example.com
web2.example.com
db1.example.com
db2.example.com
192.168.1.1
4、两个一定存在的组
all:表示每个Inventory中的主机(不重复)
ungrouped:不在任何主机组中的主机
5、嵌套组
":children"表示嵌套组
[websrvs]
web1.example.com
web2.example.com
192.168.1.1
[dbsrvs]
db1.example.com
db2.example.com
[production:children]
websrvs
dbsrvs
6、一个组可以同时有被管理主机和children组
[websrvs]
web1.example.com
web2.example.com
192.168.1.1
[dbsrvs]
db1.example.com
db2.example.com
[production:children]
websrvs
dbsrvs
[production]
192.168.1.2
注意,[production:children]下跟的是组,[production]下跟的是主机,在输出production组中的主机时,前2个内容会合并后再输出。
7、指定范围主机
192.168.[4:7].[0:255],匹配192.168.4.0/22
server[01:20].example.com,匹配server01.example.com到server20.example.com,注意不会匹配server1.example.com
2001:db8::[a:f],匹配所有从2001:db8::a到2001:db8::f的地址
如何指定使用静态Inventory文件?
ansible和ansible-playbook都可以使用"-i"来指定Inventory文件的位置。
如何使用ansible命令来查看host?
ansible <组名> -i <指定inventory路径> --list-hosts
ansible <组名> --list-hosts,此处使用默认Inventory
如何更好的管理Ansible的版本管理?
ansible.cfg文件指定了Inventory文件的位置,通常可以将ansible.cfg、Inventory文件和Playbook放置到同一个目录中,这样就容易实现版本管理。
如何查看Ansible版本?(顺带还可以查看当前使用的配置文件)
ansible --version
当前使用哪个配置文件,这条命令很实用,也很有必要。
如何配置被管理主机的连接?
1、使用哪个Inventory文件。
在特定的目录下,创建ansible.cfg文件,编写如下信息:
[defaults]
inventory = ./inventory
2、使用什么连接协议(默认是ssh),使用什么端口
3、使用什么用户
[defaults]
inventory = ./inventory
remote_user = root
ask_pass = true -> 提示输入ssh密码(即便已经配置了免密钥登录,还是要输入密码),如果是false,则是不需要密码,要使用密码方式登录了
4、如果一个用户没有特殊权限,是否需要做提权操作,例如使用sudo提升到root
5、是否提示输入ssh密码或者输入root密码来获得提权
Ansible的权限提升?
为了安全考虑,Ansible可能通过非root用户来连接被管理主机。那么如果要在被管理主机上执行管理操作就需要提升到root权限。这个可以在[privilege_escalation]部分被设置。
[defaults]
inventory = ./inventory
remote_user = someuser
ask_pass = false
[privilege_excalation]
become = true -> 表示提权
become_method = sudo -> 表示提权方式
become_user = root -> 表示提权到什么用户
become_ask_pass = false -> 表示提权是否需要密码
以上配置表示登录到远程主机后,直接使用root权限。如果become_ask_pass = true后,则登录后额外需要输入一次sudo的密码。如果不提权,则使用普通用户。
Ad Hoc的标准语法格式?
ansible host-pattern -m module [-a 'module arguments'] [-i inventory] [-u remote_user] [-b]
注意,[]中的内容是可选的,也就是可写可不写,视情况而定。
-m,后接模块
-a,后接模块的参数
-i,后接主机或者主机组
-u,后接使用什么用户在远程主机上执行命令
-b,表示提权
比如:
ansible all -m ping
注意,这条命令就没有用到-a
注意,ad-hoc命令行中的参数优先级高于配置文件中的设置,如ad-hoc中使用到了-b,而ansible.cfg中become = false,则依然是使用提权的
如何查看ansible的模块帮助?
ansible-doc -l
列出所有的模块
ansible-doc ping
查看ping模块的帮助
转载于:https://blog.51cto.com/houjun19830610/2314280