Ansible 是一个强大的自动化工具,用于配置管理、应用部署和任务自动化。以下是一些常见的 Ansible 命令及其使用指南,帮助你更好地管理和自动化你的基础设施。
1. 安装 Ansible
在大多数 Linux 发行版中,你可以使用包管理器来安装 Ansible。例如,在 Ubuntu 上:
sudo apt update |
在 CentOS 上:
sudo yum install epel-release |
2. 检查 Ansible 版本
ansible --version |
3. 配置 Ansible
Ansible 的配置文件通常位于 /etc/ansible/ansible.cfg
。你可以在这里设置各种配置选项,例如库存文件路径、日志级别等。
4. 创建和管理库存文件
库存文件(Inventory File)定义了你要管理的主机和组。默认的库存文件路径是 /etc/ansible/hosts
,但你也可以使用自定义路径。
示例库存文件
# /etc/ansible/hosts |
5. 测试连接
使用 ansible
命令测试与主机的连接:
ansible all -m ping |
这会向所有主机发送一个 ping
模块,检查它们是否可以被 Ansible 管理。
6. 运行 Ad-Hoc 命令
Ad-Hoc 命令是临时性的命令,用于快速执行任务。
示例:在所有主机上安装 Apache
ansible all -m yum -a "name=httpd state=present" |
示例:在所有主机上启动 Apache 服务
ansible all -m service -a "name=httpd state=started" |
7. 运行 Playbook
Playbook 是 YAML 文件,定义了一系列的任务和配置。使用 ansible-playbook
命令来运行 Playbook。
示例 Playbook (site.yml
)
|
become 代表是否提升权限,默认提升到 root 用户。tasks 可以串联地执行多个任务。而 yum 和 service 分别是两个模块的名称。
运行 Playbook
ansible-playbook site.yml |
由于 Playbook 的方式要比 Ad-Hoc 方式更加直观地展示模块的功能,接下来的例子都会使用 Playbook。
8. 查看和管理模块
Ansible 提供了大量的模块,用于执行各种任务。你可以使用以下命令查看可用模块:
ansible-doc -l |
查看特定模块的详细信息:
ansible-doc yum |
9. 使用 Vault 加密敏感信息
Ansible Vault 用于加密敏感信息,如密码和密钥。
创建加密文件
ansible-vault create secrets.yml |
编辑加密文件
ansible-vault edit secrets.yml |
运行 Playbook 时解密
ansible-playbook site.yml --ask-vault-pass |
10. 使用动态库存
动态库存脚本可以从外部数据源(如 AWS、OpenStack 等)动态生成库存文件。
示例:使用 AWS 动态库存
安装 boto
库:
pip install boto |
创建 aws_ec2.py
和 aws_ec2.ini
文件,然后在 Playbook 中指定动态库存:
ansible-playbook site.yml -i aws_ec2.py |
11. 查看和管理主机状态
使用 setup
模块查看主机的状态和变量:
ansible all -m setup |
12. 调试 Playbook
使用 -vvv
选项增加输出的详细程度,帮助调试 Playbook:
ansible-playbook site.yml -vvv |
13. 限制 Playbook 的执行范围
使用 --limit
选项限制 Playbook 的执行范围:
ansible-playbook site.yml --limit web1.example.com |
14. 检查 Playbook 的语法
使用 --syntax-check
选项检查 Playbook 的语法:
ansible-playbook site.yml --syntax-check |
15. 并行执行任务
使用 --forks
选项指定并行执行任务的数量:
ansible-playbook site.yml --forks 10 |
Ansible 提供了大量内置模块,用于执行各种任务,从简单的文件操作到复杂的系统配置。以下是一些常用的 Ansible 模块及其功能介绍:
1. 文件和目录操作
file
用途:管理文件、目录和符号链接的状态。
- name: Ensure directory exists |
copy
用途:复制文件到远程节点。
- name: Copy file to remote host |
template
用途:将 Jinja2 模板文件渲染并复制到远程节点。
- name: Render template to remote host |
lineinfile
用途:确保一行存在于文件中或替换现有行。
- name: Ensure line is in file |
blockinfile
用途:确保一个块存在于文件中或替换现有块。
- name: Ensure block is in file |
2. 包管理
yum
用途:管理 Red Hat/CentOS 系统中的软件包。
- name: Install Apache |
apt
用途:管理 Debian/Ubuntu 系统中的软件包。
- name: Install Apache |
pip
用途:管理 Python 包。
- name: Install Flask |
3. 服务管理
service
用途:管理服务的状态(启动、停止、重启等)。
- name: Start Apache service |
systemd
用途:管理 systemd 服务单元。
- name: Enable and start Apache service |
4. 用户和组管理
user
用途:管理用户账户。
- name: Create user |
group
用途:管理用户组。
- name: Create group |
5. 系统配置
sysctl
用途:管理内核参数。
- name: Set kernel parameter |
cron
用途:管理定时任务。
- name: Add cron job |
6. 网络配置
netstat
用途:获取网络连接信息。
- name: Get network connections |
iptables
用途:管理 iptables 规则。
- name: Allow port 80 |
7. 数据库管理
mysql_user
用途:管理 MySQL 用户。
- name: Create MySQL user |
postgresql_db
用途:管理 PostgreSQL 数据库。
- name: Create PostgreSQL database |
8. 云服务管理
ec2
用途:管理 Amazon EC2 实例。
- name: Launch EC2 instance |
azure_rm_virtualmachine
用途:管理 Azure 虚拟机。
- name: Create Azure VM |
9. 其他常用模块
shell
和 command
用途:执行 shell 命令。
- name: Run a shell command |
- name: Run a command |
debug
用途:打印调试信息。
- name: Debug message |
setup
用途:收集远程主机的事实(facts)。
- name: Gather facts |