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,多练习是关键。

相关推荐
凡间客1 天前
Ansible安装与入门
linux·运维·ansible
LoneEon1 天前
告别手动操作:用 Ansible 统一管理你的 Ubuntu 服务器集群
运维·服务器·ansible
Empty_7771 天前
Ansible之Playbook简单应用
网络·ansible
小任今晚几点睡1 天前
Ansible 基础配置与负载均衡部署实践
运维·自动化·ansible·负载均衡
一条懒鱼6662 天前
Ansible之Playbook简单应用
网络·ansible
Lynnxiaowen3 天前
今天我们开始学习ansible之playbook的简单运用
linux·运维·学习·云计算·ansible
初学者_xuan3 天前
零基础新手小白快速了解掌握服务集群与自动化运维(十八)Ansible自动化模块--安装与入门
运维·自动化·ansible
Empty_7773 天前
Ansible进行Nginx编译安装的详细步骤
linux·nginx·ansible
Lynnxiaowen4 天前
今天我们开始学习Linux自动化运维Ansible基础
linux·运维·学习·自动化·云计算·ansible