【详解】Ansible常用模块及API

举报
皮牙子抓饭 发表于 2025/07/28 20:47:34 2025/07/28
【摘要】 Ansible 常用模块及APIAnsible 是一个开源的自动化工具,用于配置管理、应用部署和任务执行。它通过 SSH 协议在远程主机上执行命令,无需在目标主机上安装任何代理软件。Ansible 的强大之处在于其模块化设计,每个模块负责特定的任务,如文件操作、用户管理、服务控制等。本文将介绍一些常用的 Ansible 模块及其 API。1. 基本概念1.1 模块模块是 Ansible 执行...

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​​ 模块用于管理文件、目录和符号链接的状态。

示例
- name: Ensure the file exists and is a directory
  file:
    path: /path/to/directory
    state: directory
    mode: '0755'

2.2 ​​copy​​ 模块

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

示例
- 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 模板文件渲染后复制到远程主机。

示例
- 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​​ 模块用于管理用户账户。

示例
- name: Create a user
  user:
    name: john
    state: present
    groups: sudo
    shell: /bin/bash

2.5 ​​service​​ 模块

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

示例
- name: Start and enable a service
  service:
    name: httpd
    state: started
    enabled: yes

2.6 ​​yum​​ 和 ​​apt​​ 模块

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

示例
- 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​​ 模块不支持。

示例
- 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:

pip install ansible

3.2 使用 Ansible API

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 也为开发者提供了更多的灵活性和扩展性。

### 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 的系统上安装、更新或删除软件包。

示例:

- 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​​ 模块

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

示例:

- 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​​ 模块

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

示例:

- 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 模板文件渲染并复制到远程节点。

示例:

- 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​​ 模块

用于执行命令行命令。

示例:

- 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​​ 模块

用于管理用户账户。

示例:

- 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​​ 模块

用于管理用户组。

示例:

- 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​​ 模块

用于管理服务状态。

示例:

- 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​​ 模块

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

示例:

- 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​ 模块
  • 功能:用于文件或目录的管理,如创建、删除、设置权限等。
  • 示例
- name: Create a directory
  file:
    path: /path/to/directory
    state: directory
    mode: '0755'
  1. copy​ 模块
  • 功能:用于复制文件到远程主机。
  • 示例
- 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 模板文件渲染并复制到远程主机。
  • 示例
- 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) 系统上管理软件包。
  • 示例
- name: Install package on CentOS
  yum:
    name: httpd
    state: present
  1. service​ 模块
  • 功能:用于管理系统服务。
  • 示例
- name: Start and enable Apache service
  service:
    name: httpd
    state: started
    enabled: yes
  1. shell​ 和 command 模块
  • 功能:用于在远程主机上执行命令。
  • 示例
- name: Run a shell command
  shell: echo "Hello, World!" > /tmp/hello.txt

Ansible API 调用

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

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 的强大功能进行配置管理和任务执行。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。