Ansible 自动化运维工具

简单、强大、无代理的IT自动化平台,可实现应用部署、配置管理和任务自动化

Ansible 简介

Ansible 是一个开源的自动化工具,用于配置管理、应用部署和任务自动化。它使用简单的YAML语法(称为Playbooks)来描述自动化任务,无需在远程主机上安装代理程序,通过SSH进行通信。

Ansible 的核心优势在于其简单性、易读性和强大的模块化架构。它拥有丰富的内置模块,可以管理各种系统资源,包括文件、软件包、服务、用户等。

# 基本命令格式
ansible <host-pattern> -m <module-name> -a "<module-parameters>"

常用模块介绍

command 模块

在远程节点上执行命令。这是默认模块,不需要指定模块名。

命令行示例
参数说明
执行简单命令
ansible webservers -m command -a "/usr/bin/make_database.sh"
执行带参数的命令
ansible dbservers -a "/usr/bin/make_database.sh db_user db_name"
常用参数
  • cmd: 要执行的命令
  • chdir: 执行命令前切换目录
  • creates: 如果文件存在则不执行
  • removes: 如果文件不存在则不执行

shell 模块

在远程节点上通过shell执行命令,支持管道、重定向等shell特性。

命令行示例
参数说明
使用管道操作
ansible all -m shell -a "ps aux | grep java | grep -v grep"
使用重定向
ansible webservers -m shell -a "echo 'Hello World' > /tmp/hello.txt"
常用参数
  • cmd: 要执行的shell命令
  • chdir: 执行命令前切换目录
  • executable: 指定使用的shell

script 模块

将本地脚本传输到远程节点并在远程执行。

命令行示例
参数说明
执行本地脚本
ansible all -m script -a "/opt/scripts/setup_environment.sh"
执行脚本并传递参数
ansible dbservers -m script -a "/opt/scripts/backup_database.sh --dbname=myapp"
常用参数
  • cmd: 脚本路径
  • creates: 如果文件存在则不执行
  • removes: 如果文件不存在则不执行
  • chdir: 执行脚本前切换目录

copy 模块

用于将文件从控制节点复制到远程主机。可以设置文件权限、所有者和组。

命令行示例
参数说明
复制文件到远程主机
ansible webservers -m copy -a "src=/etc/ansible/config.conf dest=/etc/myapp/config.conf owner=root group=root mode=0644"
复制文件并备份原有文件
ansible dbservers -m copy -a "src=/tmp/database.conf dest=/etc/mysql/my.cnf backup=yes"
常用参数
  • src: 源文件路径(控制节点)
  • dest: 目标文件路径(远程主机)
  • owner: 文件所有者
  • group: 文件所属组
  • mode: 文件权限
  • backup: 是否备份现有文件

fetch 模块

从远程节点获取文件到控制节点。

命令行示例
参数说明
获取远程文件
ansible webservers -m fetch -a "src=/var/log/nginx/access.log dest=/tmp/logs/ flat=yes"
获取多个文件
ansible dbservers -m fetch -a "src=/var/log/mysql/ dest=/tmp/mysql_logs/ flat=yes"
常用参数
  • src: 远程文件路径
  • dest: 本地目标目录
  • flat: 是否保持文件名不变
  • validate_checksum: 是否验证校验和

file 模块

用于设置文件的属性,或创建/删除文件、目录和符号链接。

命令行示例
参数说明
创建目录
ansible all -m file -a "path=/opt/myapp/logs state=directory owner=myuser group=mygroup mode=0755"
创建符号链接
ansible webservers -m file -a "src=/opt/myapp dest=/usr/local/myapp state=link"
删除文件或目录
ansible all -m file -a "path=/tmp/oldfile state=absent"
常用参数
  • path: 文件/目录路径
  • state: 状态 (file, directory, link, absent, touch)
  • owner: 文件所有者
  • group: 文件所属组
  • mode: 文件权限
  • src: 源路径(用于符号链接)

unarchive 模块

解压缩文件或存档到远程主机。

命令行示例
参数说明
解压远程文件
ansible all -m unarchive -a "src=/tmp/app.tar.gz dest=/opt/ copy=no"
从控制节点复制并解压
ansible webservers -m unarchive -a "src=/opt/archives/app.zip dest=/opt/myapp/"
常用参数
  • src: 源文件路径
  • dest: 目标目录
  • copy: 是否从控制节点复制文件
  • owner: 解压后文件所有者
  • group: 解压后文件所属组
  • mode: 解压后文件权限

archive 模块

创建压缩存档文件。

命令行示例
参数说明
创建tar.gz存档
ansible webservers -m archive -a "path=/var/log/nginx dest=/tmp/nginx_logs.tar.gz format=gz"
创建zip存档
ansible dbservers -m archive -a "path=/var/lib/mysql dest=/tmp/mysql_backup.zip format=zip"
常用参数
  • path: 要存档的路径
  • dest: 存档文件路径
  • format: 存档格式 (gz, bz2, zip, tar)
  • owner: 存档文件所有者
  • group: 存档文件所属组

hostname 模块

管理远程主机的主机名。

命令行示例
参数说明
设置主机名
ansible webserver01 -m hostname -a "name=web01.example.com"
设置并使用新主机名
ansible dbserver01 -m hostname -a "name=db01.example.com use=systemd"
常用参数
  • name: 要设置的主机名
  • use: 使用的工具 (systemd, debian, etc.)

cron 模块

管理cron作业,可以创建、修改和删除定时任务。

命令行示例
参数说明
创建定时任务
ansible all -m cron -a "name='daily backup' minute=0 hour=2 job='/usr/local/bin/backup.sh'"
禁用定时任务
ansible webservers -m cron -a "name='daily backup' disabled=yes"
删除定时任务
ansible all -m cron -a "name='daily backup' state=absent"
常用参数
  • name: 任务名称
  • job: 要执行的命令
  • minute, hour, day, month, weekday: 时间设置
  • state: 状态 (present, absent)
  • disabled: 是否禁用
  • user: 运行任务的用户

yum_repository 模块

管理基于RPM系统的YUM软件仓库。

命令行示例
参数说明
添加EPEL仓库
ansible centos_servers -m yum_repository -a "name=epel description=EPEL baseurl=https://download.fedoraproject.org/pub/epel/$releasever/$basearch/ gpgcheck=yes gpgkey=https://download.fedoraproject.org/pub/epel/RPM-GPG-KEY-EPEL-7"
移除仓库
ansible all -m yum_repository -a "name=epel state=absent"
常用参数
  • name: 仓库名称
  • description: 仓库描述
  • baseurl: 仓库URL
  • gpgcheck: 是否启用GPG检查
  • gpgkey: GPG密钥URL
  • state: 状态 (present, absent)

dnf 模块

在基于RPM的系统上使用dnf包管理器管理软件包。

命令行示例
参数说明
安装软件包
ansible fedora_servers -m dnf -a "name=nginx state=present"
更新所有软件包
ansible all -m dnf -a "name=* state=latest"
移除软件包
ansible webservers -m dnf -a "name=apache state=absent"
常用参数
  • name: 包名称
  • state: 状态 (present, absent, latest)
  • update_cache: 是否更新包缓存
  • disable_gpg_check: 是否禁用GPG检查

service 模块

管理服务状态,如启动、停止、重启和启用开机自启。

命令行示例
参数说明
启动并启用服务
ansible webservers -m service -a "name=httpd state=started enabled=yes"
重启服务
ansible all -m service -a "name=nginx state=restarted"
停止服务
ansible dbservers -m service -a "name=mysql state=stopped"
常用参数
  • name: 服务名称
  • state: 状态 (started, stopped, restarted, reloaded)
  • enabled: 是否开机自启
  • sleep: 重启时等待时间(秒)

firewalld 模块

管理firewalld防火墙规则。

命令行示例
参数说明
开放HTTP端口
ansible webservers -m firewalld -a "service=http permanent=yes state=enabled"
开放特定端口
ansible dbservers -m firewalld -a "port=5432/tcp permanent=yes state=enabled"
添加源IP白名单
ansible all -m firewalld -a "source=192.168.1.0/24 zone=trusted state=enabled"
常用参数
  • service: 服务名称
  • port: 端口/协议
  • source: 源IP/网络
  • zone: 防火墙区域
  • permanent: 是否永久生效
  • state: 状态 (enabled, disabled)

user 模块

管理用户账户,包括创建、修改和删除用户。

命令行示例
参数说明
创建用户
ansible all -m user -a "name=john comment='John Doe' home=/home/john shell=/bin/bash groups=wheel append=yes"
删除用户及其主目录
ansible all -m user -a "name=john state=absent remove=yes"
修改用户属性
ansible webservers -m user -a "name=john shell=/bin/zsh"
常用参数
  • name: 用户名
  • state: 状态 (present, absent)
  • comment: 用户描述
  • home: 主目录路径
  • shell: 登录shell
  • groups: 用户所属组
  • append: 是否追加到现有组
  • remove: 删除用户时是否删除主目录

group 模块

管理用户组。

命令行示例
参数说明
创建用户组
ansible all -m group -a "name=developers state=present"
创建系统组
ansible dbservers -m group -a "name=dbadmin system=yes state=present"
删除用户组
ansible all -m group -a "name=oldgroup state=absent"
常用参数
  • name: 组名称
  • state: 状态 (present, absent)
  • system: 是否为系统组
  • gid: 组ID

lineinfile 模块

确保文件中存在特定行,或修改/替换现有行。

命令行示例
参数说明
确保某行存在
ansible all -m lineinfile -a "path=/etc/ssh/sshd_config line='PermitRootLogin no'"
替换匹配的行
ansible webservers -m lineinfile -a "path=/etc/nginx/nginx.conf regexp='^worker_processes' line='worker_processes 4;'"
在特定位置插入行
ansible all -m lineinfile -a "path=/etc/hosts line='192.168.1.100 server.example.com' insertafter='127.0.0.1'"
常用参数
  • path: 文件路径
  • line: 要确保存在的行
  • regexp: 用于匹配的正则表达式
  • state: 状态 (present, absent)
  • insertafter: 在匹配行之后插入
  • insertbefore: 在匹配行之前插入
  • backup: 是否创建备份

replace 模块

替换文件中匹配正则表达式的所有实例。

命令行示例
参数说明
替换文本
ansible webservers -m replace -a "path=/etc/nginx/nginx.conf regexp='old.server.com' replace='new.server.com'"
使用备份
ansible all -m replace -a "dest=/etc/config.conf regexp='debug=true' replace='debug=false' backup=yes"
常用参数
  • path/dest: 文件路径
  • regexp: 要匹配的正则表达式
  • replace: 替换文本
  • backup: 是否创建备份

setup 模块

收集远程主机的系统信息,是Ansible最重要的模块之一。

命令行示例
参数说明
收集所有系统信息
ansible all -m setup
收集特定信息
ansible webservers -m setup -a "filter=ansible_distribution*"
收集网络信息
ansible all -m setup -a "filter=ansible_default_ipv4"
常用参数
  • filter: 过滤条件,支持通配符
  • gather_subset: 收集信息子集
  • gather_timeout: 收集超时时间
常用过滤器
  • ansible_distribution*: 发行版信息
  • ansible_memory*: 内存信息
  • ansible_processor*: 处理器信息
  • ansible_default_ipv4: 默认IPv4地址

debug 模块

在任务执行期间打印调试信息。

命令行示例
参数说明
打印简单消息
ansible all -m debug -a "msg='系统配置完成'"
打印变量值
ansible webservers -m debug -a "var=ansible_distribution"
常用参数
  • msg: 要打印的消息
  • var: 要打印的变量名
  • verbosity: 详细级别