ansible的基本原理
1.ansible概述
Ansible是一种IT自动话的运维工具,是基于python开发,又集成了大量的运维工具(puppet、cfengine、chef、func、fabric)的优点,能够实现批量系统配置,程序部署,命令运行等的功能。
Ansible主要是基于模块进行工作的,其本身并没有批量部署的能力,ansible仅仅只是提供一种框架。
Ansible的主要目的是简单易用,它还非常注重安全性很可靠性,具有最少的移动部件,使用OPenSSH进行传输(使用其他的传输和拉取模式作为代替方案)。
Ansible以无代理方式管理机器。永远不会出现如何升级远程守护进程或无法管理系统的问题,因为卸载了守护进程。由于OpenSSH是最受同行评审的开源组件之一,因此安全风险大大降低。
Ansible是分散式的 - 它依赖于您现有的操作系统凭据来控制对远程计算机的访问。如果需要,Ansible可以轻松连接Kerberos,LDAP和其他集中式身份验证管理系统。
Ansible没有客户端,因此底层通信依赖于系统软件,Linux系统下是基于OPenSSH通信,windows系统下是基于PowerShell,管理端必须是Linux,使用者认证通过后在管理节点通过Ansible工具调用各应用模块指令推送到被管理端执行,并在执行完毕后自动删除产生的临时文件
2. ansible基本架构
上图是ansible的基本架构,从上图中可以了解到以下部分:
核心:ansible
核心模块(Core Modules):是ansible自带的模块
扩展模块(Custom Modules):是在核心模块不足以满足某种功能的时候,可以添加的扩展模块
插件(Plugins):完成模块功能的补充
剧本(playbook):ansible的任务配置文件,将多个任务定义在剧本中,由ansible自动去执行
连接插件(Connaction Plugins):ansible基于连接插件连接到各个主机上,虽然ansible是使用ssh连接到各个主机的,但是它也是支持其他的连接方法的,所以需要有连接插件
主机群(Host Inventory):定义ansible管理主机
3. ansible的工作原理
3.1 ansible工作原理(一)
上面网上找到的两张ansible工作原理图片,基本都是在架构图的基础上进行的扩展,但是可以了解到:
- 管理端是支持local、ssh、zeromq三种方式连接被管理端,默认是基于ssh的连接
- 可以按照应用类型等方式进行Host Inventory(主机群)分类,管理的节点通过各类模块进行实现相应的操作,单个模块,单条命令的批量执行我们称其为ad-hoc
- 管理节点可以通过playbook实现多个task的集合实现一类的功能,playbook我们可以理解为系统通过组合多条ad-hoc操作的配置文件
ansible是一款极为灵活的开源工具套件,能够大大简化Unix管理员的自动化配置管理与流程控制方式。它利用推送方式对客户系统加以配置,这样所有工作都可在主服务器端完成。其命令行机制同样非常强大,允许大家利用商业许可Web UI实现授权管理与配置。
ansible自动化管理工具的优点:
- 轻量级,更新时,只需要在操作机器上进行一次更新即可
- 采用ssh协议
- 不需要去客户端安装agent
- 批量执行任务的时候可以写成脚本,而且不需要分发到远程就可以执行
- 采用python编写的,可以对其进行二次开发
- 支持sudo普通用户命令
- 去中心化管理
- 模块化,调用特定的模块,完成特定的任务
- 有Parmiko,PyYAML,Jinjia2(模板语言)三个关键模块
- 支持自定义模块
- 部署简单,基于ssh和python(默认安装)
- 被监控端不需要安装agent
- 安全,基于OPenssh
- 幂等性:一个任务执行一遍和执行N遍效果一样,不会因为重复执行带来意外错误
- 可以使用任何的编程语言写模块
3.2 ansible工作原理(二)
上图可以看到的内容的详细说明:
CMDB: 配置管理数据库(使用Ansible的一种方式)
USERS: 管理用户(使用Ansible的人员)
ANSIBLE PLAYBOOK: Ansible任务剧本(任务集)
INVERTORY: 被管理的主机清单
API: 供第三方程序调用的应用程序编程接口
MODULES: AnsIble使用的模块(内置模块,自定义模块)
PLUGINS: Ansbile使用的插件(模块功能的补充方式,这里包括很多的插件)
HOSTS: 被控端主机
NETWORKING: 被控端网络设备(交换机,路由器等)
ansible的主要组成部分:
ANSIBLE PLAYBOOK: Ansible任务剧本(任务集),编排定义Ansible任务集的配置文件,由Ansible顺序依次执行,通常是JSON格式的YML文件 INVENTORY: 被管理的主机清单(在/etc/ansbile/hosts文件中) MODULES: AnsIble使用的模块(内置模块,自定义模块) PLUGINS: Ansbile使用的插件(模块功能的补充方式,如连接类型插件,循环插件,变量插件,过滤插件等)这个功能很少使用 API: 供第三方程序调用的应用程序编程接口 ANSIBLE: 组合inventory,api,modules,plugins的绿框,可以理解为是ansible命令工具,其为核心的执行工具
4. ansible的7个命令
4.1 ansible
ansible是指指令核心部分,其主要是用于执行ad-hoc命令,即单条命令。如果默认不指定模块,使用的是command模块。如:
ansible 174.16.4.110 -m ping
不过默认使用的模块是可以在ansible.cfg中进行修改的。ansible命令下的部分参数详解如下:
-a 命令行参数 -m 执行模块的名字,默认是command模块,因此如果只执行单一命令可以不用-m参数 -i PATH 指定库存主机文件的路径,默认是/etc/ansible/hosts -u --user=Username 执行的用户,使用这个远程用户名而不是当前的用户 -U -- sud-user=SUDO_User sudo到哪一个用户,默认是root -k --ask-pass 登陆密码,提示输入SSH密码而不是基于密钥验证 -K --ask-sudo-pass 提示密码使用sudo -s --sudo sudo运行 -S --su 用su命令 -l --list 显示所支持的模块 -s --snippet 指定模块显示剧本片段 -f --forks=NUM 并行任务数,NUM被指定为一个整数,默认是5 --private-key=PRIVATE_KEY_FILE 私钥路径,使用这个文件进行验证连接 -v 详细信息 all 针对所有主机进行操作 -M --module-path=MODULE_PATH 要执行的模块路径,默认是/usr/share/ansible --list-hosts 打印有那些组会执行这个playbook -o --one-line 压缩输出,摘要输出,尝试一切都在一行上进行输出 -t --tree=Directory 将内容保存在该输出目录,结果保存在一个文件中在每台机器上 -B 后台运行超时时间 -P 调查后台程序时间 -T -timeout=Seconds 执行命令超时时间 -P NUM 调查背景工作时间每隔数秒,需要-b -c --connection=Connection 可选为paramiko(ssh)、ssh,主要是用于crontab或者启动 --tags=TAGS 只执行指定标签任务 --list-tasks 列出所有将被执行的任务 -C --check 只是检测会执行什么内容,不会去真正的去执行 --syntax-check 执行语法检查的剧本,但是不执行它 -l --limit=SUBSET 进一步限制所选择的主机/组模式,--limit=192.168.0.15 只对这个ip执行 --skip-tags=SKIP_TAGS 只运行剧本和任务不匹配这些值的标签 --skip-tags=copy_start
4.2 ansible-doc
这个指令是用于查看模块信息的,常用的参数有两个-l和-s,具体如下:
ansible-doc -l 列出所有已经安装的模块
ansible-doc -s command 查看具体模块的用法
4.3 ansible-galaxy
ansible-galaxy指令用于方便的从https://galaxy.ansible.com/站点下载第三方扩展模块。
ansible-galaxy install aeriscloud.docker
4.4 ansible-lint
ansible-lint是对playbook的语法进行检查的一个工具。用法是ansible-lint playbook.yml 。
4.5 ansible-playbook
该指令是使用最多的指令,其通过读取playbook 文件后,执行相应的动作.
4.6 ansible-pull
该指令使用需要谈到ansible的另一种模式---pull 模式,这和我们平常经常用的push模式刚好相反,其适用于以下场景:你有数量巨大的机器需要配置,即使使用非常高的线程还是要花费很多时间;你要在一个没有网络连接的机器上运行Anisble,比如在启动之后安装。
4.7 ansible-vault
ansible-vault主要应用于配置文件中含有敏感信息,又不希望他能被人看到,vault可以帮你加密/解密这个配置文件,属高级用法。主要对于playbooks里比如涉及到配置密码或其他变量时,可以通过该指令加密,这样我们通过cat看到的会是一个密码串类的文件,编辑的时候需要输入事先设定的密码才能打开。这种playbook文件在执行时,需要加上 --ask-vault-pass参数,同样需要输入密码后才能正常执行。