ansible使用教程
ansible使用教程
Ansible是一款强大的开源自动化运维工具,凭借其无代理(Agentless)架构和简洁的YAML语法,可以帮助我们高效地完成配置管理、应用部署、任务自动化等工作。下面我将带你从基础概念到实战,快速上手Ansible。
🎯 Ansible 核心概念
理解以下几个核心概念,能帮你更好地使用Ansible:
- 控制节点:安装并运行Ansible的机器。
- 受管节点:被Ansible管理的机器。
- 主机清单:一个文件(通常是INI或YAML格式),里面定义了你的受管节点信息,还可以对主机进行分组。
- 模块:Ansible执行任务的单元。每个模块都是一个独立的脚本,用于完成特定任务,如安装软件、管理服务、拷贝文件等。
- Playbook:一个用YAML语言编写的文件,它描述了一系列自动化任务(“plays"和"tasks”)。Playbook是Ansible自动化能力的核心,允许你定义复杂的多机工作流。
为了让你对Ansible的核心工作流程有个直观的印象,可以参考下面的序列图,它展示了一个典型的Playbook任务执行过程:
🛠️ 安装与环境准备
1. 安装Ansible
在控制节点上(通常是你的本地机器或一台专门的服务器),根据你的操作系统,选择以下命令之一安装Ansible:
Ubuntu/Debian:
bash
sudo apt update
sudo apt install ansible -y
CentOS/Fedora:bash
sudo yum install ansible
使用pip安装(跨平台):
bash
pip install ansible
配置SSH免密登录
Ansible主要通过SSH协议与受管节点通信。为了让Ansible能无缝连接受管节点,建议设置SSH密钥认证。
在控制节点上生成SSH密钥对(如果还没有):
bash
ssh-keygen -t rsa -b 4096
将公钥拷贝到受管节点(将 username@remote_host 替换为你的实际用户名和主机名/IP):
bash
ssh-copy-id username@remote_host
📝 编写主机清单
主机清单文件告诉Ansible需要管理哪些服务器。
创建清单文件:你可以创建一个自定义的清单文件,例如 hosts.ini。
编辑清单内容:按以下示例格式添加主机和分组:
ini
[webservers]
web1 ansible_host=192.168.1.101
web2 ansible_host=192.168.1.102[databases]
db1 ansible_host=192.168.1.103
db2 ansible_host=192.168.1.104
方括号 [] 内的名称代表一个主机组,方便你按组操作主机。
🚀 运行你的第一个Ansible命令
安装好Ansible并配置好清单后,你可以先运行一个简单的Ad-Hoc命令来测试连通性。
使用 ping 模块检查所有受管节点的连通性:
bash
ansible all -i hosts.ini -m ping
-
all: 目标主机,这里代表清单中的所有主机。
-
-i hosts.ini: 指定使用的清单文件。
-
-m ping: 使用 ping 模块(Ansible的ping模块用于测试连接性和受管节点的Python环境是否正常)。
如果遇到SSH连接问题,可以暂时禁用主机密钥检查(注意这有安全风险,仅用于测试):
bash
export ANSIBLE_HOST_KEY_CHECKING=False
📜 编写你的第一个Playbook
Playbook是Ansible自动化的核心。我们来创建一个简单的Playbook,用于在 webservers 组的主机上安装并启动Nginx。
创建Playbook文件:创建一个名为 install_nginx.yml 的文件。
编辑内容:
yaml
- name: Install and start Nginxhosts: webservers # 指定在哪个主机组上执行任务become: yes # 表示以提升的权限(如sudo)运行任务tasks: # 定义任务列表- name: Install Nginx packageapt: # 使用apt模块(适用于Debian/Ubuntu)name: nginxstate: present- name: Start Nginx serviceservice:name: nginxstate: startedenabled: yes # 设置服务开机自启
Playbook YAML语法要点:
-
文件以 — 开始(可选的YAML文档开始标记)。
-
name: 用于描述Play或Task的目的,提高可读性。
-
hosts: 指定目标主机或主机组。
-
become: yes 表示需要提权执行。
-
tasks: 下面是具体任务列表。
-
模块参数通常以 key=value 形式传递。缩进和对齐非常重要。
运行Playbook:
bash
ansible-playbook -i hosts.ini install_nginx.yml
🔧 常用模块与Playbook技巧
掌握以下模块和技巧,能让你的Playbook更强大和灵活。
常用模块示例:
package模块:通用包管理模块,可自动选择yum或apt。
yaml
- name: Ensure nginx is installed (using generic package module)package:name: nginxstate: present
copy模块:复制本地文件到远程主机。
yaml
- name: Copy a configuration filecopy:src: files/myapp.confdest: /etc/myapp.confowner: rootgroup: rootmode: '0644'
template模块:基于Jinja2模板动态生成文件,并复制到远程主机。可以结合变量使用。
yaml
- name: Configure Nginx using templatetemplate:src: templates/nginx.conf.j2dest: /etc/nginx/nginx.conf
file模块:管理文件和目录的属性,或创建目录。
yaml
- name: Ensure directory existsfile:path: /opt/myappstate: directorymode: '0755'
使用变量:
你可以在Playbook中定义变量,使其更灵活。
yaml
- name: Install Nginx with custom versionhosts: webserversbecome: yesvars:nginx_version: "1.21" # 定义变量tasks:- name: Install Nginx packageapt:name: "nginx={{ nginx_version }}"state: present
使用条件判断:
你可以根据条件来决定是否执行某个任务。
yaml
- name: Install Nginx (conditionally)hosts: webserversbecome: yestasks:- name: Install Nginx on Debian familyapt:name: nginxstate: presentwhen: ansible_os_family == "Debian" # 条件判断- name: Install Nginx on RedHat familyyum:name: nginxstate: presentwhen: ansible_os_family == "RedHat"
🗂️ 使用角色组织Playbook
当Playbook变得越来越复杂时,可以使用角色来组织任务、变量、文件、模板等,实现代码的复用和模块化。
创建角色结构:
使用 ansible-galaxy init 命令创建一个标准的角色目录结构。
bash
ansible-galaxy init nginx_role
这会创建一个名为 nginx_role 的目录,里面包含 tasks, vars, files, templates, handlers 等子目录。
在Playbook中使用角色:
创建好角色后,你可以在Playbook中通过 roles 关键字来使用它。
yaml
- name: Install and configure Nginx using rolehosts: webserversbecome: yesroles:- nginx_role
💎 实战示例:系统更新与重启
最后,我们来看一个稍微复杂一点的Playbook示例,它负责更新服务器所有包并安全重启。
yaml
- name: Upgrade all nodes and reboothosts: "{{ variable_hosts }}" # 使用变量指定主机组,运行时通过 -e 传递become: yesserial: 1 # 每次只在一台主机上执行,确保服务高可用tasks:- name: Update and upgrade packagesapt:update_cache: yesupgrade: 'yes'- name: Reboot the machine (wait for it to come back)reboot:reboot_timeout: 300 # 重启后等待节点恢复在线的超时时间pre_reboot_delay: 60 # 执行重启任务前的等待时间- name: Wait for system to become reachablewait_for_connection:timeout: 300
运行此Playbook(假设你的清单文件中有一个名为 powerful 的主机组):
bash
ansible-playbook -i ./inventory.ini -e "variable_hosts=powerful" upgrade_and_reboot.yml
希望这份教程能帮助你顺利踏上Ansible自动化之旅!从简单的Ad-Hoc命令到复杂的Playbook,多练习是关键。
