第一章:认识ansible
ansible简介与安装
Ansible是一款类Unix系统开发的开源的配置和自动化工具,官方的title是“Ansible is Simple IT Automation”————简单的自动化IT工具。这个工具的目标有这么几项:让我们自动化部署APP;自动化管理配置项;自动化的持续交付;自动化的云服务管理(AWS)。
Ansible用python写成,区别于其他自动化程序的是,ansible不需要在他的节点上安装任何客户端。并且ansible是基于模块来运行的,使用SSH来和节点进行通信,他本身没有任何批量部署的能力。
这是ansible的官方网站https://www.ansible.com/
ansible的特点
- 部署简单,没有客户端,只需要在主控端部署相应环境,被控端无需任何操作
- 模块化:调用特定的模块,完成特定的任务
- 使用SSH协议与被控端进行通信,管理
- 主从集中化管理
- 配置简单,功能强大,拓展性强
- 支持API接口及自定义模块
- 通过Playbooks来定制强大的配置,状态管理
- 具有幂等性,用户对于同一操作发起的一次或多次请求的结果是一致的
ansible架构模式
ansible管理方式
ansible是一个模型驱动的配置管理器,支持多节点发布、远程任务执行。默认使用SSH进行远程连接。被管理节点上无需安装任何软件,可使用各种编程语言拓展
ansible系统架构
ansible是基于模块的,本身没有批量部署的能力。真正具有批量部署能力的是ansible所运行的模块,ansible只是提供一种框架。
ansible主要组成:
- **Ansible:**核心引擎,执行工具;一次性或临时执行的操作都是通过该命令进行
- **Playbook:**剧本,定义ansible任务的配置文件,可以将多个任务定义在一个剧本中,Ansible自动执行,剧本执行支持多个任务,可以由控制主机运行多个任务,同时对多台远程主机进行管理。
- **Core moudles:**核心模块,ansible自带的模块
- **Custom moudles:**自定义模块,核心模块的功能不足以完成某种功能,可以添加自定义模块
- **Plugins:**插件,完成模块功能的补充,借助于插件完成记录日志,邮件等功能。
- **Host inventory:**主机清单,定义Ansible管理的主机策略,默认是在Ansible的hosts配置文件中定义被管节点/ect/ansible/hosts
- **Connector plugins:**连接插件,Ansible 基于连接插件连接到各个主机上,负责和被管节点实现通信。————SSH
ansible执行过程大体过程如下图,其中暖色调的代表已经模块化。
使用者使用ansible或ansible-playbook(会额外读取playbook文件)时,在服务器终端输入ansible的ad-hoc命令集或playbook后,ansible会遵循预先编排的规则将playbooks逐条拆解为play,再将play组织成ansible可识别的任务(task)。随后调用任务涉及的所有模块(module)和插件(plugin),根据inventory中定义的主机列表通过ssh将任务集以临时文件或命令的形式传输到远程客户端执行并返回执行结果,如果临时文件执行完毕则自动删除
ansible特性
- 应用代码自动化部署
- 系统管理配置自动化
- 支持持续交付自动化
- 支持云计算、大数据平台(如AWS、OpenStack、CloudStack、VMWare等)环境
- 轻量级,无需在客户端安装agent,更新时只需在控制机上进行一次更新即可
- 批量任务执行可以写成脚本,不用分发到远程就可以执行
- 使用Python编写,维护更简单,Ruby语法过于复杂
- 支持非root用户管理操作,支持sudo
ansible的安装
- ansible默认不在yum仓库中,我们要根据自己的环境去安装epel仓库
[root@workstation ~]# yum install epel-release -y
- 安装完epel仓库后就可以通过yum命令安装ansible
[root@workstation ~]# yum install ansible
- 安装完成后可以通过--version来查看版本
[root@workstation ~]# ansible --version
配置静态清单文件指定受控主机
构建ansible静态主机清单,清单中定义ansible将要管理的一批主机,这些主机也可以分配到组中,以进行集中管理。组中也可以包 含子组,一台主机也可以是多个组中的成员。清单还可以设置应用到它所定义的主机和组的变量。
可以通过两种方式定义主机清单。静态主机清单可以通过文本文件定义。动态主机清单可以根据需要使 用外部信息提供程序通过脚本或其他程序生成。
静态主机清单文件是指定的ansible目标受管主机的文本文件。文件编辑格式有多种格式INI和YAML格式。INI格式较为常见建议使用INI格式编辑。
配置静态文件
定义注意事项:默认安装ansible匹配的主机清单文件是/etc/ansible/hosts
- 在主机清单文件中每一行一个主机ip(主机名)
servera.example.com serverb.example.com
- 主机组中定义受管主机,用[]扩起受管主机组的名称,然后每一行添加一个受管主机名称/IP
[usa] serverb.example.com serverc.example.com [canada] w1.example.com w2.example.com
- 定义嵌套组(多个主机组所构成新的主机组)嵌套主机组名称定义前面写组名后面
[america:children] usa canada
- 通过范围简化主机规格 格式[START:END]
192.168.[4:7].[10:20] # 代表192.168.4.10~192.179.7.20 [a:c].example.com #代表a/b/c.example.com
自定义主机清单
在某个工作目录下创建一个名为inventory的自定义静态主机清单文件。
[root@localhost ~]# mkdir deploy-inventory [root@localhost ~]# cd deploy-inventory/ [root@localhost deploy-inventory]# ll 总用量 0 [root@localhost deploy-inventory]# cat inventory [web] 192.168.100.128
[root@localhost deploy-inventory]# ansible all -i inventory --list-hosts hosts (1): 192.168.100.128
[root@localhost deploy-inventory]# cd [root@localhost ~]# ansible all -i inventory --list-hosts [WARNING]: Unable to parse /root/inventory as an inventory source [WARNING]: No inventory was parsed, only implicit localhost is available [WARNING]: provided hosts list is empty, only localhost is available. Note that the implicit localhost does not match 'all' hosts (0): [root@localhost ~]# ansible all -i /root/deploy-inventory/inventory --list-hosts hosts (1): 192.168.100.128
验证清单
ansible 主机名/组名 --list-hosts #all 主机组含有清单中明确列出的每一个主机 #ungrouped 主机组含有清单中明确列出、但不属于任何其他组的每一个主机
匹配主机清单
- 匹配所有主机
ansible all 或者* --list-hosts
- 匹配指定的主机或者主机组
#匹配单个组 ansible 组名 --list-hosts #匹配单个主机 ansible 主机名 --list-hosts #匹配多个主机 ansible '主机名1:主机名2' --list-hosts #匹配多个组 ansible '组名1;组名2' --list-hosts #匹配不属于任何组的主机 ansible ungrouped --list-hosts
- 通配符匹配
ansible server* --list-hosts ansible 192.168.* --list-hosts
- 通配符组合匹配
[root@servera ~]# ansible 'web:ftp' --list-hosts hosts (2): servera.openlab.com serverb.openlab.com [root@servera ~]# ansible 'web:mail' --list-hosts #web和mail并集——或 hosts (2): servera.openlab.com serverb.openlab.com [root@servera ~]# ansible 'web:&mail' --list-hosts #web和mail交集——与 hosts (1): servera.openlab.com [root@servera ~]# ansible 'web:!mail' --list-hosts #属于web不属于mail——非 [WARNING]: No hosts matched, nothing to do hosts (0): [root@servera ~]# ansible 'mail:!web' --list-hosts hosts (1): serverb.openlab.com ansible 'websrv:dbsrv:&appsrv:!ftsrv' -m ping
- 正则表达式匹配
ansible "~(web|db).*.example.com" -m ping # .任意单个字符 # "~"开始表示正则匹配 # \* 匹配前面的子表达式零次或多次
管理ansible的配置文件
执行ansible命令根据所在目录匹配相关ansible配置文件,实践中一般使用ansible命令的目录中创建ansible.cfg文件,此目录中也将包含任何你的ansible项目使用的文件,有清单或者主机清单。
ANSIBLE_CONFIG(ansible环境变量中指向的配置文件)---->./ansible.cfg ---->~/.ansible.cfg ----> /etc/ansible/ansible.conf
使用ansible --version查看当前使用的是哪个ansible.cfg配置文件
管理配置文件中的设置
配置文件由几部分组成,每部分含有以键值对形式定义的设置。部分的标题一方括号括起。重点需要了解以下两部分:
[defaults] inventory = ./inventory #主机列表配置文件 library = /usr/share/my_modules #库文件存放目录 forks = 5 #默认并发数5(同时可以处理5个命令--同时有20个节点主机5个主机执行在5个执行) sudo_user = root #默认的sudo用户 root ask_sudo_pass = Ture ask_pass = false #每次执行ansible命令是否询问ssh密码 remout_port = 22 host_key_checking = False #检查对应服务器的host_key,建议取消注释 log_path = /var/log/ansible.log #ansible日志文件 module_name = command #默认模块,可以改为shell remote_user = user #要在受管主机上登录的用户名称,没有指定则是当前用户(受管、管控、托管主机的用户名) remote_tmp = ~/.ansible/tmp ;临时的py命令文件存放在远程主机目录 [privilege_escalation] ;特权升级 become = true #连接后是否在受管主机上切换用户,默认会切换到root下 become_method = sudo #如何切换用户 become_user = root #受管主机切换到的用户 become_ask_pass = false #是否为become_method提示输入密码,默认为false
例子
- ansible使用ssh连接受管主机,一般不建议用管理用户,要求通过普通用户student进行链接
[defaults] inventory = /etc/ansible/hosts remote_user = student ask_pass = True
- 关闭主机秘钥验证
在管控主机中通过指定用户发起操作指令,在受管主机中通过ssh远程连接方式以student用户身份执行,并验证密码;如果ask_pass为false 则可以通过-k 或者--ask-pass来提示接收密码进行验证。 host_key_checking = False 关闭主机秘钥验证: 或者直接在控制主机的操作系统中设置环境变量, 如下所示: $export ANSIBLE_HOST_KEY_CHECKING=False
- 远程用户sudo提权
如果在受管主机中需要通过管理员身份运行命令则配置sudo vim /etc/sudoers student ALL=(ALL) NOPASSWD: ALL 注:在受管主机中进行配置,建议管理sudo用户提权密码验证,如果没有关闭则ask_sudo_pass = True 来开启执行命令sudo提权密码验证;但是ask_sudo_pass = False那么可以空过-K --ask-become-pass来开启执行命令sudo提权密码验证
- 特权升级
在受管主机中通过sudo提权可在ansible配置中进行优化,开启远程用户在受管主机中执行特权升级。控制主机执行特权命令不需要指定sudo命令 [student@localhost ~]$ ansible web -a 'sudo useradd haha' [WARNING]: Consider using 'become', 'become_method', and 'become_user' rather than running sudo servera | CHANGED | rc=0 >> serverb | CHANGED | rc=0 >> Vim /etc/ansible/ansible.cfg [privilege_escalation] become=True become_method=sudo become_user=root become_ask_pass=False [student@localhost ~]$ ansible web -a 'useradd xixi' servera | CHANGED | rc=0 >> serverb | CHANGED | rc=0 >>
ad-hoc与模块帮助查询
ansible是指令核心部分,其主要用于执行ad-hoc命令,即单条命令。默认后面需要跟主机和选项部分,默认使用的是command模块。
ansible host-pattern -m module [-a 'module arguments'] [-i inventory] # ansible 组名/主机名 -m 模块 -a 模块参数 -i 清单文件 ansible-doc -l #获取有哪些模块 ansible-doc -s modname ansible-doc -s user #帮助 ansible-doc user #example例子
主机联通性测试
绿色:执行成功并且不需要做出任何改变
黄色:执行成功并且对目标主机做出变更
红色:执行失败
蓝色:显示详细过程
紫色:显示警告