Ansible基础入门

基础介绍

Ansible 是一个开源的自动化工具,用于配置管理、应用部署、任务执行和 IT 编排。它通过定义简单的配置文件,帮助系统管理员和开发人员在多台服务器上自动化重复性任务,从而提高工作效率。

Ansible 的主要特点

  1. 无代理(Agentless)

    Ansible 不需要在目标主机上安装任何代理程序。它通过 SSH 连接到目标主机,执行任务,这使得它非常轻量级和易于维护。

  2. 易于学习和使用

    Ansible 使用 YAML(Yet Another Markup Language)编写剧本(Playbooks),这种语言简单易读,降低了学习曲线。

  3. 可扩展性强

    Ansible 拥有丰富的模块库,支持各种系统和服务的管理。同时,用户还可以编写自定义模块来扩展其功能。

  4. Idempotent 性

    Ansible 确保无论剧本运行多少次,目标系统的最终状态都是一致的,即幂等性。

Ansible 的主要组件

  1. 控制节点(Control Node)

    Ansible 的运行所在的机器。控制节点发出指令,通过 SSH 连接到目标主机执行任务。

  2. 被管理节点(Managed Nodes)

    需要被管理和配置的目标主机。

  3. 库存(Inventory)

    一个定义了所有被管理节点的文件。库存文件通常是一个简单的 INI 文件,也可以是动态生成的。

  4. 模块(Modules)

    Ansible 的工作单元,执行特定任务的脚本。模块可以管理文件、安装软件包、执行命令等。

  5. 剧本(Playbooks)

    Ansible 的配置、部署和编排的文件,使用 YAML 编写。剧本由一个或多个剧本(Play)组成,每个剧本定义了在一组主机上执行的任务。

  6. 角色(Roles)

    角色是剧本的一种组织方式,用于将任务、变量和文件结构化。角色使得剧本更易读、可维护和可重用。

Ansible 的基本结构

1. 库存文件(Inventory)

库存文件定义了 Ansible 管理的主机和主机组:

ini复制代码

复制代码
# 文件名:inventory.ini
[webservers]
web1.example.com
web2.example.com

[databases]
db1.example.com
2. 剧本文件(Playbooks)

剧本使用 YAML 编写,定义了在目标主机上执行的任务:

yaml复制代码

复制代码
# 文件名:site.yml
- hosts: webservers
  become: yes
  tasks:
    - name: 安装 Nginx
      apt:
        name: nginx
        state: present
    - name: 确保 Nginx 服务正在运行
      service:
        name: nginx
        state: started
        enabled: yes
3. 运行 Ansible 剧本

使用 ansible-playbook 命令运行剧本:

sh复制代码

复制代码
ansible-playbook -i inventory.ini site.yml

常用命令

  • ansible:用于执行单个模块命令。

    sh复制代码

    复制代码
    ansible all -i inventory.ini -m ping
  • ansible-playbook:用于运行剧本。

    sh复制代码

    复制代码
    ansible-playbook -i inventory.ini site.yml

示例

假设我们希望在一组服务器上安装和配置 Apache HTTP Server,可以使用以下步骤:

1. 创建库存文件

ini复制代码

复制代码
# 文件名:inventory.ini
[webservers]
web1.example.com
web2.example.com
2. 创建剧本文件

yaml复制代码

复制代码
# 文件名:apache.yml
- hosts: webservers
  become: yes
  tasks:
    - name: 安装 Apache
      apt:
        name: apache2
        state: present

    - name: 确保 Apache 服务正在运行
      service:
        name: apache2
        state: started
        enabled: yes
3. 运行剧本

sh复制代码

复制代码
ansible-playbook -i inventory.ini apache.yml

通过上述步骤,Ansible 将连接到 web1.example.comweb2.example.com,安装并配置 Apache HTTP Server。

总结

Ansible 是一个强大且易于使用的自动化工具,适合在各种规模的 IT 环境中执行配置管理、应用部署和任务自动化。通过掌握 Ansible,可以大大提高 IT 运维的效率和可靠性。


Adhoc

Ansible 的 ad-hoc 命令是一种快速、临时执行任务的方式,无需编写完整的 Playbook。它适用于执行一次性任务、进行快速测试或在多台主机上同步执行简单命令。这种方法非常灵活,能够利用 Ansible 的模块库来完成各种任务。

Ansible ad-hoc 命令的基本语法

sh复制代码

复制代码
ansible [pattern] -i [inventory] -m [module] -a "[module options]" [--become]
  • pattern:指定要操作的主机或主机组的模式。
  • -i:指定库存文件的位置。
  • -m:指定要使用的模块(例如 ping, shell, copy 等)。
  • -a:指定模块的参数。
  • --become:使用 sudo 提权执行命令(需要适当的权限配置)。

常用示例

1. 测试连接

使用 ping 模块测试与目标主机的连接:

sh复制代码

复制代码
ansible all -i inventory.ini -m ping

如果连接成功,目标主机会返回 pong

2. 执行 Shell 命令

使用 shell 模块在目标主机上执行指定的 Shell 命令:

sh复制代码

复制代码
ansible all -i inventory.ini -m shell -a "uptime"

这将返回每个主机的系统正常运行时间。

3. 管理包

使用 apt 模块在 Debian 系列的系统上安装或卸载软件包:

sh复制代码

复制代码
ansible webservers -i inventory.ini -m apt -a "name=nginx state=present" --become

这将在 webservers 组中的所有主机上安装 nginx--become 选项使命令以 sudo 权限执行。

4. 管理服务

使用 service 模块启动、停止或重启服务:

sh复制代码

复制代码
ansible webservers -i inventory.ini -m service -a "name=nginx state=started" --become

这将在 webservers 组中的所有主机上启动 nginx 服务。

5. 复制文件

使用 copy 模块将文件从控制节点复制到目标主机:

sh复制代码

复制代码
ansible webservers -i inventory.ini -m copy -a "src=/path/to/local/file dest=/path/to/remote/file" --become

这将在 webservers 组中的所有主机上将本地文件 /path/to/local/file 复制到远程 /path/to/remote/file

6. 获取远程主机信息

使用 setup 模块收集远程主机的详细信息:

sh复制代码

复制代码
ansible all -i inventory.ini -m setup

这将返回所有主机的详细信息,包括操作系统、网络接口、磁盘、内存等。

复杂任务

虽然 ad-hoc 命令非常适合执行简单和一次性任务,但对于更复杂的任务和配置管理,建议使用 Playbook。Playbook 提供了更强的结构化和复用能力,使得复杂任务的管理更加简单和清晰。

总结

Ansible ad-hoc 命令是 Ansible 的一种强大功能,适用于快速执行临时任务和进行系统检查。它提供了一种简单而灵活的方式来管理和配置服务器,但对于更复杂和重复性的任务,建议使用 Playbook 进行管理。通过 ad-hoc 命令,你可以迅速了解 Ansible 的工作原理,并在需要时快速执行任务。


Playbook介绍

Ansible Playbook 是 Ansible 的核心功能之一,用于定义和编排复杂的自动化任务。Playbook 使用 YAML(Yet Another Markup Language)编写,结构化地定义了要在受管主机上执行的一系列操作。通过 Playbook,用户可以描述多步骤的工作流,并确保这些任务按预期的顺序执行。

Playbook 的基本结构

一个 Ansible Playbook 由一个或多个 "plays" 组成。每一个 play 定义了一组主机和在这些主机上要执行的任务。以下是一个基本的 Playbook 的示例:

yaml复制代码

复制代码
---
- name: 部署和配置 Web 服务器
  hosts: webservers
  become: yes

  tasks:
    - name: 安装 Nginx
      apt:
        name: nginx
        state: present

    - name: 确保 Nginx 服务正在运行
      service:
        name: nginx
        state: started
        enabled: yes

    - name: 复制配置文件
      copy:
        src: ./nginx.conf
        dest: /etc/nginx/nginx.conf
        notify:
          - 重启 Nginx

  handlers:
    - name: 重启 Nginx
      service:
        name: nginx
        state: restarted

Playbook 的组件

  1. Play

    • 每个 play 定义了要在一组主机上执行的一组任务。
    • 关键字段包括 name(描述性名称)、hosts(目标主机组)、become(是否使用 sudo 提权)等。
  2. Tasks

    • 任务列表,定义了在目标主机上要执行的操作。
    • 每个任务有一个描述性名称(name)和一个模块(如 apt, service, copy 等)。
    • 可以通过 handlers 触发事件。
  3. Handlers

    • 事件处理器,在任务完成后触发特定动作(如重启服务)。
    • 只有在被通知的情况下才会执行。
  4. Variables

    • Playbook 可以定义变量,以便在多个任务中复用。
    • 变量可以在 Playbook 内部定义,也可以从外部文件或命令行传递。

常见模块

以下是一些常用的 Ansible 模块示例:

  • apt/yum:用于安装或卸载软件包。

    yaml复制代码

    复制代码
    - name: 安装 Nginx
      apt:
        name: nginx
        state: present
  • service:管理系统服务。

    yaml复制代码

    复制代码
    - name: 启动 Nginx 服务
      service:
        name: nginx
        state: started
        enabled: yes
  • copy:复制文件到远程主机。

    yaml复制代码

    复制代码
    - name: 复制 Nginx 配置文件
      copy:
        src: ./nginx.conf
        dest: /etc/nginx/nginx.conf
  • user:管理用户和组。

    yaml复制代码

    复制代码
    - name: 创建用户
      user:
        name: johndoe
        state: present
  • file:管理文件和目录权限、所有权等。

    yaml复制代码

    复制代码
    - name: 创建目录
      file:
        path: /var/www/html
        state: directory
        owner: www-data
        group: www-data
        mode: '0755'

运行 Playbook

使用 ansible-playbook 命令运行 Playbook:

sh复制代码

复制代码
ansible-playbook -i inventory.ini site.yml
  • -i inventory.ini:指定库存文件。
  • site.yml:要运行的 Playbook 文件。

示例:LAMP 堆栈部署

以下是一个简单的 LAMP(Linux, Apache, MySQL, PHP)堆栈部署 Playbook 示例:

yaml复制代码

复制代码
---
- name: 部署 LAMP 堆栈
  hosts: webservers
  become: yes

  tasks:
    - name: 安装 Apache
      apt:
        name: apache2
        state: present

    - name: 安装 MySQL
      apt:
        name: mysql-server
        state: present

    - name: 安装 PHP
      apt:
        name: php
        state: present

    - name: 安装 PHP MySQL 扩展
      apt:
        name: php-mysql
        state: present

    - name: 启动 Apache 服务
      service:
        name: apache2
        state: started
        enabled: yes

    - name: 启动 MySQL 服务
      service:
        name: mysql
        state: started
        enabled: yes

    - name: 创建 MySQL 数据库
      mysql_db:
        name: mydatabase
        state: present

    - name: 创建 MySQL 用户
      mysql_user:
        name: myuser
        password: mypassword
        priv: 'mydatabase.*:ALL'
        state: present

总结

Ansible Playbook 是一种强大且灵活的工具,适用于配置管理、应用程序部署和任务自动化。通过 Playbook,你可以定义复杂的操作和工作流,并确保它们能够在多个主机上按预期顺序执行。掌握 Ansible Playbook 的基本结构和常用模块,将帮助你更高效地管理和自动化你的 IT 环境。


Role介绍

Ansible Role 是一种组织和结构化 Ansible Playbook 内容的方式,使得 Playbook 更加模块化、可重用和易于维护。Roles 提供了一种将任务、变量、处理程序、文件、模板和其他文件清晰地分组的方法。通过使用 Roles,可以更好地管理复杂的自动化任务,并实现代码复用。

角色(Role)的基本结构

每个角色都有一个特定的目录结构,包含了不同类型的资源。以下是一个典型的角色目录结构:

复制代码

复制代码
roles/
  ├── role_name/
  │   ├── tasks/
  │   │   └── main.yml
  │   ├── handlers/
  │   │   └── main.yml
  │   ├── templates/
  │   │   └── template_file.j2
  │   ├── files/
  │   │   └── file_name
  │   ├── vars/
  │   │   └── main.yml
  │   ├── defaults/
  │   │   └── main.yml
  │   ├── meta/
  │   │   └── main.yml
  │   └── README.md

目录结构说明

  • tasks/main.yml:定义角色的主要任务。
  • handlers/main.yml:定义任务完成后要触发的处理程序。
  • templates/:存放 Jinja2 模板文件。
  • files/:存放要复制到远程主机的文件。
  • vars/main.yml:定义与角色相关的变量。
  • defaults/main.yml:定义角色的默认变量,优先级低于 vars
  • meta/main.yml:包含角色的元数据,如依赖关系。

创建和使用角色

1. 创建角色

可以手动创建角色目录结构,也可以使用 Ansible 提供的命令来自动生成:

sh复制代码

复制代码
ansible-galaxy init role_name
2. 定义角色内容

以一个简单的 Nginx 角色为例:

目录结构:

复制代码

复制代码
roles/
  └── nginx/
      ├── tasks/
      │   └── main.yml
      ├── handlers/
      │   └── main.yml
      ├── templates/
      │   └── nginx.conf.j2
      ├── files/
      ├── vars/
      │   └── main.yml
      ├── defaults/
      │   └── main.yml
      ├── meta/
      │   └── main.yml

tasks/main.yml:

yaml复制代码

复制代码
---
- name: 安装 Nginx
  apt:
    name: nginx
    state: present

- name: 复制 Nginx 配置文件
  template:
    src: nginx.conf.j2
    dest: /etc/nginx/nginx.conf
  notify:
    - 重启 Nginx

- name: 启动 Nginx 服务
  service:
    name: nginx
    state: started
    enabled: yes

handlers/main.yml:

yaml复制代码

复制代码
---
- name: 重启 Nginx
  service:
    name: nginx
    state: restarted

templates/nginx.conf.j2:

nginx复制代码

复制代码
server {
    listen 80;
    server_name {{ server_name }};
    root {{ nginx_root }};
    index index.html index.htm;

    location / {
        try_files $uri $uri/ =404;
    }
}

vars/main.yml:

yaml复制代码

复制代码
---
server_name: example.com
nginx_root: /var/www/html
3. 使用角色

在 Playbook 中引用角色:

site.yml:

yaml复制代码

复制代码
---
- hosts: webservers
  become: yes
  roles:
    - nginx

运行 Playbook

使用 ansible-playbook 命令运行包含角色的 Playbook:

sh复制代码

复制代码
ansible-playbook -i inventory.ini site.yml

角色的依赖关系

可以在角色的 meta/main.yml 文件中定义依赖关系。例如,如果你的角色依赖于另一个角色,你可以这样定义:

yaml复制代码

复制代码
---
dependencies:
  - role: common
  - role: database

总结

Ansible Roles 提供了一种模块化和组织化管理 Ansible Playbooks 内容的方式,使得 Playbooks 更加清晰、可维护和可重用。通过定义角色,可以将复杂的自动化任务分解为多个独立的模块,每个模块专注于特定的功能。这种方法不仅提高了代码的复用性,还使得团队协作和维护变得更加容易。掌握 Ansible Roles 的使用,将极大提升你在自动化管理方面的效率和能力。


常用模块介绍

Ansible 提供了丰富的模块库,用于处理各种类型的自动化任务。以下是一些常用的 Ansible 模块及其用法介绍,同时也包括如何查询和使用这些模块的方法。

1. ping

用于测试与目标主机的连接。

yaml复制代码

复制代码
- name: 测试连接
  hosts: all
  tasks:
    - name: 测试 ping
      ping:
2. shell

在远程主机上执行 Shell 命令。

yaml复制代码

复制代码
- name: 执行 Shell 命令
  hosts: all
  tasks:
    - name: 运行 uptime 命令
      shell: uptime
3. command

shell 模块类似,但更适合执行简单命令且不执行 Shell 解释。

yaml复制代码

复制代码
- name: 执行命令
  hosts: all
  tasks:
    - name: 运行 ls 命令
      command: ls
4. copy

复制文件到远程主机。

yaml复制代码

复制代码
- name: 复制文件
  hosts: all
  tasks:
    - name: 复制本地文件到远程主机
      copy:
        src: /path/to/local/file
        dest: /path/to/remote/file
5. template

使用 Jinja2 模板生成文件。

yaml复制代码

复制代码
- name: 使用模板
  hosts: all
  tasks:
    - name: 生成配置文件
      template:
        src: /path/to/template.j2
        dest: /path/to/remote/file
6. file

管理文件和目录的属性。

yaml复制代码

复制代码
- name: 管理文件属性
  hosts: all
  tasks:
    - name: 创建目录
      file:
        path: /path/to/directory
        state: directory
        owner: root
        group: root
        mode: '0755'
7. apt

在 Debian 系列操作系统上管理软件包。

yaml复制代码

复制代码
- name: 安装软件包
  hosts: all
  tasks:
    - name: 安装 nginx
      apt:
        name: nginx
        state: present
      become: yes
8. yum

在 RedHat 系列操作系统上管理软件包。

yaml复制代码

复制代码
- name: 安装软件包
  hosts: all
  tasks:
    - name: 安装 httpd
      yum:
        name: httpd
        state: present
      become: yes
9. service

管理系统服务的状态。

yaml复制代码

复制代码
- name: 管理服务
  hosts: all
  tasks:
    - name: 启动 nginx 服务
      service:
        name: nginx
        state: started
      become: yes
10. user

管理用户账户。

yaml复制代码

复制代码
- name: 管理用户
  hosts: all
  tasks:
    - name: 创建用户
      user:
        name: johndoe
        state: present

如何查询和使用模块

1. 使用 ansible-doc 命令查询模块

Ansible 提供了 ansible-doc 工具,可以查看任何模块的详细文档和使用示例。

  • 查看特定模块的文档:

sh复制代码

复制代码
ansible-doc <module_name>

例如,要查看 copy 模块的文档:

sh复制代码

复制代码
ansible-doc copy
  • 列出所有可用模块:

sh复制代码

复制代码
ansible-doc -l
2. 在线文档

Ansible 的官方文档提供了详细的模块使用指南和示例。你可以访问 Ansible 官方文档网站进行查阅:

Ansible 官方文档

3. 使用 --module-path 选项

如果你有自定义模块,或者需要指定自定义模块路径,可以使用 --module-path 选项:

sh复制代码

复制代码
ansible-playbook playbook.yml --module-path /path/to/custom/modules

示例:查询并使用 file 模块

  1. 查询 file 模块文档

sh复制代码

复制代码
ansible-doc file
  1. 使用 file 模块创建目录

yaml复制代码

复制代码
---
- name: 使用 file 模块
  hosts: all
  tasks:
    - name: 创建目录
      file:
        path: /path/to/directory
        state: directory
        owner: root
        group: root
        mode: '0755'

总结

Ansible 提供了丰富的模块来管理和自动化各种任务。了解和掌握常用模块的用法,可以大大提高自动化管理的效率。通过 ansible-doc 工具和官方文档,可以快速查询模块的详细用法和示例,从而更好地利用 Ansible 的强大功能。

相关推荐
翼龙云_cloud2 小时前
阿里云渠道商:WordPress网站如何使用文件存储NAS?
运维·服务器·阿里云·云计算
鸡蛋炒肉3 小时前
radius服务器创建方法
服务器·radius
2401_837088503 小时前
在 IDEA 中启动同一个项目的两个实例,让idea底层配置两个Tomcat 服务器
java·服务器·intellij-idea
桃花岛主703 小时前
multipart/form-data 和 application/x-www-form-urlencoded区别
服务器·网络·网络协议·http
卓码软件测评3 小时前
自动化软件API测试部署Postman和Jenkins集成
测试工具·自动化·jenkins·测试用例·postman·软件需求
讨厌下雨的天空3 小时前
缓冲区io
linux·服务器·前端
太阳风暴4 小时前
Linux CPU频率文件详解:cpuinfo__freq 与 scaling_cur_freq
linux·服务器·cpu
明知道的博客4 小时前
设置WSL中配置DNS服务器防止重启后重置,来源于wsl下Ubuntu环境访问阿里云太慢了
服务器·ubuntu·阿里云
Yxrrr__5 小时前
Linux系统常用命令
linux·运维·服务器