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 Nginx
  hosts: webservers  # 指定在哪个主机组上执行任务
  become: yes        # 表示以提升的权限(如sudo)运行任务
  tasks:             # 定义任务列表
    - name: Install Nginx package
      apt:           # 使用apt模块(适用于Debian/Ubuntu)
        name: nginx
        state: present

    - name: Start Nginx service
      service:
        name: nginx
        state: started
        enabled: 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: nginx
    state: present

copy模块:复制本地文件到远程主机。

yaml

复制代码
- name: Copy a configuration file
  copy:
    src: files/myapp.conf
    dest: /etc/myapp.conf
    owner: root
    group: root
    mode: '0644'

template模块:基于Jinja2模板动态生成文件,并复制到远程主机。可以结合变量使用。

复制代码
yaml
- name: Configure Nginx using template
  template:
    src: templates/nginx.conf.j2
    dest: /etc/nginx/nginx.conf

file模块:管理文件和目录的属性,或创建目录。

复制代码
yaml
- name: Ensure directory exists
  file:
    path: /opt/myapp
    state: directory
    mode: '0755'

使用变量:

你可以在Playbook中定义变量,使其更灵活。

复制代码
yaml
- name: Install Nginx with custom version
  hosts: webservers
  become: yes
  vars:
    nginx_version: "1.21"  # 定义变量
  tasks:
    - name: Install Nginx package
      apt:
        name: "nginx={{ nginx_version }}"
        state: present

使用条件判断:

你可以根据条件来决定是否执行某个任务。

复制代码
yaml
- name: Install Nginx (conditionally)
  hosts: webservers
  become: yes
  tasks:
    - name: Install Nginx on Debian family
      apt:
        name: nginx
        state: present
      when: ansible_os_family == "Debian"  # 条件判断

    - name: Install Nginx on RedHat family
      yum:
        name: nginx
        state: present
      when: 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 role
  hosts: webservers
  become: yes
  roles:
    - nginx_role

💎 实战示例:系统更新与重启

最后,我们来看一个稍微复杂一点的Playbook示例,它负责更新服务器所有包并安全重启。

复制代码
yaml
- name: Upgrade all nodes and reboot
  hosts: "{{ variable_hosts }}"  # 使用变量指定主机组,运行时通过 -e 传递
  become: yes
  serial: 1  # 每次只在一台主机上执行,确保服务高可用

  tasks:
    - name: Update and upgrade packages
      apt:
        update_cache: yes
        upgrade: '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 reachable
      wait_for_connection:
        timeout: 300

运行此Playbook(假设你的清单文件中有一个名为 powerful 的主机组):

复制代码
bash
ansible-playbook -i ./inventory.ini -e "variable_hosts=powerful" upgrade_and_reboot.yml

希望这份教程能帮助你顺利踏上Ansible自动化之旅!从简单的Ad-Hoc命令到复杂的Playbook,多练习是关键。

相关推荐
Hy行者勇哥1 天前
用Cursor智能编写Ansible/Terraform脚本,打通CI/CD链路
ci/cd·ansible·terraform
芷栀夏3 天前
飞牛NAS怎么部署Immich?家庭照片自动备份与远程访问教程
服务器·nginx·ansible
悠然南风14 天前
Ansible常见模块总结及LDAP Role 编写与调试
ansible
祺风挽楠23 天前
ansible编辑
网络·ansible
芳心粽伙饭23 天前
Ansible课后作业
ansible
烁34724 天前
Ansible初识
ansible
烁34724 天前
Ansible安装部署调试
ansible
烁34724 天前
Ansible命令
ansible
小义_25 天前
【Ansible】(三)基础配置与连接设置
云原生·ansible
炸炸鱼.1 个月前
Ansible 企业级实战:Playbook 与 Roles 完全指南
网络·ansible