目录
零. 简介
一. 安装
二. 模块介绍
三. 基本使用
零. 简介
Ansible 是一款极其强大且简单易用的开源 IT 自动化工具。
它的主要特点和优势包括:
- 无代理架构:Ansible 不需要在被管理的节点上安装代理程序,而是通过 SSH 协议与目标节点进行通信,这大大降低了部署和维护的复杂性。
- 简单的配置语言:使用 YAML 格式的配置文件,语法简洁易懂,易于学习和编写。
- 强大的模块库:提供了丰富的内置模块,涵盖了系统管理、应用部署、配置管理等众多领域,能够满足各种常见的自动化需求。
- 可扩展性:支持自定义模块和插件的开发,以满足特定的业务需求。
- 幂等性操作:Ansible 的操作具有幂等性,即多次执行相同的任务,其结果始终一致,不会产生意外的副作用。
- 跨平台支持:可以管理多种操作系统,包括 Linux、Windows、Unix 等。
Ansible 通常用于自动化服务器配置、应用部署、软件安装、系统更新、用户管理等一系列重复性的运维任务,能够显著提高工作效率,减少人为错误,保障系统的一致性和稳定性。
一. 安装
以下是在 Linux 系统上安装 Ansible 的一般步骤:
- 安装依赖(在基于 Red Hat 的系统上,如 CentOS 或 RHEL):
sudo yum install epel-release
sudo yum update
在基于 Debian 的系统上,如 Ubuntu:
sudo apt-get update
sudo apt-get install software-properties-common
sudo apt-add-repository --yes --update ppa:ansible/ansible
安装 Ansible:
- 在基于 Red Hat 的系统上:
sudo yum install ansible
- 在基于 Debian 的系统上:
sudo apt-get install ansible
安装完成后,您可以通过以下命令验证 Ansible 是否安装成功:
ansible --version
这将显示 Ansible 的版本信息,表明安装成功。
二. 模块介绍
- command 模块:在远程主机执行命令,这是 Ansible 的默认模块,可忽略
-m
选项。但它不支持$varname
、<
、>
、|
、;&
等,也不支持管道符、重定向符号,并且不具有幂等性。- 基本格式:
ansible <组名/ip> (-m command) -a '命令'
- 常用参数:
chdir
:在远程主机上运行命令前,提前进入指定目录。creates
:判断指定文件是否存在,如果存在,不执行后面的操作。removes
:判断指定文件是否存在,如果存在,执行后面的操作。
- 示例:
- 指定组或 IP 执行命令:
ansible 192.168.2.102 -a 'date'
或ansible webservers -a 'date'
- 使用
chdir
参数:ansible all -m command -a "chdir=/home ls./"
- 使用
creates
参数:ansible all -m command -a "creates=/opt/test.txt ls./"
- 使用
removes
参数:ansible all -m command -a "removes=/opt/test.txt ls./"
- 指定组或 IP 执行命令:
- 基本格式:
- shell 模块:和 command 模块类似,用于在远程主机执行命令,相当于调用远程主机的 shell 进程,然后在该 shell 下打开一个子 shell 运行命令。此模块支持管道符号等功能,但也不具有幂等性。
- 基本格式:
ansible <组/ip/all> -m shell -a '命令'
- 基本格式:
- cron 模块:用于管理远程主机上的定时任务。
- 常用参数:
minute
:分钟字段,取值范围 0-59。hour
:小时字段,取值范围 0-23。day
:日期字段,取值范围 1-31。month
:月份字段,取值范围 1-12。weekday
:星期字段,取值范围 0-6(0 表示星期日)。job
:要执行的任务或命令。name
:定时任务的名称。state
:状态,可选值为present
(添加或更新定时任务)、absent
(删除定时任务)。
- 示例:添加一个每天凌晨 2 点执行的备份任务,任务名为
daily_backup
:ansible hosts -m cron -a "minute=0 hour=2 job='/usr/local/bin/backup.sh' name=daily_backup state=present"
- 常用参数:
- user 模块:用于管理远程主机上的用户。
- 常用参数:
name
:用户名。password
:用户密码(需加密)。state
:状态,可选值为present
(创建或确保用户存在)、absent
(删除用户)。system
:是否为系统用户。uid
:用户 ID。group
:用户所属的主组。groups
:用户所属的附加组列表。
- 示例:创建一个名为
testuser
的用户,密码为pass123
,主组为users
,附加组为admins
:ansible hosts -m user -a "name=testuser password='$6$salt$encrypted_password' state=present group=users groups=admins"
- 常用参数:
- group 模块:用于管理远程主机上的用户组。
- 常用参数:
name
:组名。state
:状态,可选值为present
(创建或确保组存在)、absent
(删除组)。gid
:组 ID。
- 示例:创建一个名为
testgroup
的组:ansible hosts -m group -a "name=testgroup state=present"
- 常用参数:
- copy 模块:用于将本地文件复制到远程主机。
- 常用参数:
src
:本地源文件路径。dest
:远程目标文件路径。backup
:在覆盖之前,是否将源文件备份,备份文件包含时间信息,可选值为yes
或no
。content
:用于替代src
,可以直接设定指定文件的值。
- 示例:将本地的
/etc/hosts
文件复制到远程主机的/tmp/hosts
位置:ansible hosts -m copy -a "src=/etc/hosts dest=/tmp/hosts"
- 常用参数:
- file 模块:用于设置文件的属性。
- 常用参数:
path
:文件或目录的路径。state
:状态,可选值包括directory
(创建目录)、file
(创建文件)、link
(创建符号链接)、hard
(创建硬链接)、absent
(删除文件或目录)。owner
:文件或目录的所有者。group
:文件或目录的所属组。mode
:文件或目录的权限,例如0644
。
- 示例:创建一个目录:
ansible hosts -m file -a "path=/tmp/testdir state=directory"
- 常用参数:
- hostname 模块:用于设置远程主机的主机名。
- 示例:将远程主机的主机名设置为
new_hostname
:ansible hosts -m hostname -a "name=new_hostname"
- 示例:将远程主机的主机名设置为
- ping 模块:用于测试与远程主机的连通性。
- 示例:
ansible hosts -m ping
- 示例:
- yum/apt 模块:用于在基于 Yum(如 CentOS、RedHat)或 Apt(如 Debian、Ubuntu)的系统上安装、更新或删除软件包。
- 常用参数:
name
:软件包名称。state
:状态,可选值为present
(安装)、latest
(安装最新版本)、absent
(删除)。
- 示例:使用 Yum 安装 Nginx:
ansible hosts -m yum -a "name=nginx state=present"
- 常用参数:
- service/systemd 模块:用于管理远程主机上的服务。
- 常用参数:
name
:服务名称。state
:状态,可选值为started
(启动服务)、stopped
(停止服务)、restarted
(重启服务)、reloaded
(重新加载服务配置)。
- 示例:启动 Nginx 服务:
ansible hosts -m service -a "name=nginx state=started"
- 常用参数:
- script 模块:用于在远程主机上执行本地的脚本。
- 示例:执行本地的
/path/to/local_script.sh
脚本:ansible hosts -m script -a "/path/to/local_script.sh"
- 示例:执行本地的
- mount 模块:用于管理远程主机上的挂载点。
- 常用参数:
name
:挂载点路径。src
:设备或文件系统的源路径。opts
:挂载选项。state
:状态,可选值为mounted
(挂载)、unmounted
(卸载)。
- 示例:挂载一个设备到
/mnt/data
:ansible hosts -m mount -a "name=/mnt/data src=/dev/sdb1 opts=defaults state=mounted"
- 常用参数:
- archive 模块:用于创建归档文件(如 tar 包)。
- 常用参数:
path
:要归档的文件或目录路径。dest
:归档文件的目标路径。format
:归档格式,如tar
、zip
等。
- 示例:将
/data
目录打包成/tmp/data.tar
:ansible hosts -m archive -a "path=/data dest=/tmp/data.tar format=tar"
- 常用参数:
- unarchive 模块:用于解压归档文件。
- 常用参数与 archive 模块类似,需要指定
src
为归档文件的路径,以及解压的dest
目录。 - 示例:解压
/tmp/data.tar
到/opt
目录:ansible hosts -m unarchive -a "src=/tmp/data.tar dest=/opt"
- 常用参数与 archive 模块类似,需要指定
- replace 模块:用于在文件中替换字符串。
三. 基本使用
以下是 Ansible 的基本使用步骤:
- 配置主机清单(Inventory):
- 在
/etc/ansible/hosts
文件中添加要管理的主机信息,可以按照组来划分主机。例如:
- 在
[webservers]
server1
server2
[dbservers]
db1
db2
- 创建 Ansible 剧本(Playbook):
- 使用 YAML 格式创建一个剧本文件,例如
deploy.yml
。以下是一个简单的示例,用于在目标主机上安装 Nginx 服务:
- 使用 YAML 格式创建一个剧本文件,例如
---
- hosts: webservers
tasks:
- name: Install Nginx
yum:
name: nginx
state: present
- 运行剧本:
- 使用以下命令运行剧本:
ansible-playbook deploy.yml
在运行命令后,Ansible 将连接到指定的主机,并按照剧本中的任务进行操作。
您还可以使用 Ansible 的模块进行各种其他操作,如文件管理、用户管理、服务管理等。可以通过 ansible-doc -l
查看可用的模块列表,通过 ansible-doc 模块名
查看特定模块的详细用法。