首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >【详解】Ansible常用模块及API

【详解】Ansible常用模块及API

原创
作者头像
大盘鸡拌面
发布2025-07-28 20:47:28
发布2025-07-28 20:47:28
2610
举报

Ansible 常用模块及API

Ansible 是一个开源的自动化工具,用于配置管理、应用部署和任务执行。它通过 SSH 协议在远程主机上执行命令,无需在目标主机上安装任何代理软件。Ansible 的强大之处在于其模块化设计,每个模块负责特定的任务,如文件操作、用户管理、服务控制等。本文将介绍一些常用的 Ansible 模块及其 API。

1. 基本概念

1.1 模块

模块是 Ansible 执行具体任务的基本单元。Ansible 提供了大量内置模块,同时也支持自定义模块。

1.2 Playbook

Playbook 是 YAML 格式的文件,用于描述一组任务。这些任务可以调用不同的模块来完成复杂的配置和部署工作。

1.3 Inventory

Inventory 文件定义了 Ansible 管理的目标主机及其分组信息。可以通过静态或动态方式定义 Inventory。

2. 常用模块

2.1 ​​file​​ 模块

​file​​ 模块用于管理文件、目录和符号链接的状态。

示例
代码语言:javascript
复制
- name: Ensure the file exists and is a directory
  file:
    path: /path/to/directory
    state: directory
    mode: '0755'
2.2 ​​copy​​ 模块

​copy​​ 模块用于将文件从本地复制到远程主机。

示例
代码语言:javascript
复制
- name: Copy a file to remote hosts
  copy:
    src: /local/path/to/file
    dest: /remote/path/to/file
    owner: root
    group: root
    mode: '0644'
2.3 ​​template​​ 模块

​template​​ 模块用于将 Jinja2 模板文件渲染后复制到远程主机。

示例
代码语言:javascript
复制
- name: Render a template to a file on remote hosts
  template:
    src: /local/path/to/template.j2
    dest: /remote/path/to/file
    owner: root
    group: root
    mode: '0644'
2.4 ​​user​​ 模块

​user​​ 模块用于管理用户账户。

示例
代码语言:javascript
复制
- name: Create a user
  user:
    name: john
    state: present
    groups: sudo
    shell: /bin/bash
2.5 ​​service​​ 模块

​service​​ 模块用于管理服务的状态。

示例
代码语言:javascript
复制
- name: Start and enable a service
  service:
    name: httpd
    state: started
    enabled: yes
2.6 ​​yum​​ 和 ​​apt​​ 模块

​yum​​ 模块用于在基于 Red Hat 的系统上管理软件包,而 ​​apt​​ 模块用于在基于 Debian 的系统上管理软件包。

示例
代码语言:javascript
复制
- name: Install a package using yum
  yum:
    name: nginx
    state: present

- name: Install a package using apt
  apt:
    name: nginx
    state: present
2.7 ​​shell​​ 和 ​​command​​ 模块

​shell​​ 和 ​​command​​ 模块用于在远程主机上执行命令。​​shell​​ 模块支持 shell 特性(如管道和重定向),而 ​​command​​ 模块不支持。

示例
代码语言:javascript
复制
- name: Run a shell command
  shell: echo "Hello, World!" > /tmp/hello.txt

- name: Run a command
  command: ls -l /tmp

3. Ansible API

Ansible 提供了 Python API,允许开发者编写自定义脚本来调用 Ansible 的功能。以下是一个简单的示例,展示如何使用 Ansible API 来执行一个任务。

3.1 安装 Ansible

确保已经安装了 Ansible:

代码语言:javascript
复制
pip install ansible
3.2 使用 Ansible API
代码语言:javascript
复制
from ansible.module_utils.basic import AnsibleModule
from ansible.executor.task_queue_manager import TaskQueueManager
from ansible.inventory.manager import InventoryManager
from ansible.parsing.dataloader import DataLoader
from ansible.playbook.play import Play
from ansible.vars.manager import VariableManager
import json

def main():
    # 定义 Inventory
    inventory = InventoryManager(loader=DataLoader(), sources=['localhost,'])

    # 定义变量管理器
    variable_manager = VariableManager(loader=DataLoader(), inventory=inventory)

    # 定义 Play
    play_source = dict(
        name="Example Play",
        hosts='localhost',
        gather_facts='no',
        tasks=[
            dict(action=dict(module='shell', args='echo Hello, World!'))
        ]
    )
    play = Play().load(play_source, variable_manager=variable_manager, loader=DataLoader())

    # 定义任务队列管理器
    tqm = None
    try:
        tqm = TaskQueueManager(
            inventory=inventory,
            variable_manager=variable_manager,
            loader=DataLoader(),
            passwords=dict(vault_pass='secret'),
        )
        result = tqm.run(play)
    finally:
        if tqm is not None:
            tqm.cleanup()

if __name__ == '__main__':
    main()

Ansible 的模块化设计使其成为一个强大的自动化工具。通过使用不同的模块,可以轻松地完成各种配置管理和任务执行。同时,Ansible 提供的 Python API 也为开发者提供了更多的灵活性和扩展性。

代码语言:javascript
复制
### 1. `yum` 模块
用于在基于 Red Hat 的系统上安装、更新或删除软件包。

**示例:**
```yaml
- name: Install Apache HTTP Server
  hosts: all
  become: yes
  tasks:
    - name: Ensure Apache is installed
      yum:
        name: httpd
        state: present

    - name: Start and enable Apache service
      service:
        name: httpd
        state: started
        enabled: yes
2. ​​apt​​ 模块

用于在基于 Debian 的系统上安装、更新或删除软件包。

示例:

代码语言:javascript
复制
- name: Install Nginx on Debian/Ubuntu
  hosts: all
  become: yes
  tasks:
    - name: Ensure Nginx is installed
      apt:
        name: nginx
        state: present

    - name: Start and enable Nginx service
      service:
        name: nginx
        state: started
        enabled: yes
3. ​​file​​ 模块

用于管理文件、目录和符号链接的状态。

示例:

代码语言:javascript
复制
- name: Create a directory
  hosts: all
  become: yes
  tasks:
    - name: Ensure /data/web is present
      file:
        path: /data/web
        state: directory
        owner: www-data
        group: www-data
        mode: '0755'
4. ​​copy​​ 模块

用于复制文件到远程节点。

示例:

代码语言:javascript
复制
- name: Copy configuration file
  hosts: all
  become: yes
  tasks:
    - name: Copy nginx.conf to /etc/nginx/
      copy:
        src: /local/path/to/nginx.conf
        dest: /etc/nginx/nginx.conf
        owner: root
        group: root
        mode: '0644'
5. ​​template​​ 模块

用于将 Jinja2 模板文件渲染并复制到远程节点。

示例:

代码语言:javascript
复制
- name: Deploy configuration using template
  hosts: all
  become: yes
  tasks:
    - name: Render and copy nginx.conf
      template:
        src: /local/path/to/nginx.conf.j2
        dest: /etc/nginx/nginx.conf
        owner: root
        group: root
        mode: '0644'
6. ​​shell​​ 和 ​​command​​ 模块

用于执行命令行命令。

示例:

代码语言:javascript
复制
- name: Run a shell command
  hosts: all
  become: yes
  tasks:
    - name: Update package lists
      command: apt-get update

    - name: Run a custom script
      shell: /usr/local/bin/custom-script.sh
7. ​​user​​ 模块

用于管理用户账户。

示例:

代码语言:javascript
复制
- name: Manage user accounts
  hosts: all
  become: yes
  tasks:
    - name: Create user johndoe
      user:
        name: johndoe
        state: present
        groups: sudo
        shell: /bin/bash

    - name: Remove user janedoe
      user:
        name: janedoe
        state: absent
        remove: yes
8. ​​group​​ 模块

用于管理用户组。

示例:

代码语言:javascript
复制
- name: Manage user groups
  hosts: all
  become: yes
  tasks:
    - name: Create group developers
      group:
        name: developers
        state: present

    - name: Remove group testers
      group:
        name: testers
        state: absent
9. ​​service​​ 模块

用于管理服务状态。

示例:

代码语言:javascript
复制
- name: Manage services
  hosts: all
  become: yes
  tasks:
    - name: Start and enable ssh service
      service:
        name: ssh
        state: started
        enabled: yes

    - name: Stop and disable cron service
      service:
        name: cron
        state: stopped
        enabled: no
10. ​​setup​​ 模块

用于收集远程主机的系统信息。

示例:

代码语言:javascript
复制
- name: Gather facts
  hosts: all
  tasks:
    - name: Collect system information
      setup:

    - name: Display system information
      debug:
        var: ansible_facts

这些示例展示了如何使用 Ansible 的常见模块来完成各种自动化任务。希望这些示例对你有帮助!如果你有特定的需求或更复杂的应用场景,可以进一步定制和扩展这些示例。Ansible 是一个开源的配置管理、应用部署和任务执行工具,它通过 SSH 协议在远程节点上执行任务,无需在目标机器上安装客户端软件。Ansible 使用 YAML 语言编写 Playbook(剧本),并通过模块来实现具体的功能。下面是一些常用的 Ansible 模块及其基本用法,以及如何通过 API 调用这些模块。

常用模块介绍
  1. file​ 模块
  • 功能:用于文件或目录的管理,如创建、删除、设置权限等。
  • 示例
代码语言:javascript
复制
- name: Create a directory
  file:
    path: /path/to/directory
    state: directory
    mode: '0755'
  1. copy​ 模块
  • 功能:用于复制文件到远程主机。
  • 示例
代码语言:javascript
复制
- name: Copy file to remote host
  copy:
    src: /local/path/to/file
    dest: /remote/path/to/file
    owner: root
    group: root
    mode: '0644'
  1. template​ 模块
  • 功能:用于将 Jinja2 模板文件渲染并复制到远程主机。
  • 示例
代码语言:javascript
复制
- name: Render and copy template
  template:
    src: /local/path/to/template.j2
    dest: /remote/path/to/file
    owner: root
    group: root
    mode: '0644'
  1. yum​ 和 apt 模块
  • 功能:用于在 Red Hat/CentOS (yum) 或 Debian/Ubuntu (apt) 系统上管理软件包。
  • 示例
代码语言:javascript
复制
- name: Install package on CentOS
  yum:
    name: httpd
    state: present
  1. service​ 模块
  • 功能:用于管理系统服务。
  • 示例
代码语言:javascript
复制
- name: Start and enable Apache service
  service:
    name: httpd
    state: started
    enabled: yes
  1. shell​ 和 command 模块
  • 功能:用于在远程主机上执行命令。
  • 示例
代码语言:javascript
复制
- name: Run a shell command
  shell: echo "Hello, World!" > /tmp/hello.txt
Ansible API 调用

Ansible 提供了 Python API,可以通过编写 Python 脚本来调用 Ansible 的功能。以下是一个简单的示例,展示如何使用 Ansible API 执行一个任务:

代码语言:javascript
复制
import ansible_runner

# 定义任务
playbook = """
- hosts: all
  tasks:
    - name: Ping all hosts
      ping:
"""

# 运行任务
runner = ansible_runner.run(
    private_data_dir='/path/to/private/data',
    playbook=playbook,
    inventory='/path/to/inventory'
)

# 输出结果
for event in runner.events:
    print(event['event'], event['event_data'])

print("Final status:", runner.status)
解释
  1. ansible_runner​:这是 Ansible Runner 库,用于从 Python 脚本中运行 Ansible。
  2. private_data_dir​:指定包含 Ansible 配置文件、插件、库等的目录。
  3. playbook​:定义要执行的任务。
  4. inventory​:指定库存文件,定义目标主机。
  5. runner.events​:获取任务执行过程中的事件,可以用来监控任务状态。
  6. runner.status​:获取任务的最终状态。

通过这种方式,你可以编写复杂的自动化脚本,利用 Ansible 的强大功能进行配置管理和任务执行。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Ansible 常用模块及API
    • 1. 基本概念
      • 1.1 模块
      • 1.2 Playbook
      • 1.3 Inventory
    • 2. 常用模块
      • 2.1 ​​file​​ 模块
      • 2.2 ​​copy​​ 模块
      • 2.3 ​​template​​ 模块
      • 2.4 ​​user​​ 模块
      • 2.5 ​​service​​ 模块
      • 2.6 ​​yum​​ 和 ​​apt​​ 模块
      • 2.7 ​​shell​​ 和 ​​command​​ 模块
    • 3. Ansible API
      • 3.1 安装 Ansible
      • 3.2 使用 Ansible API
      • 2. ​​apt​​ 模块
      • 3. ​​file​​ 模块
      • 4. ​​copy​​ 模块
      • 5. ​​template​​ 模块
      • 6. ​​shell​​ 和 ​​command​​ 模块
      • 7. ​​user​​ 模块
      • 8. ​​group​​ 模块
      • 9. ​​service​​ 模块
      • 10. ​​setup​​ 模块
      • 常用模块介绍
      • Ansible API 调用
      • 解释
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档