Ansible 使用说明
目录
- Ansible 框架介绍
- 1、Ansible 框架特点
- 2、Ansible 工作流程
- 3、ansible 安装方式
- Ansible 配置管理
- 1、配置读取顺序
- 2、常见的配置项
- Ansible 主机清单
- 1、主机清单文件结构
- 2、主机清单常用变量
- Ansible 剧本介绍
- 1、剧本的结构和特点
- 2、单个 Play 的结构
- 3、单个 tasks 的结构
- Ansible 常用命令
- 1、ansible 命令
- 2、Ansible-playbook
- Ansible 常用模块
- 1、command 模块
- 2、shell 模块
- 3、systemd 模块
- 4、replace 模块
Ansible 框架介绍
Ansible 是通过Python开发的一个简单好用的自动化运维工具,可以实现对成百上千个主机进行统一管理,实现相关流程的自动化。
- Ansible 官网地址:www.ansible.com
- Ansible 中文手册:https://ansible-tran.readthedocs.io
1、Ansible 框架特点
- 基于 SSH 无代理机制工作,被控端不需要安装任何额外软件或服务,只需要保证被控端安装并开启SSH服务且有 Python环境即可。
- Ansible 只是一个框架,是通过调用模块实现具体功能,Ansible提供了上千个模块,可以实现常见的自动化运维功能。
2、Ansible 工作流程
- 首先Ansible会解析具体的任务列表,获取需要对哪些受控节点操作,以及每个具体的任务使用哪个模块实现。
- 然后Ansible会在一个名为主机清单的文件中查找对应受控节点的SSH连接信息,并建立SSH连接。
- 具体的任务会被指定的模块生成临时的Python代码或命令,并通过 SSH 拷贝到远程主机执行,并在执行后自动清理。
- 等到执行完成后,会将执行结果(成功、失败、是否变更)通过 JSON 格式回传给控制节点,并输出到控制台。
3、ansible 安装方式
- 方式一:通过包管理工具进行安装,例如apt、yum等。会自动下载并安装Ansible所需的依赖。
- 方式二:以模块的方式安装在当前的Python环境中,这种方式能安装较新的Ansible版本。
两种方式使用上是没有区别的,任选其一即可
Ansible 配置管理
1、配置读取顺序
优先级 | 路径 | 说明 |
---|---|---|
最高 | ./ansible.cfg | 会在执行命令的当前目录下寻找是否存在名为ansible.cfg的文件 |
次高 | ~/.ansible.cfg | 会在当前用户家目录下寻找是否存在名为ansible.cfg的文件 |
最低 | /etc/ansible/ansible.cfg | 如果前面两个都没找到,就匹配/etc/ansible下的ansible.cfg |
查看当前使用的配置文件路径:
ansible --version
2、常见的配置项
Ansible 配置文件采用 INI 格式,即[section]
+ key=value
结构,常见的一些配置项如下:
[defaults] 配置块:
- 配置块作用:默认配置项,定义一些默认参数选项。
- 常见配置项:
# 默认配置部分
[defaults]
inventory = /etc/ansible/hosts # 指定主机清单(Inventory)文件路径
remote_user = root # 如果不指定用户名,默认使用该用户进行远程SSH连接
ask_pass = false # 设置为 false 表示默认不主动提示你输入 SSH 登录密码。
host_key_checking = False # 是否需要检查指纹(known_hosts),要设置为False,适合自动化场景
log_path = /var/log/ansible.log # Ansible的日志路径(需手动创建该文件)
timeout = 10 # SSH 连接超时时间,默认即可。
forks = 10 # 并发处理的主机数,即如果需要处理若干个主机,能同时处理的数量。
private_key_file = ~/.ssh/id_rsa # 如果采用私钥连接,不指定私钥路径时,使用该私钥进行连接
[privilege_escalation] 配置块:
- 配置块作用:和提权有关的设置项,所谓提权就是以指定用户身份执行某些操作。例如:sudo
- 常见配置项:
[privilege_escalation]
become = true # 是否默认启用 sudo 提权
become_method = sudo # 提权方式(如:sudo、su、pbrun 等)
become_user = root # 要切换的用户,默认是 root
become_ask_pass = false # 是否提示输入 sudo 密码
[ssh_connection] 配置块:
- 配置块作用:SSH 连接行为配置
- 常见配置项:
pipelining # 是否启用 pipelining 模式,减少 SSH 连接次数,提高性能
ssh_args # 额外 SSH 参数(如 -C 启用压缩)
control_path # SSH 连接复用时的控制路径模板
control_persist # 控制连接保持时间
scp_if_ssh # 当使用 SSH 复制文件时是否使用 scp 或 sftp
Ansible 主机清单
Ansible 的主机清单中记录了需要管理的服务器列表,一般主机清单采用 INI 格式进行编写。
主机清单默认路径:/etc/ansible/hosts
1、主机清单文件结构
- 使用
[section]
声明主机组,每个组内可列出一个或多个 IP 地址或主机名。 - 每个主机还可以通过 变量(Vars) 指定连接信息,如用户名、端口、密码等。
- 可以通过IP地址扩展的语法来简化批量指定 IP 地址。范围语法为
[起始:结束]
,中间不能有空格;
2、主机清单常用变量
变量名 | 说明 |
---|---|
ansible_host | 指定目标主机的实际 IP 地址或主机名 |
ansible_user | SSH 连接使用的远程用户名 |
ansible_ssh_pass | SSH 登录密码 |
ansible_port | SSH 连接端口,不指定默认 22 |
ansible_ssh_private_key_file | 指定 SSH 私钥路径,用于密钥认证 |
ansible_become | 是否启用权限提升(例如 sudo) |
例如:指定主机清单的时候,使用公共变量指定主机清单,这样可以简化操作。
[dev]
10.0.28.7
10.0.28.10
[test]
10.0.0.127
10.0.0.135
# [all:vars] 表示对所有组生效的公共变量配置。
[all:vars]
ansible_user=root
ansible_password=Mima@2024
例如:通过IP 扩展语法来批量指定 IP 地址
[test]
10.0.[0:3].[2:254] ansible_user=ehigh ansible_ssh_pass=Abc123
Ansible 剧本介绍
Ansible 中的剧本(Playbook)是采用 YAML 格式编写的脚本,能够描述一组自动化操作。一个剧本由一个或多个“剧”(Play)组成,每个 Play 指定一组主机及要在这些主机上执行的任务,从而实现远程主机的批量配置与管理。
1、剧本的结构和特点
- 剧本本身是一个 YAML 列表(即以
-
开头),其中的每个元素就是一个 Play。 - 每个 Play 是一个字典,用于定义在哪些主机上执行哪些任务。
2、单个 Play 的结构
- 必须字段(最小结构):
字段 | 说明 |
---|---|
hosts | 指定目标主机或主机组 |
tasks | 定义要执行的任务列表(tasks 是一个列表) |
说明:这两个字段缺一不可,缺了 Playbook 就无法执行。
- 可选字段:
字段 | 类型 | 说明 |
---|---|---|
name | 字符串 | 为 Play 命名,提升可读性和日志信息 |
become | 布尔 | 是否使用 sudo 权限执行(通常设置为 yes ) |
vars | 字典 | 为该 Play 定义变量 |
roles | 列表 | 引用已定义的角色,适合模块化管理 |
handlers | 列表 | 定义“触发式任务”,通常与 notify 配合使用 |
gather_facts | 布尔 | 是否收集目标主机的硬件/系统信息(默认为 true ) |
3、单个 tasks 的结构
每个 task 是一个字典,其中必须包含一个模块,模块名直接作为 task 的一个键出现,键的值是该模块所需的参数,也是一个字典。
- hosts: all
tasks:
- name: 测试连接
ping: # ping 就是模块名
说明:一个tasks中有且仅有一个模块
例如:批量初始化操作系统环境的剧本
- name: 初始化部署环境
hosts: test # 只对test这个主机组的主机操作
vars: # 定义变量
tarball_name: DeploySystem-Kylin-V10-offline_v1.9.2_V6.3.1.tar.gz
tarball_dest: /root
install_dir: /root/DeploySystem-Kylin-V10-offline_v1.9.2_V6.3.1
# 具体的任务定义
tasks:
- name: 1.永久禁用SELinux
replace: # 使用 replace 模块实现
path: /etc/selinux/config
regexp: '^SELINUX=.*'
replace: 'SELINUX=disabled'
- name: 2.关闭当前 SELinux(临时)
command: setenforce 0 # 使用 command 模块实现
ignore_errors: yes # 如果selinux本来就是关闭的,不设置这个可能会报错停止
- name: 3.停止firewalld.service
systemd: # 使用 systemd 模块实现
name: firewalld
state: stopped
enabled: no
- name: 4.上传本地离线安装包到指定主机
copy: # 使用 copy 模块实现
src: ./DeploySystem-Kylin-V10-offline_v1.9.2_V6.3.1.tar.gz
dest: "{{ tarball_dest }}/"
mode: '0644'
- name: 4.解压安装包
unarchive: # 使用 unarchive 模块实现
src: "{{ tarball_dest }}/{{ tarball_name }}"
dest: "{{ tarball_dest }}"
remote_src: yes # 告诉 Ansible:src 指定的文件已经在远程主机上,不需要从控制节点上传。
- name: 5. 执行 install.sh 脚本
command: bash "{{ install_dir }}/install.sh"
Ansible 常用命令
1、ansible 命令
ansible 命令用于 ad-hoc 模式,即临时命令执行,适合一条命令搞定的任务
语法格式:
ansible <主机组> -m <模块名> -a "<模块参数>"
说明:ansible默认会从配置文件指定的主机清单中读取指定主机组下的主机信息
常用参数:
- 基本选项:
参数 | 说明 |
---|---|
-i <inventory> | 手动指定主机清单文件,不用默认的( /etc/ansible/hosts ) |
-m <模块名> | 指定要使用的模块,如 ping 、shell 、copy |
-a "<参数>" | 指定需要给模块传的参数信息,多个参数之间使用空格分隔 |
- 调试参数:
参数 | 说明 |
---|---|
--check | 加上这个参数后,不会真正执行更改,而是执行“试运行” |
-v , -vv , -vvv | 设置详细输出级别(调试用) |
- 安全参数:
参数 | 说明 |
---|---|
--limit <主机> | 限定只对某些主机执行(支持主机名、IP、通配符) |
例如:
ansible test -m ping
2、Ansible-playbook
Ansible 的playbook 模式,需要提前先写好YAML格式的剧本文件,然后使用ansible-playbook命令来解析剧本并执行。
语法格式:
ansible-playbook [选项] playbook.yml
常用参数:
- 基础参数:
选项 | 说明 |
---|---|
--syntax-check | 检查 Playbook 语法是否正确 |
--list-tasks | 列出将要执行的所有任务(不执行) |
--list-hosts | 列出将会受影响的主机 |
- 调试参数:
选项 | 说明 |
---|---|
--check | 试运行,不实际变更目标主机(dry-run 模式) |
-v / -vv / -vvv / -vvvv | 设置输出的详细程度(调试用) |
例如:
ansible-playbook KylinV10_init.yaml
Ansible 常用模块
通过
ansible-doc 模块名称
就可以列出Ansible指定模块的使用方法了。
1、command 模块
- 模块作用:在目标主机上执行命令,不支持shell的一些例如管道符、重定向、变量等特性。
- 模块特点:会直接调用你写的命令程序,而不是先用shell来解析命令字符串,也就是会直接指定的命令字符串分割成一个程序名和参数
说明:使用 command 模块时,推荐使用命令的绝对路径,这样可以避免因为远程主机环境不同、$PATH 配置不一致而导致命令无法找到的问题。
例如:这样写就会解析失败
tasks:
- name: 使用 command 模块
command: echo hello > /tmp/hello.txt
# 会被解析为 ["echo", "hello", ">", "/tmp/hello.txt"]
2、shell 模块
- 模块作用:功能和command类似,都是在远程主机上执行命令,但是shell模块支持 完整的 shell 语法特性
- 模块特点:会将写的命令作为一整个字符串,交给远程主机的 shell(默认是 /bin/sh)来执行
- 常用参数:通过 args 这个键来指定常用参数,这个键的值是一个字典,所以如果存在多个参数,这些参数以键值对的形式出现。
参数 | 说明 |
---|---|
chdir | 先进入某个目录再执行命令 |
creates | 如果指定文件已存在,则不执行该命令 |
removes | 如果指定文件不存在,则不执行该命令 |
executable | 指定用哪个 shell 来执行,默认是 /bin/sh |
3、systemd 模块
- 模块作用: 专门用来管理 systemd 服务的模块,相当于在远程主机上运行 systemctl 命令
- 模块特点:参数不能写在 args 键下,必须直接写在 systemd 模块下面
- 常用参数:
参数 | 类型 | 说明 |
---|---|---|
name | 字符串 | 必填,服务名,例如 nginx 、sshd |
state | 字符串 | 如何管理服务,started 、stopped 、restarted 、reloaded |
enabled | 布尔值 | 是否设置为开机自动启动 |
masked | 布尔值 | 是否 mask 服务(禁止启动) |
daemon_reload | 布尔值 | 是否执行 systemctl daemon-reexec ,通常在 service 文件变更后使用 |
例如:启动NGINX服务
- name: 启动 nginx 服务
systemd:
name: nginx
state: started
enabled: yes
4、replace 模块
- 模块作用:在远程主机上的文本文件中查找并替换内容
- 模块特点:可以理解为就是结构化的 sed -i 命令,但是replace模块支持普通正则和扩展正则。
- 常用参数:
参数 | 类型 | 说明 |
---|---|---|
path | 字符串 | 必须有,要修改的目标文件路径 |
regexp | 字符串(正则) | 必须有,要匹配的正则表达式 |
replace | 字符串 | 必须有,用于替换的新文本(支持反向引用) |
backup | 布尔值 | 是否在替换前创建 .bak 备份文件 |
after | 字符串 | 只在匹配该行之后开始替换(可选) |
before | 字符串 | 只在匹配该行之前进行替换(可选) |
例如:禁用SeLinux
- name: 1.永久禁用SELinux
replace: # 使用 replace 模块实现
path: /etc/selinux/config
regexp: '^SELINUX=.*'
replace: 'SELINUX=disabled'