Ansible 使用说明

发布于:2025-04-14 ⋅ 阅读:(139) ⋅ 点赞:(0)

Ansible 框架介绍

Ansible 是通过Python开发的一个简单好用的自动化运维工具,可以实现对成百上千个主机进行统一管理,实现相关流程的自动化。

1、Ansible 框架特点

  1. 基于 SSH 无代理机制工作,被控端不需要安装任何额外软件或服务,只需要保证被控端安装并开启SSH服务且有 Python环境即可。
  2. Ansible 只是一个框架,是通过调用模块实现具体功能,Ansible提供了上千个模块,可以实现常见的自动化运维功能。

2、Ansible 工作流程

  1. 首先Ansible会解析具体的任务列表,获取需要对哪些受控节点操作,以及每个具体的任务使用哪个模块实现。
  2. 然后Ansible会在一个名为主机清单的文件中查找对应受控节点的SSH连接信息,并建立SSH连接。
  3. 具体的任务会被指定的模块生成临时的Python代码或命令,并通过 SSH 拷贝到远程主机执行,并在执行后自动清理。
  4. 等到执行完成后,会将执行结果(成功、失败、是否变更)通过 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、主机清单文件结构

  1. 使用 [section] 声明主机组,每个组内可列出一个或多个 IP 地址或主机名。
  2. 每个主机还可以通过 变量(Vars) 指定连接信息,如用户名、端口、密码等。
  3. 可以通过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 <模块名> 指定要使用的模块,如 pingshellcopy
-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 字符串 必填,服务名,例如 nginxsshd
state 字符串 如何管理服务,startedstoppedrestartedreloaded
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'

网站公告

今日签到

点亮在社区的每一天
去签到