ansible 是一个自动化运维工具,基于 Python 开发,集合了众多运维工具的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能
1、ansible特性
-
模块化:调用特定模块,完成特定任务
三个关键模块:paramiko、pyYAML、jinja2
-
支持自定义模块,可以使用任何编程语言编写模块
-
基于 python 语言实现
-
部署简单,基于 python 和 SSH,agentless,无需代理不依赖 PKI(无需ssl)
-
安全,基于 OpenSSH
-
幂等性:一个任务执行1次和执行多次的效果一样,不会因为重复执行带来意外情况
-
支持 playbook 编排任务,使用 YAML 格式编排任务,支持丰富的数据结构
-
较强大的多层解决方案 role
2、ansible架构
2.1、ansible组成
-
INVENTORY
ansible 管理主机的清单,其路径为:/etc/ansible/hosts -
MODULES
ansible 执行命令的功能模块,多数为内置的核心模块,也可以自定义 -
PLUGINS
模块功能的补充,如链接类型的补充、循环插件、变量插件、过滤插件等(该功能不常用) -
API
供第三方程序调用的应用程序编程接口
2.2、ansible命令执行来源
- USER (普通用户)
- PLAYBOOKS:任务剧本,编排定义 ansible 任务集的配置文件,由 ansible 顺序依次执行,通常是 JSON 格式的 YAML 文件
- CMDB(配置管理数据库)API调用
- PUBLIC / PRIVATE CLOUD API 调用
- 执行顺序:USER —> ansible playbooks —> ansible
3、ansible 安装与入门
3.1、ansible 安装
-
CentOS
CentOS 安装 ansible 需要先安装 EPEL 源
$ sudo yum install epel-release $ sudo yum install ansible
-
Ubuntu
Ubuntu 需要配置 PPA 然后才能安装 ansible
$ sudo apt update $ sudo apt install software-properties-common $ sudo add-apt-repository --yes --update ppa:ansible/ansible $ sudo apt install ansible
-
验证安装
$ ansible --version ansible 2.9.27 config file = /etc/ansible/ansible.cfg configured module search path = [u'/root/.ansible/plugins/modules', u'/usr/share/ansible/plugins/modules'] ansible python module location = /usr/lib/python2.7/site-packages/ansible executable location = /usr/bin/ansible python version = 2.7.5 (default, Jun 28 2022, 15:30:04) [GCC 4.8.5 20150623 (Red Hat 4.8.5-44)]
3.2、ansible 相关文件
3.2.1、配置文件
- /etc/ansible/ansible.cfg
主配置文件,配置 ansible 的工作特性,一般不需要修改 - /etc/ansible/hosts
主机清单 - /etc/ansible/roles
存放角色的目录
3.2.2、ansible主配置文件
ansible 主配置文件为:/etc/ansible/ansible.cfg,该配置文件中的配置项绝大部分无需修改,使用默认配置即可,下表为部分默认配置
命令 | 功能 | 默认值 |
---|---|---|
inventory | 主机列表配置文件 | /etc/ansible/hosts |
library | 库文件存放目录 | /usr/share/my_modules/ |
remote_tmp | 远程临时目录 | ~/.ansible/tmp |
local_tmp | 本地临时目录 | ~/.ansible/tmp |
forks | 并发数 | 5 |
sudo_user | 默认sudo用户 | root |
ask_sudo_pass | 每次执行ansible命令时 ,是否询问SSH密码 | True |
ask_pass | 同上 | True |
remote_port | 远程SSH端口 | 22 |
host_key_checking | 检查对应服务器的host_key(一般需要取消) | False |
log_path | 日志文件 | /var/log/ansible.log |
module_name | 默认模块,可修改为shell | command |
3.2.3、inventory主机清单
ansible 的主要功能时用于批量主机的操作,为了更便捷的使用其中部分主机,可以在 inventory 文件中将其分组命名。默认的 inventory 文件为:/etc/ansible/hosts,inventory 文件可以有多个,可以使用 Dynamic inventory 来动态生成
-
主机清单文件格式
inventory 文件遵循 ini 文件风格,中括号中的字符为组名,可以将同一个主机归并到不同的分组中,如果目标主机使用非默认 SSH 端口,可以在主机 IP 或名称后面使用冒号加端口来说明,如果主机名称遵循相似的命名模式,也可以使用列表的方式来标识各主机
[webservers] # 同时指定多台主机 192.168.137.[121:128] # 指定主机端口 [rcoky] 192.168.137.130:2020 [omv] 192.168.137.152
3.3、ansible相关工具简介
-
ansible: 主程序,用于临时命令的执行
-
ansible-pull: 远程执行命令的工具
-
ansible-doc: 配置文档、模块功能查看工具
-
ansible-config: 查看配置文件
-
ansible-playbook: 定制自动化任务,编排剧本
-
ansible-vault: 文件加密、解密工具
-
ansible-console: 基于 console 界面与用户交互的执行工具
-
ansible-galaxy: 从官方平台下载 Roles
3.3.1、使用ansible管理设备的方式
-
Ad-Hoc
利用 ansible 命令直接执行命令,常用于临时命令的执行
-
ansible-playbook
主要用于需要重复执行的工作或大型项目
3.3.2、ansible
此工具通过 SSH 协议实现对远程主机的配置管理、应用部署、任务执行等功能。在使用该工具前,建议先配置 RSA 认证
-
语法
ansible <主机> [选项] [-a 参数]
常用选项
- –version:显示版本
- -m module:指定模块,默认为 command
- -v:显示详细信息(-vv,-vvv 显示更详细信息)
- –list-hosts:显示主机列表
- -K,–ask-pass:提示输入 SSH 密码,默认使用 key 验证
- -C,–check:第一次登录客户机,只检查,不做任何修改
- -T,–timeout ‘TIMEOUT’:执行命令的超时时间
- -u,–user ‘REMOTE_USER’:远程执行命令的用户
-
示例
ansible all -m ping
-
逻辑关系符与正则表达式
<主机>支持通配符和逻辑关系符及正则表达式
-
* 通配符
ansible "*" -m ping ansible 192.168.1.* -m ping ansible "*server" -m ping
-
逻辑或
ansible "webserver:dbserver" -m ping ansible "192.168.1.10:192.168.10.20" -m ping
-
逻辑与
# 在webserver且在dbserver中的主机 ansible "webserver:&dbserver" -m ping
-
逻辑非
# 在webserver中,但不在dbserver中的主机 ansible 'webserver:!dbserver' -m ping
-
综合逻辑
ansible 'appserver:webserver:&dbserver:!ftpserver' -m ping
-
正则表达式
ansible "~(web|db)server" -m ping
-
-
ansible命令执行过程
- 加载自己的配置文件
- 加载自己对应的模块文件
- 通过 ansible 将模块或命令生成对应的临时 python 文件,并将该文件传输到被管理主机对应执行用户 $HOME/.ansible/tmp/ansible-tmp-数字/xxx.py文件
- 给文件添加执行权限
- 执行并返回结果
- 删除临时 python 文件,并退出
3.3.3、ansible-doc
该工具用于显示模块的帮助信息
-
语法
ansible-doc [选项] [模块]
常用选项
- -l,–list:列出可用模块
- -s,–snippet:显示指定模块的playbook片段
-
示例
# 查看所有模块 ansible-doc -l #查看指定模块帮助 ansible-doc ping ansible-doc -s ping
3.3.4、ansible-galaxy
该工具用于从 https://galaxy.ansible.com/ 下载相应的 roles
# 查看已安装的galaxy
ansible-galaxy list
# 安装galaxy
ansible-galaxy install fedora.linux_system_roles
# 卸载galaxy
ansible-galaxy remove fedora.linux_system_roles
3.3.5、ansible-playbook
该工具用于执行编写好的 playbook 任务,其语法为 ansible-playbook YAML_FILE
-
示例
# 创建hello.yml文件 [root@ansible ~]# vim hello.yml - hosts: host_g2 remote_user: root tasks: - name: hello word command: /usr/bin/wall hello word # 执行剧本 [root@ansible ~]# ansible-playbook hello.yml
3.3.6、ansible-vault
该工具用于加密、解密 yml 文件
-
语法
ansible-vault [create | decrypt | edit | view | encrypt | rekey] YAML_FILE
-
示例
-
源文件
- hosts: host_g2 remote_user: root tasks: - name: hello word command: /usr/bin/wall hello word
-
加密、解密操作
# 加密文件 ansible-vault encrypt hello.yml # 解密文件 ansible-vault decrypt hello.yml # 修改加密口令 ansible-vault rekey hello.yml # 创建带加密的新文件 ansible-vault create hello.yml # 编辑加密文件内容 ansible-vault edit hello.yml # 查看加密文件内容 ansible-vault view hello.yml
-
3.3.7、ansible-console
该工具可以用于交互式执行命令
-
提示符格式说明
执行
ansible-console
命令后,将出现 “root@all (4)[f:5]$” 提示符,其含义是:- root:当前执行命令的用户
- all:所有主机
- (4):当前分组包含四台主机
- [f:5]:并发数为5
-
常用子命令
- forks:设置并发数
- cd:切换分组
- list:查看当前分组主机列表
-
示例
[root@ansible ~]# ansible-console Welcome to the ansible console. Type help or ? to list commands. # 所有分组中的主机 root@all (3)[f:5]$ list 192.168.1.12 192.168.1.11 192.168.1.13 # 切换分组 root@all (3)[f:5]$ cd host_g2 # 查看分组中的主机 root@host_g2 (2)[f:5]$ list 192.168.1.11 192.168.1.13 # 修改并发数 root@host_g2 (2)[f:5]$ forks 10 root@host_g2 (2)[f:10]$