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.com 和 web2.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 的强大功能。

相关推荐
qq_426003963 天前
启动playwright录制codegen生成自动化测试脚本
python·自动化
虎头金猫3 天前
4K 视频总卡在公网带宽?用 N1 + OpenList 把网盘播放链路重新理顺
运维·服务器·网络·python·容器·beautifulsoup·pandas
-梅3 天前
linux(8) 软硬链接
linux·运维·服务器
Wang's Blog3 天前
Java 项目实战: 外卖平台-文件下载与ServletOutputStream回写浏览器
服务器·项目开发
琥珀色糖3 天前
SimlpeHttp
linux·服务器
其实防守也摸鱼3 天前
内网穿透与反向代理:原理、工具与实战指南
android·大数据·运维·安全·网络安全·自动化·渗透
森叶3 天前
用远程调试端口自动化 Chrome 应用商店发布:做法、三个真坑,以及你必须知道的风险
自动化
第十人i3 天前
Linux 日志管理系统:journald 配置与优化
linux·服务器
懂软件的胡子个哥3 天前
微信机器人为什么需要“回复候选”而不是所有 AI 内容直接发送
运维·微信·自动化·wechatapi·个人微信号二次开发