Ansible 命令及其使用指南

Ansible 是一个强大的自动化工具,用于配置管理、应用部署和任务自动化。以下是一些常见的 Ansible 命令及其使用指南,帮助你更好地管理和自动化你的基础设施。

1. 安装 Ansible

在大多数 Linux 发行版中,你可以使用包管理器来安装 Ansible。例如,在 Ubuntu 上:

sudo apt update
sudo apt install ansible

在 CentOS 上:

sudo yum install epel-release
sudo yum install ansible

2. 检查 Ansible 版本

ansible --version

3. 配置 Ansible

Ansible 的配置文件通常位于 /etc/ansible/ansible.cfg。你可以在这里设置各种配置选项,例如库存文件路径、日志级别等。

4. 创建和管理库存文件

库存文件(Inventory File)定义了你要管理的主机和组。默认的库存文件路径是 /etc/ansible/hosts,但你也可以使用自定义路径。

示例库存文件

# /etc/ansible/hosts
[webservers]
web1.example.com
web2.example.com

[databases]
db1.example.com
db2.example.com

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)

---
- hosts: webservers
become: yes
tasks:
- name: Ensure Apache is installed
yum:
name: httpd
state: present

- name: Ensure Apache is started
service:
name: httpd
state: started
enabled: yes

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.pyaws_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
file:
path: /path/to/directory
state: directory
mode: '0755'

copy

用途:复制文件到远程节点。

- name: Copy file to remote host
copy:
src: /local/path/to/file
dest: /remote/path/to/file
owner: user
group: group
mode: '0644'

template

用途:将 Jinja2 模板文件渲染并复制到远程节点。

- name: Render template to remote host
template:
src: /local/path/to/template.j2
dest: /remote/path/to/file
owner: user
group: group
mode: '0644'

lineinfile

用途:确保一行存在于文件中或替换现有行。

- name: Ensure line is in file
lineinfile:
path: /etc/hosts
line: '127.0.0.1 ansible_host'
state: present

blockinfile

用途:确保一个块存在于文件中或替换现有块。

- name: Ensure block is in file
blockinfile:
path: /etc/hosts
block: |
127.0.0.1 ansible_host
127.0.0.2 another_host
marker: '# {mark} ANSIBLE MANAGED BLOCK'

2. 包管理

yum

用途:管理 Red Hat/CentOS 系统中的软件包。

- name: Install Apache
yum:
name: httpd
state: present

apt

用途:管理 Debian/Ubuntu 系统中的软件包。

- name: Install Apache
apt:
name: apache2
state: present

pip

用途:管理 Python 包。

- name: Install Flask
pip:
name: Flask
state: present

3. 服务管理

service

用途:管理服务的状态(启动、停止、重启等)。

- name: Start Apache service
service:
name: httpd
state: started
enabled: yes

systemd

用途:管理 systemd 服务单元。

- name: Enable and start Apache service
systemd:
name: httpd
state: started
enabled: yes

4. 用户和组管理

user

用途:管理用户账户。

- name: Create user
user:
name: ansible_user
state: present
groups: sudo
shell: /bin/bash

group

用途:管理用户组。

- name: Create group
group:
name: ansible_group
state: present

5. 系统配置

sysctl

用途:管理内核参数。

- name: Set kernel parameter
sysctl:
name: net.ipv4.ip_forward
value: 1
state: present
reload: yes

cron

用途:管理定时任务。

- name: Add cron job
cron:
name: 'Run backup script'
minute: '0'
hour: '2'
job: '/usr/local/bin/backup.sh'

6. 网络配置

netstat

用途:获取网络连接信息。

- name: Get network connections
netstat:
gather_subset: all

iptables

用途:管理 iptables 规则。

- name: Allow port 80
iptables:
chain: INPUT
protocol: tcp
destination_port: 80
jump: ACCEPT
state: present

7. 数据库管理

mysql_user

用途:管理 MySQL 用户。

- name: Create MySQL user
mysql_user:
name: ansible_user
password: secure_password
priv: '*.*:ALL'
state: present

postgresql_db

用途:管理 PostgreSQL 数据库。

- name: Create PostgreSQL database
postgresql_db:
name: ansible_db
state: present

8. 云服务管理

ec2

用途:管理 Amazon EC2 实例。

- name: Launch EC2 instance
ec2:
key_name: my_key
instance_type: t2.micro
image: ami-123456
wait: yes
region: us-west-1
vpc_subnet_id: subnet-123456
security_group: my_security_group
count: 1

azure_rm_virtualmachine

用途:管理 Azure 虚拟机。

- name: Create Azure VM
azure_rm_virtualmachine:
resource_group: myResourceGroup
name: myVM
vm_size: Standard_DS1_v2
admin_username: azureuser
ssh_password_enabled: no
ssh_public_keys:
- path: /home/azureuser/.ssh/authorized_keys
key_data: "{{ lookup('file', '~/.ssh/id_rsa.pub') }}"

9. 其他常用模块

shellcommand

用途:执行 shell 命令。

- name: Run a shell command
shell: echo "Hello, World!" > /tmp/hello.txt
- name: Run a command
command: ls -l /tmp

debug

用途:打印调试信息。

- name: Debug message
debug:
msg: 'This is a debug message'

setup

用途:收集远程主机的事实(facts)。

- name: Gather facts
setup: