Ansible 安装与入门
一、Ansible 简介
Ansible 是一款基于 Python 开发的自动化运维工具,集合了 puppet、chef、func、fabric 等众多运维工具的优点,可实现批量系统配置、批量程序部署、批量运行命令等功能。
它基于 paramiko 开发,以模块化方式工作,本身不具备批量部署能力,真正实现批量部署的是其运行的模块,Ansible 仅提供框架。其最大特点是无需在远程主机上安装 client/agents,通过 SSH 协议与远程主机通讯,目前已被红帽官方收购,是认可度最高的自动化运维工具之一。
Ansible 的特点
- 部署简单,仅需在主控端部署环境,被控端无需操作
- 默认使用 SSH 协议管理设备
- 拥有大量常规运维操作模块,可满足日常绝大部分操作
- 配置简单、功能强大、扩展性强
- 支持 API 及自定义模块,可通过 Python 轻松扩展
- 通过 Playbooks 实现强大的配置和状态管理
- 轻量级,无需在客户端安装 agent,更新仅需在操作机进行一次
- 提供功能强大、操作性强的 web 管理界面和 REST API 接口 ——AWX 平台
Ansible 的架构
主要由以下部分组成:
- Ansible:核心程序
- HostInventory:记录被管理主机信息,包括端口、密码、IP 地址等
- Playbooks:YAML 格式的 "剧本" 文件,定义主机需调用哪些模块完成功能
- CoreModules:核心模块,通过调用它们完成管理任务
- CustomModules:自定义模块,完成核心模块无法实现的功能,支持多种语言
- ConnectionPlugins:连接插件,用于 Ansible 与 Host 的通信
二、Ansible 任务执行解析
任务执行模式
Ansible 系统管理被控节点的方式分为两类:
-
ad-hoc 模式(点对点模式):使用单个模块,支持批量执行单条命令,属于可快速输入且无需保存的命令,类似 bash 中的单行 shell 命令。
-
playbook 模式(剧本模式):Ansible 的主要管理方式,也是其功能强大的关键。通过多个 task(任务)集合完成一类功能,如 web 服务的安装部署、数据库服务的批量备份等,可理解为组合多条 ad-hoc 操作的配置文件。
执行流程
简单来说,Ansible 运行时,首先读取 ansible.cfg 中的配置,根据规则获取 Inventory 中的管理主机列表,并行在这些主机中执行配置的任务,最后等待执行返回结果。
命令执行过程
- 加载配置文件,默认为 /etc/ansible/ansible.cfg
- 查找对应主机配置文件,确定要执行的主机或组
- 加载对应的模块文件,如 command
- 通过 ansible 将模块或命令生成对应的 py 文件(python 脚本),并传输到远程服务器
- 对应执行用户的家目录.ansible/tmp/xxx/xxx.py 文件
- 给文件添加执行权限
- 执行并返回结果
- 删除临时 py 文件,sleep 0 退出
三、Ansible 配置解析
安装方式
Ansible 常用两种安装方式:
- pip 安装:先安装 python-pip 包,再使用 pip 命令安装
bash
yum install python-pip
pip install ansible
- yum 安装:先安装 epel-release 包,再安装 ansible
bash
yum install epel-release -y
yum install ansible -y
程序结构(yum 安装为例)
- 配置文件目录:/etc/ansible/
- 执行文件目录:/usr/bin/
- Lib 库依赖目录:/usr/lib/pyhtonX.X/site-packages/ansible/
- Help 文档目录:/usr/share/doc/ansible-X.X.X/
- Man 文档目录:/usr/share/man/man1/
配置文件查找顺序
Ansible 配置文件查找顺序如下:
- 检查环境变量 ANSIBLE_CONFIG 指向的路径文件(如 export ANSIBLE_CONFIG=/etc/ansible/ansible.cfg)
- 检查当前目录下的 ansible.cfg 配置文件(~/.ansible.cfg)
- 检查 /etc/ansible.cfg
配置文件关键参数
ansible 的配置文件路径为 /etc/ansible/ansible.cfg,常见参数如下:
bash
inventory = /etc/ansible/hosts #资源清单inventory文件的位置
library = /usr/share/ansible #存放ansible模块的目录,多目录用冒号隔开
forks = 5 #并发连接数,默认为5
sudo_user = root #默认执行命令的用户,2.14版本为:become_user=root
remote_port = 22 #连接被管理节点的端口,默认为22
host_key_checking = False #是否检查SSH主机的密钥,关闭后第一次连接不提示
timeout = 60 #SSH连接超时时间,单位为秒
log_path = /var/log/ansible.cfg #ansible日志文件存储路径(默认不记录日志)
主机清单
主机清单用于保存 ansible 需要连接管理的主机列表,定义方式如下:
- 直接指明主机地址或主机名:
bash
#green.example.com
#bule.example.com
#192.168.115.101
#192.168.115.102
- 定义主机组(组名)并添加地址或主机名:
bash
[mysql_test]
192.168.115.101
192.168.115.102
192.168.115.103
可使用通配符匹配组成员,配置示例:
bash
vi /etc/ansible/hosts[web]
192.168.115.109
192.168.115.110
四、Ansible 常用命令
Ansible 的主要命令集中在 /usr/bin/ 目录下,常用命令如下:
- ansible:AD-Hoc 临时命令执行工具,用于临时命令执行
- ansible-doc:模块功能查看工具
- ansible-galaxy:下载上传优秀代码或 Roles 模块的官网平台,基于网络
- ansible-playbook:定制自动化的任务集编排工具
- ansible-pull:远程执行命令的工具,拉取配置而非推送(海量机器时使用)
- ansible-vault:文件加密工具
- ansible-console:基于 Linux Consoble 界面可与用户交互的命令执行工具
- ansible-config:查看和管理 Ansible 配置
- ansible-inventory:管理主机清单
ansible-doc 命令
用于获取模板块信息及帮助,用法:
bash
ansible-doc -l #获取全部模块信息
ansible-doc -s MOD_NAME #获取指定模块的使用帮助
ansible 命令格式
bash
ansible <host-pattern> <-f forks> [-m module_name] [-a args]
主要参数说明:
-a, MODULE_ARGS:模块参数,执行默认 COMMAND 模块时为命令参数-k, --ask-pass:提示输入 SSH 密码-K, --ask-sudo-pass:提示输入 sudo 密码-C:模拟运行环境进行预运行,用于查错测试-f FORKS:并行任务数,默认为 5-i INVENTORY:指定主机清单路径,默认为 /etc/ansible/hosts-m MODULE_NAME:执行模块的名字,默认使用 command 模块-u REMOTE_USER:远程用户,默认为 root 用户-v:查看详细信息,支持 - vvv、-vvvv 查看更详细信息
配置公私钥
Ansible 基于 SSH 协议管理主机,配置公私钥方式与 SSH 相同:
bash
#生成私钥
ssh-keygen
#向被管理主机分发私钥
ssh-copy-id root@192.168.115.109
ssh-copy-id root@192.168.115.110
五、部署 ansible 管理集群
实验环境
| 主机名 | IP 地址 | 安装包 |
|---|---|---|
| ansible | 192.168.115.108/24 | epel-release、ansible |
| node1 | 192.168.115.109/24 | - |
| node2 | 192.168.115.110/24 | - |
实验步骤
- 安装 ansible
bash
[root@localhost ~]# hostnamectl set-hostname ansible
[root@localhost ~]# su
[root@ansible ~]# yum install epel-release -y
[root@ansible ~]# yum install ansible -y
- 添加主机清单
bash
[root@ansible ~]# cd /etc/ansible/
[root@ansible ansible]# vi hosts [web] ##添加到最后一行
192.168.115.109
192.168.115.110
- 配置公私钥(如上文公私钥配置步骤)
六、Ansible 常用模块
主机连通性测试
使用 ping 模块测试主机清单中资源的连通性:
bash
[root@localhost ansible]# ansible web -m ping
192.168.115.110 | SUCCESS => {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python"}, "changed": false, "ping": "pong"
}
192.168.115.109 | SUCCESS => {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python"}, "changed": false, "ping": "pong"
}
command 模块
在远程主机上执行命令,不支持 shell 的管道等功能:
bash
[root@ansible ~]# ansible web -m command -a 'date'
192.168.115.110 | CHANGED | rc=0 >>
2020年 05月 09日 星期六 23:47:12 CST
192.168.115.109 | CHANGED | rc=0 >>
2020年 05月 09日 星期六 23:47:12 CST
常用参数:
- chdir:执行命令前切换到该目录
- executable:切换 shell 执行命令,需使用绝对路径
- creates:若文件存在,则不执行命令
- removes:若文件不存在,则不执行命令
示例:
bash
#使用chdir切换到/etc/init.d目录
[root@ansible ~]# ansible web -m command -a 'chdir=/etc/init.d/ ls'
shell 模块
在远程主机上调用 shell 解释器运行命令,支持 shell 的各种功能(如管道):
bash
[root@ansible ~]# ansible web -m shell -a 'cat /etc/passwd | grep zhangsan'
192.168.115.109 | CHANGED | rc=0 >>
zhangsan:x:1000:1000:zhangsan:/home/zhangsan:/bin/bash
192.168.115.110 | CHANGED | rc=0 >>
zhangsan:x:1000:1000:zhangsan:/home/zhangsan:/bin/bash
copy 模块
用于将文件复制到远程主机,支持生成文件和修改权限等:
主要选项:
- src:本地文件路径,可为绝对或相对路径,目录则递归复制
- content:直接指定文件内容,替代 src
- dest:必选,远程主机的绝对路径
- backup:文件内容改变时,覆盖前备份源文件
- force:目标主机文件存在且内容不同时,是否强制覆盖,默认 yes
- mode:设置文件权限
示例:
bash
#复制文件
[root@ansible demo]# ansible web -m copy -a 'src=/demo/3.txt dest=/demo/'#生成内容为“are you ok?”名为leijun的文件,权限777
[root@ansible demo]# ansible web -m copy -a 'content="are you ok?" dest=/demo/leijun mode=777'
file 模块
用于设置文件属性,如创建文件、链接文件、删除文件等:
主要选项:
- force:强制创建软链接的情况设置
- path:指定路径
- group:定义属组
- owner:定义属主
- recurse:递归设置文件属性(对目录有效)
- mode:指定权限
- state:状态,包括 directory(创建目录)、file(修改文件属性)、link(创建软链接)、hard(创建硬链接)、touch(创建文件或更新时间)、absent(删除或取消链接)
示例:
bash
#创建目录
[root@ansible ~]# ansible web -m file -a 'path=/opt/app state=directory'#创建链接文件
[root@ansible ~]# ansible web -m file -a 'path=/opt/abc src=/demo/1.txt state=link'#删除文件
[root@ansible ~]# ansible web -m file -a 'path=/opt/abc state=absent'
fetch 模块
从远程主机获取(复制)文件到本地:
选项:
- dest:存储文件的目录
- src:远程拉取的文件(不能是目录)
示例:
bash
[root@ansible ~]# ansible web -m fetch -a 'src=/demo/leijun dest=/mnt'
cron 模块
用于管理 crontab 计划性任务,语法与 crontab 一致:
主要选项:
- day:日(1-31, *, */2 等)
- hour:小时(0-23, *, */2 等)
- minute:分钟(0-59, *, */2 等)
- month:月(1-12, *, /2 等)
- weekday:周(0-6 代表周日到周六)
- job:运行的命令
- name:定时任务描述
- special_time:特殊时间范围(reboot、annually、monthly 等)
