Ansible常用模块

🌟command模块

Ansible 的 command 模块是 Ansible 中最常用的模块之一,用于在远程主机上执行具体的 shell 命令。它不会通过 shell(如 /bin/sh)来执行命令,因此不会继承环境变量等 shell 特性。

📌 command 模块特点:

  • 执行的是具体的命令(如 ls, cat, systemctl restart nginx 等)
  • 不支持 shell 语法(如管道 |、重定向 >、通配符 * 等)
  • 更安全、更直接,适合执行确定路径和参数的命令
  • 如果需要使用 shell 特性,请使用 shell 模块

✅ 基本语法:

- name: 描述任务
  command: 命令 参数

📚 示例 1:列出远程主机上的文件

- name: 列出 /tmp 目录下的文件
  command: ls /tmp

📚 示例 2:执行脚本

- name: 执行一个脚本
  command: /opt/scripts/check_status.sh

📚 示例 3:获取远程主机的 uptime

- name: 获取系统运行时间
  command: uptime

📌 常用参数:

  • chdir:在执行命令前切换目录
  • creates:如果指定的文件存在,则不执行命令
  • removes:如果指定的文件不存在,则不执行命令

📚 示例 4:切换目录执行命令

- name: 在 /var/log 下执行 ls
  command: ls
  args:
    chdir: /var/log

📚 示例 5:只有文件不存在时才执行命令

- name: 如果 /tmp/testfile 不存在才创建
  command: touch /tmp/testfile
  args:
    creates: /tmp/testfile

✅ 总结:

模块名用途
command执行具体的命令,不经过 shell,更安全
shell执行 shell 命令,支持管道、重定向等

🌟shell模块

Ansible 的 shell 模块用于在远程主机上执行Shell 命令,与 command 模块不同的是,它会在远程主机的 shell 解释器(如 /bin/sh)中运行命令,因此可以使用管道、重定向、通配符等 shell 特性。

📌 shell 模块特点:

  • 支持完整的 shell 语法(如 |, >, >>, *, &&, || 等)
  • 默认使用 /bin/sh 执行命令
  • 可以继承环境变量(取决于用户和执行上下文)
  • 如果你只需要执行简单、明确的命令而不依赖 shell 特性,推荐使用 command 模块更安全

✅ 基本语法:

- name: 描述任务
  shell: shell命令

📚 示例 1:获取当前工作目录(支持 shell 命令)

- name: 获取当前工作目录
  shell: pwd
  register: current_dir

- debug:
    msg: "当前目录是 {{ current_dir.stdout }}"

📚 示例 2:使用管道过滤输出内容

- name: 查找包含 'root' 的行
  shell: grep root /etc/passwd | wc -l
  register: result

- debug:
    msg: "匹配的行数为 {{ result.stdout }}"

📚 示例 3:写入文件内容(重定向)

- name: 写入内容到文件
  shell: echo "Hello from Ansible" > /tmp/ansible_test.txt

📚 示例 4:判断某个服务是否运行(结合 if 判断)

- name: 检查 nginx 是否运行
  shell: ps aux | grep nginx | grep -v grep
  ignore_errors: yes
  register: nginx_status

- debug:
    msg: "Nginx 正在运行"
  when: nginx_status is not failed and nginx_status.stdout != ''

📌 常用参数:

  • chdir:在执行命令前切换目录
  • creates:如果指定的文件存在,则不执行命令
  • removes:如果指定的文件不存在,则不执行命令
  • executable:指定使用的 shell 解释器(如 /bin/bash

📚 示例 5:使用特定 shell 并切换目录执行脚本

- name: 使用 bash 执行脚本
  shell: ./hello.sh
  args:
    chdir: /opt/scripts
    executable: /bin/bash

✅ 总结对比:

模块名是否支持 shell 特性安全性推荐用途
command❌ 不支持简单、确定的命令
shell✅ 支持需要管道、重定向等复杂操作

🌟script模块

Ansible 的 script 模块用于在远程主机上执行本地脚本文件。也就是说,你可以将 Ansible 控制机(即 Ansible 运行的机器)上的一个脚本文件传输到远程主机并执行它。

📌 script 模块特点:

  • 执行的是本地脚本文件(如 .sh, .py 等)
  • 脚本会先被复制到远程主机的临时目录中再执行
  • 支持 shell 脚本中的管道、重定向等 shell 特性(因为它本质是在 shell 中执行)
  • 适合执行复杂的、多行的逻辑,尤其是你已经写好的脚本文件

✅ 基本语法:

- name: 描述任务
  script: 脚本路径 参数1 参数2 ...

📚 示例 1:执行本地的 shell 脚本

假设你本地有一个脚本文件 hello.sh

#!/bin/bash
echo "Hello from script"
echo "Current user: $(whoami)"

Ansible Playbook 示例:

- name: 执行本地脚本到远程主机
  script: hello.sh

Ansible 会自动将 hello.sh 传输到远程主机并执行它。

📚 示例 2:带参数执行脚本

脚本 greet.sh

#!/bin/bash
echo "Hello, $1"

Playbook 示例:

- name: 执行脚本并传递参数
  script: greet.sh Alice

输出:

Hello, Alice

📌 常用参数:

  • chdir:执行脚本前切换到指定目录
  • creates:如果指定的文件存在,则不执行脚本
  • removes:如果指定的文件不存在,则不执行脚本
  • environment:为脚本设置环境变量

📚 示例 3:在特定目录下执行脚本

- name: 切换目录执行脚本
  script: hello.sh
  args:
    chdir: /tmp

📚 示例 4:只有文件不存在时才执行脚本

- name: 如果文件不存在则执行脚本
  script: create_file.sh
  args:
    creates: /tmp/output.txt

📚 示例 5:设置环境变量运行脚本

脚本 print_env.sh

#!/bin/bash
echo "Environment: $ENV_VAR"

Playbook 示例:

- name: 执行脚本并设置环境变量
  script: print_env.sh
  environment:
    ENV_VAR: "production"

✅ 总结对比:

模块名执行内容是否支持 shell 特性是否推荐用于脚本文件
command单条命令❌ 不支持❌ 不适合
shell单条 shell 命令✅ 支持❌ 不适合复杂脚本
script本地脚本文件✅ 支持✅ 推荐

🌟stat模块

Ansible 的 stat 模块用于获取远程主机上文件或目录的状态信息,类似于 Linux 中的 stat 命令。它可以检查文件是否存在、类型、权限、大小、修改时间等信息。

📌 stat 模块特点:

  • 获取远程主机上的文件/目录元数据(metadata)
  • 支持注册变量(register)进行后续判断
  • 可以用来做条件判断(如:如果文件存在才执行某任务)

✅ 基本语法:

- name: 描述任务
  stat:
    src: 文件路径

📚 示例 1:获取文件状态

- name: 获取 /etc/passwd 文件的状态
  stat:
    src: /etc/passwd
  register: file_stat

- debug:
    msg: |
      文件存在,大小为 {{ file_stat.stat.size }} 字节,
      修改时间为 {{ file_stat.stat.mtime }}

📚 示例 2:判断文件是否存在

- name: 检查文件是否存在
  stat:
    src: /tmp/testfile.txt
  register: file_check

- debug:
    msg: "文件存在"
  when: file_check.stat.exists

📚 示例 3:判断是否是目录

- name: 检查路径是否是目录
  stat:
    src: /var/log
  register: dir_stat

- debug:
    msg: "/var/log 是一个目录"
  when: dir_stat.stat.isdir

📚 示例 4:获取文件权限

- name: 获取文件权限信息
  stat:
    src: /etc/hosts
  register: host_file

- debug:
    msg: "权限为 {{ host_file.stat.mode }}"

输出示例:

权限为 0644

📌 常用返回字段说明:

字段名含义
exists文件是否存在
isdir是否是目录
isfile是否是普通文件
size文件大小(字节)
mtime最后修改时间(时间戳)
mode文件权限模式(如 0644)
uid, gid文件拥有者 ID 和组 ID

✅ 总结:

使用场景推荐模块
获取文件状态信息stat
判断文件是否存在stat
修改文件内容❌ 不适用,应使用 copylineinfile
执行命令或脚本❌ 不适用,应使用 command / shell / script

🌟file模块

Ansible 的 file 模块用于管理远程主机上的文件、目录或符号链接的属性,比如创建/删除文件、设置权限、修改所有者等。它是 Ansible 中最常用的模块之一,适用于对文件系统进行操作。

📌 file 模块主要功能:

  • 创建或删除文件、目录、软链接
  • 修改文件权限(mode)
  • 修改文件所属用户和组(owner/group)
  • 设置文件的时间戳(atime/mtime)

✅ 基本语法:

- name: 描述任务
  file:
    path: 文件/目录路径
    state: 状态(如 touch, directory, absent, link 等)
    mode: 权限模式(可选)
    owner: 所有者(可选)
    group: 所属组(可选)

📚 示例 1:创建一个空文件(类似 touch

- name: 创建一个空文件
  file:
    path: /tmp/testfile.txt
    state: touch

📚 示例 2:创建一个目录

- name: 创建目录 /var/www/html
  file:
    path: /var/www/html
    state: directory

你也可以同时设置权限和所有者:

- name: 创建目录并设置权限和所有者
  file:
    path: /var/www/html
    state: directory
    mode: '0755'
    owner: www-data
    group: www-data

📚 示例 3:删除文件或目录

- name: 删除 /tmp/testfile.txt
  file:
    path: /tmp/testfile.txt
    state: absent

⚠️ 如果是目录,会递归删除整个目录及其内容!

📚 示例 4:创建软链接(symbolic link)

- name: 创建软链接 /etc/app_config → /opt/app/config
  file:
    src: /opt/app/config
    dest: /etc/app_config
    state: link

📚 示例 5:修改文件权限和归属

- name: 修改文件权限和所有者
  file:
    path: /var/www/index.html
    mode: '0644'
    owner: apache
    group: apache

📚 示例 6:设置文件时间戳

- name: 设置文件的访问时间和修改时间
  file:
    path: /tmp/example.txt
    state: touch
    atime: "{{ ansible_date_time.iso8601 }}"
    mtime: "{{ ansible_date_time.iso8601 }}"

📌 常用参数说明:

参数名说明
path文件或目录路径(必填)
state状态:absent, touch, directory, link
mode设置权限(如 '0644'
owner设置文件拥有者
group设置文件所属组
src软链接时使用,指定源路径
dest软链接时使用,指定目标路径

✅ 总结对比:

功能推荐模块
查看文件状态stat
创建/删除/修改文件属性file
执行脚本或命令❌ 不适用,应使用 shellscript
传输文件❌ 不适用,应使用 copysynchronize

🌟lineinfile模块

Ansible 的 lineinfile 模块用于确保某一行内容在文件中存在或不存在。它非常适合用于修改配置文件,比如:

  • 添加一行配置
  • 修改某一行内容
  • 删除某一行内容

它是 Ansible 中用于精细修改文件内容的常用模块之一。

📌 lineinfile 模块特点:

  • 支持正则匹配,定位目标行
  • 可以替换已有行,也可以在匹配行前后插入新内容
  • 如果找不到匹配项,可以指定插入位置(如 EOF 或 BOF)
  • 类似于 sed 命令,但更简单易用

✅ 基本语法:

- name: 描述任务
  lineinfile:
    path: 文件路径
    regexp: '正则表达式匹配行(可选)'
    line: '要设置的行内容'
    state: present 或 absent(默认是 present)

📚 示例 1:确保某一行内容存在于文件中

- name: 确保 /etc/motd 中包含一行欢迎语
  lineinfile:
    path: /etc/motd
    line: 'Welcome to the server, authorized users only.'

如果该行不存在,就会被添加到文件末尾。

📚 示例 2:修改匹配的行内容(使用正则)

- name: 修改配置文件中的端口号
  lineinfile:
    path: /etc/myapp.conf
    regexp: '^port ='
    line: 'port = 8080'

这会将类似 port = 8000 的行修改为 port = 8080

📚 示例 3:删除匹配的行

- name: 删除包含 'PasswordAuthentication' 的行
  lineinfile:
    path: /etc/ssh/sshd_config
    regexp: '^PasswordAuthentication'
    state: absent

📚 示例 4:如果匹配不到,则插入新行

- name: 如果找不到匹配行,则添加
  lineinfile:
    path: /etc/ssh/sshd_config
    regexp: '^PermitRootLogin'
    line: 'PermitRootLogin no'

📚 示例 5:在匹配行后插入内容

- name: 在匹配行后插入内容
  lineinfile:
    path: /etc/myapp.conf
    regexp: '^log_level ='
    insertafter: '^log_level ='
    line: 'log_file = /var/log/myapp.log'

📚 示例 6:插入内容到文件开头(BOF)或结尾(EOF)

- name: 插入一行到文件开头
  lineinfile:
    path: /etc/motd
    line: 'Top line of the file'
    insertbefore: BOF

- name: 插入一行到文件末尾
  lineinfile:
    path: /etc/motd
    line: 'Bottom line of the file'
    insertafter: EOF

📌 常用参数说明:

参数名说明
path要操作的文件路径(必填)
regexp正则表达式,用于匹配目标行(可选)
line要设置的行内容(state=present 时必填)
statepresent(默认)或 absent
insertafter在匹配的行之后插入新内容
insertbefore在匹配的行之前插入新内容
backup修改前备份原文件(建议用于重要配置文件)

✅ 总结对比:

功能推荐模块
替换或添加某一行内容lineinfile
修改整个文件内容❌ 不适合,应使用 copy
查看文件状态❌ 不适合,应使用 stat
创建/删除/修改文件属性❌ 不适合,应使用 file

🌟copy模块

Ansible 的 copy 模块用于将本地或远程计算机上的文件复制到远程主机上的指定位置。它是 Ansible 中最常用的模块之一,特别适合用于部署配置文件、脚本、证书等。

📌 copy 模块特点:

  • 可以复制本地文件到远程主机(最常见用法)
  • 支持设置文件权限、所有者、组等属性
  • 支持备份原文件(防止误操作)
  • 支持内容替换(配合模板使用)
  • 支持递归复制整个目录

✅ 基本语法:

- name: 描述任务
  copy:
    src: 本地文件路径(Ansible 控制机上的路径)
    dest: 远程主机上的目标路径(必填)
    owner: 所有者(可选)
    group: 所属组(可选)
    mode: 权限模式(可选)
    backup: yes/no(是否备份原文件)
    content: 直接设置文件内容(可选,与 src 互斥)

📚 示例 1:复制本地文件到远程主机

- name: 复制本地的 index.html 到远程主机
  copy:
    src: /data/files/index.html
    dest: /var/www/html/index.html

📚 示例 2:复制文件并设置权限和所有者

- name: 复制配置文件并设置权限和所有者
  copy:
    src: myapp.conf
    dest: /etc/myapp.conf
    owner: root
    group: root
    mode: '0644'

📚 示例 3:复制目录(递归复制)

- name: 复制整个目录到远程主机
  copy:
    src: /data/files/
    dest: /opt/files/

⚠️ 注意:src 路径结尾的 / 表示复制目录内容,不带 / 表示复制整个目录本身。

📚 示例 4:复制文件前备份原文件

- name: 替换配置文件并备份原文件
  copy:
    src: new_config.conf
    dest: /etc/app/config.conf
    backup: yes

如果 /etc/app/config.conf 已存在,Ansible 会先将它备份为类似 config.conf.210101.1234 的文件。

📚 示例 5:直接设置文件内容(不使用 src)

- name: 创建一个文件并写入指定内容
  copy:
    dest: /tmp/hello.txt
    content: |
      Hello from Ansible.
      This file was created using the copy module.

📚 示例 6:使用变量动态生成内容

- name: 使用变量写入文件内容
  copy:
    dest: /tmp/greeting.txt
    content: "Welcome user: {{ ansible_env.USER }}"

📌 常用参数说明:

参数名说明
src本地文件或目录路径(Ansible 控制机)
dest远程主机上的目标路径(必填)
content直接指定文件内容(与 src 互斥)
owner设置文件拥有者
group设置文件所属组
mode设置文件权限(如 '0644'
backup覆盖前备份原文件
force是否强制覆盖(即使内容相同)

✅ 总结对比:

功能推荐模块
复制文件或目录copy
修改某一行内容❌ 不适合,应使用 lineinfile
查看文件状态❌ 不适合,应使用 stat
创建/删除/修改文件属性❌ 不适合,应使用 file

🌟template模块

Ansible 的 template** 模块** 用于将本地的 Jinja2 模板文件 渲染后复制到远程主机上。它是 copy 模块的“高级版”,支持在模板中使用变量和逻辑,非常适合用来生成动态配置文件(如 Nginx 配置、系统服务配置等)。

📌 template 模块特点:

  • 使用 Jinja2 模板语法(支持变量、条件判断、循环等)
  • 模板文件必须放在 Ansible 控制机的 templates/ 目录下
  • 支持设置权限、所有者、组等属性
  • 可以配合变量动态生成配置文件内容

✅ 基本语法:

- name: 描述任务
  template:
    src: 模板文件路径(相对于 templates 目录)
    dest: 远程主机上的目标路径(必填)
    owner: 所有者(可选)
    group: 所属组(可选)
    mode: 权限模式(可选)

📚 示例 1:渲染并部署一个简单的 Jinja2 模板

✅ 步骤一:创建模板文件 templates/motd.j2

Welcome to {{ ansible_fqdn }}
IP Address: {{ ansible_default_ipv4.address }}
Environment: production

✅ 步骤二:Playbook 示例

- name: 使用模板生成 /etc/motd 文件
  hosts: all
  tasks:
    - name: 部署 motd 模板
      template:
        src: motd.j2
        dest: /etc/motd
        mode: '0644'

执行后,远程主机上的 /etc/motd 文件内容会是:

Welcome to node01.example.com
IP Address: 192.168.1.10
Environment: production

📚 示例 2:带变量判断的模板

✅ 模板文件 templates/app_config.j2

# 应用配置文件

{% if environment == "prod" %}
log_level = warning
{% else %}
log_level = debug
{% endif %}

bind_address = {{ bind_ip }}
port = {{ app_port }}

✅ Playbook 示例

- name: 部署应用配置模板
  hosts: webservers
  vars:
    environment: prod
    bind_ip: 0.0.0.0
    app_port: 8000
  tasks:
    - name: 渲染配置文件
      template:
        src: app_config.j2
        dest: /etc/myapp/config.conf
        owner: root
        group: root
        mode: '0644'

📌 常用参数说明:

参数名说明
srcJinja2 模板文件路径(相对于 templates/ 目录)
dest远程主机上的目标路径(必填)
owner设置文件拥有者
group设置文件所属组
mode设置文件权限(如 '0644'
backup覆盖前备份原文件(建议开启)

✅ 总结对比:

功能推荐模块
生成带变量的配置文件template
静态文件复制❌ 不适合,应使用 copy
修改某一行内容❌ 不适合,应使用 lineinfile
创建/删除/修改文件属性❌ 不适合,应使用 file

📌 小贴士:

  • 模板文件通常放在 Playbook 同级目录下的 templates/ 文件夹中
  • Jinja2 模板文件扩展名通常是 .j2,不是必须的,但推荐使用来区分模板与普通文件

🌟unarchive模块

Ansible 的 unarchive** 模块** 用于在远程主机上解压归档文件(如 .tar, .tgz, .zip 等格式),是 Ansible 中处理压缩包的常用模块。

它支持从本地控制机或远程主机复制并解压归档文件,非常适合部署应用时使用,比如将打包好的代码上传并解压到指定目录。

📌 unarchive 模块特点:

  • 支持多种格式:.tar, .tar.gz, .zip
  • 可以从本地上传并解压(类似 copy + 解压
  • 也可以直接在远程主机上解压已有压缩包
  • 支持设置解压后的目标路径、权限、所有者等

✅ 基本语法:

- name: 描述任务
  unarchive:
    src: 本地或远程的压缩包路径
    dest: 解压到的目标目录
    remote_src: yes/no(是否压缩包已在远程主机上)
    owner: 所有者(可选)
    group: 所属组(可选)
    mode: 权限模式(可选)

📚 示例 1:上传并解压本地的 tar.gz 文件到远程主机

✅ 本地有一个压缩包:files/app.tar.gz

- name: 上传并解压 app.tar.gz 到 /opt/app/
  unarchive:
    src: files/app.tar.gz
    dest: /opt/app/
    remote_src: no  # 默认就是 no,表示压缩包来自 Ansible 控制机

Ansible 会自动将 app.tar.gz 上传并解压到 /opt/app/ 目录下。

📚 示例 2:解压远程主机上的 zip 文件

假设远程主机上已经存在一个压缩包:/tmp/myapp.zip

- name: 解压远程主机上的 zip 文件
  unarchive:
    src: /tmp/myapp.zip
    dest: /var/www/myapp/
    remote_src: yes  # 表示压缩包已经在远程主机上

📚 示例 3:上传并解压后设置权限和归属

- name: 解压代码包并设置权限和归属
  unarchive:
    src: files/project.tar.gz
    dest: /data/project/
    owner: deploy
    group: deploy
    mode: '0755'

📚 示例 4:仅解压某个子目录内容(配合 extra_opts

如果你只想解压压缩包中的某个子目录(例如只提取 project/config/),可以使用 extra_opts 传入命令行参数:

- name: 解压 tar.gz 中的特定子目录
  unarchive:
    src: files/project.tar.gz
    dest: /data/project/
    extra_opts:
      - "--strip-components=1"
      - "-C"
      - "project/subdir"

⚠️ 注意:extra_opts 是高级用法,需要你对 tar 或 unzip 命令有一定了解。

📌 常用参数说明:

参数名说明
src压缩包路径(本地或远程)
dest解压到的目标目录(必填)
remote_src是否压缩包已存在于远程主机(yes/no)
owner设置解压后文件的所有者
group设置解压后文件的所属组
mode设置解压后文件的权限
creates如果目标路径已存在,则跳过解压
backup如果目标目录存在,是否先备份再覆盖(不支持)
extra_opts额外传递给 tar/unzip 命令的参数

✅ 总结对比:

功能推荐模块
解压 .tar/.zip 等压缩包unarchive
复制文件或目录❌ 不适合,应使用 copy
创建/删除/修改文件属性❌ 不适合,应使用 file

🌟mount模块

Ansible 的 mount 模块用于管理挂载点(如文件系统、NFS、CIFS 等)的挂载和卸载操作,并可以更新 /etc/fstab 文件以实现开机自动挂载。它是 Ansible 中用于管理存储设备或远程共享目录的重要模块。

📌 mount 模块特点:

  • 支持临时挂载和卸载
  • 支持写入 /etc/fstab 实现持久化挂载
  • 可以挂载本地设备(如 /dev/sdb1)或远程共享(如 NFS、CIFS)
  • 可控制挂载选项(如 ro, rw, noatime

✅ 基本语法:

- name: 描述任务
  mount:
    path: 挂载点路径(如 /mnt/data)
    src: 设备或远程资源路径(如 /dev/sdb1 或 server:/share)
    fstype: 文件系统类型(如 ext4, xfs, nfs, cifs)
    state: 状态(mounted, unmounted, present, absent)
    opts: 挂载选项(可选)

📚 示例 1:挂载一个 NFS 共享

- name: 挂载 NFS 共享到 /mnt/nfs
  mount:
    path: /mnt/nfs
    src: nfs-server:/exports/data
    fstype: nfs
    opts: defaults
    state: mounted

这会执行以下操作:

  • 如果未挂载,则挂载 NFS 共享;
  • 同时写入 /etc/fstab,使其在重启后也生效。

📚 示例 2:仅添加 fstab 条目但不挂载

- name: 添加 NFS 到 fstab,但不立即挂载
  mount:
    path: /mnt/nfs
    src: nfs-server:/exports/data
    fstype: nfs
    opts: defaults
    state: present

这种方式只修改配置文件,不会实际执行挂载操作。

📚 示例 3:挂载本地硬盘分区(ext4)

- name: 挂载本地硬盘分区 /dev/sdb1 到 /mnt/data
  mount:
    path: /mnt/data
    src: /dev/sdb1
    fstype: ext4
    opts: defaults,noatime
    state: mounted

📚 示例 4:卸载一个挂载点

- name: 卸载 /mnt/nfs
  mount:
    path: /mnt/nfs
    state: unmounted

此操作只会卸载当前挂载,不会删除 /etc/fstab 中的条目。

📚 示例 5:从 fstab 中移除挂载条目

- name: 从 fstab 中移除 /mnt/nfs 条目
  mount:
    path: /mnt/nfs
    state: absent

此操作只会删除 /etc/fstab 中对应的条目,不会卸载当前已挂载的文件系统。

📌 常用参数说明:

参数名说明
path挂载点路径(必填)
src要挂载的设备或远程路径(如 /dev/sdb1, nfs-server:/share
fstype文件系统类型(如 ext4, xfs, nfs, cifs)
opts挂载选项(如 defaults, ro, noatime
state状态: mounted: 挂载 + 写 fstab unmounted: 卸载 present: 仅写 fstab absent: 删除 fstab 条目

✅ 总结对比:

操作目标推荐 state
挂载并写入 fstabmounted
仅写入 fstabpresent
卸载unmounted
从 fstab 中删除条目absent

🌟group模块

Ansible 的 group 模块用于管理远程主机上的用户组(group)。你可以使用它来创建、删除用户组,或者设置组的 GID 等属性。

它是 Ansible 中用于用户权限管理的基础模块之一,常用于自动化部署时配置系统权限结构。

📌 group 模块特点:

  • 可以创建和删除用户组
  • 支持指定组的 GID(Group ID)
  • 支持跨平台(支持 Linux、FreeBSD、Solaris 等)
  • 不会修改已存在的组的属性(除非指定 state=absentgid

✅ 基本语法:

- name: 描述任务
  group:
    name: 组名(必填)
    gid: 组的 GID(可选)
    state: present 或 absent(默认是 present)
    system: yes/no(是否为系统组)

📚 示例 1:创建一个用户组

- name: 创建名为 deploy 的用户组
  group:
    name: deploy
    state: present

如果该组不存在,就会被创建。

📚 示例 2:创建一个指定 GID 的用户组

- name: 创建名为 dbgroup 的组,指定 GID 为 1010
  group:
    name: dbgroup
    gid: 1010
    state: present

📚 示例 3:删除一个用户组

- name: 删除名为 tempgroup 的用户组
  group:
    name: tempgroup
    state: absent

📚 示例 4:创建一个系统组(system group)

系统组通常 GID 会比较小(如 < 1000),用于系统服务或守护进程。

- name: 创建系统组 www-data
  group:
    name: www-data
    system: yes
    state: present

📌 常用参数说明:

参数名说明
name用户组名称(必填)
gid指定组的 GID(可选)
statepresent(默认,确保存在)或 absent(删除组)
system是否为系统组(yes/no)

✅ 总结对比:

功能推荐模块
管理用户组group
管理用户账户❌ 不适合,应使用 user
管理文件权限❌ 不适合,应使用 file
执行命令或脚本❌ 不适合,应使用 command / shell

🌟user模块

Ansible 的 user 模块用于管理远程主机上的用户账户,可以创建、删除用户,设置用户的主组、附加组、家目录、登录 shell 等属性。它是 Ansible 中用于系统管理和权限控制的重要模块之一。

📌 user 模块特点:

  • 创建或删除用户
  • 设置用户的主组和附加组
  • 控制用户的登录 shell
  • 设置家目录路径
  • 支持设置是否为系统用户(system user)
  • 可以管理用户的 SSH 密钥(通过 ssh_key 参数)

✅ 基本语法:

- name: 描述任务
  user:
    name: 用户名(必填)
    comment: 用户描述信息
    uid: 用户 UID(可选)
    group: 主组(可选)
    groups: 附加组列表(可选)
    home: 家目录路径
    shell: 登录 shell(如 /bin/bash)
    password: 加密后的密码(可选)
    state: present 或 absent(默认 present)
    system: yes/no(是否是系统用户)
    remove: yes/no(删除用户时是否同时删除家目录和邮件文件)

📚 示例 1:创建一个普通用户

- name: 创建用户 alice
  user:
    name: alice
    comment: "Alice User"
    shell: /bin/bash
    home: /home/alice
    groups: sudo
    state: present

这会创建一个用户 alice,主目录 /home/alice,使用 /bin/bash shell,并加入 sudo 组。

📚 示例 2:创建用户并指定主组和附加组

- name: 创建用户 bob,主组为 developers,附加组为 docker, www-data
  user:
    name: bob
    group: developers
    groups:
      - docker
      - www-data
    shell: /bin/zsh
    create_home: yes

📚 示例 3:删除用户并清除其家目录

- name: 删除用户 tempuser 并删除其家目录
  user:
    name: tempuser
    state: absent
    remove: yes

📚 示例 4:创建一个系统用户(system user)

系统用户通常不带家目录,适用于服务运行账户。

- name: 创建系统用户 myservice
  user:
    name: myservice
    system: yes
    shell: /sbin/nologin
    create_home: no

📚 示例 5:设置用户密码(需使用加密密码)

⚠️ 注意:Ansible 不支持直接明文设置密码,必须使用加密后的密码字符串(可以通过 openssl passwd -6 生成)。

- name: 设置用户 alice 的密码
  user:
    name: alice
    password: "{{ password|password_hash('sha512','zbl') }}"

你可以用以下命令生成 SHA-512 加密密码:

openssl passwd -6

📚 示例 6:添加用户的 SSH 公钥

- name: 添加 alice 的 SSH 公钥
  user:
    name: alice
    ssh_key_shell: /bin/bash
    ssh_key_file: .ssh/authorized_keys
    ssh_key_content: "{{ lookup('file', '/path/to/id_rsa.pub') }}"

📌 常用参数说明:

参数名说明
name用户名(必填)
comment用户描述(GECOS 字段)
uid指定用户 UID
group设置主组
groups设置附加组(列表)
home设置家目录路径
shell设置登录 shell
password设置加密后的密码
statepresent(默认)或 absent
system是否为系统用户
remove删除用户时是否同时删除家目录和邮件文件
create_home是否创建家目录
ssh_key_*管理用户的 SSH 公钥

✅ 总结对比:

功能推荐模块
管理用户账户user
管理用户组❌ 不适合,应使用 group
修改用户密码✅(但需加密密码)
部署 SSH 密钥✅ 支持
执行命令或脚本❌ 不适合,应使用 command / shell

🌟yum/apt模块

在 Ansible 中,yumapt 是两个用于管理软件包的模块,分别适用于不同 Linux 发行版:

📌yum 模块(适用于 CentOS / RHEL)

✅ 用途:

用于在基于 YUM 的系统上安装、更新、卸载软件包。

📦 常见发行版:

  • CentOS
  • RHEL(Red Hat Enterprise Linux)
  • Fedora(旧版本)

🧩 示例:

- name: 安装 Apache httpd
  yum:
    name: httpd
    state: present

- name: 升级所有已安装的包
  yum:
    name: "*"
    state: latest

- name: 卸载 postfix 邮件服务
  yum:
    name: postfix
    state: absent

📌apt 模块(适用于 Ubuntu / Debian)

✅ 用途:

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

📦 常见发行版:

  • Ubuntu
  • Debian

⚠️ 注意:

使用 apt 模块前建议先执行 apt update 来刷新包索引。

🧩 示例:

- name: 更新 APT 缓存
  apt:
    update_cache: yes
    cache_valid_time: 3600

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

- name: 安装多个软件包
  apt:
    name:
      - python3-pip
      - curl
    state: present

- name: 删除无用的软件包
  apt:
    name: telnet
    state: absent

🔄 对比总结:yum vs apt

功能yum(CentOS/RHEL)apt(Ubuntu/Debian)
安装软件包
升级软件包
卸载软件包
刷新包列表❌ 默认不自动刷新✅ 需手动调用 update_cache
支持通配符✅(通过 name: '*' 等)
使用仓库

📝 推荐实践(跨平台 Playbook)

如果你希望写一个能同时支持 CentOS 和 Ubuntu 的 Playbook,可以这样写:

- name: 安装 nginx,根据系统类型选择模块
  vars:
    ansible_distribution_major_version: "{{ ansible_distribution_major_version | int }}"
  tasks:
    - name: 使用 yum 安装 nginx(RHEL/CentOS)
      yum:
        name: nginx
        state: present
      when:
        - ansible_facts['os_family'] == 'RedHat'

    - name: 使用 apt 安装 nginx(Ubuntu/Debian)
      apt:
        name: nginx
        state: present
        update_cache: yes
      when:
        - ansible_facts['os_family'] == 'Debian'

✅ 总结

场景推荐模块
在 CentOS/RHEL 上安装软件包yum
在 Ubuntu/Debian 上安装软件包apt
配置 YUM/APT 仓库源❌ 不适合,应使用 yum_repository 或自定义文件管理
安装本地 .rpm.deb 文件❌ 不适合,应使用 yumdpkg 模块

🌟systemd模块

Ansible 的 systemd** 模块** 用于在使用 systemd 作为初始化系统的 Linux 主机上管理服务(如启动、停止、重启服务,设置开机自启等)。它是 Ansible 中用于服务管理的核心模块之一。

📌 systemd 模块特点:

  • 支持常见的服务操作:启动、停止、重启、重载
  • 可设置服务是否开机自启
  • 可检查服务状态(是否运行)
  • 兼容大多数现代 Linux 发行版(如 CentOS 7+/RHEL 7+, Ubuntu 16.04+, Debian 8+)

✅ 基本语法:

- name: 描述任务
  systemd:
    name: 服务名称(如 httpd, nginx)
    state: started / stopped / restarted / reloaded
    enabled: yes / no(是否开机自启)
    daemon_reload: yes / no(是否重新加载 systemd 配置)

📚 示例 1:启动并启用一个服务(如 Nginx)

- name: 启动并启用 Nginx 服务
  systemd:
    name: nginx
    state: started
    enabled: yes

📚 示例 2:重启服务(如 Apache)

- name: 重启 Apache 服务
  systemd:
    name: httpd
    state: restarted

📚 示例 3:停止并禁用开机启动的服务

- name: 停止并禁用 postfix 服务
  systemd:
    name: postfix
    state: stopped
    enabled: no

📚 示例 4:仅设置开机启动但不立即启动服务

- name: 设置 MySQL 开机自启,但不启动
  systemd:
    name: mariadb
    enabled: yes

注意:没有指定 state 参数时,只会影响 enabled 状态。

📚 示例 5:先重载 systemd 再启动服务(适合新服务或配置更新后)

- name: 重载 systemd 并启动 myapp 服务
  systemd:
    name: myapp
    state: started
    daemon_reload: yes

📌 常用参数说明:

参数名说明
name服务单元名称(如 nginx, httpd
state服务状态: started(启动) stopped(停止) restarted(重启) reloaded(重载)
enabled是否开机自启(yes/no)
daemon_reload是否执行 systemctl daemon-reload(适合新增服务或修改了 service 文件)

✅ 总结对比:

功能推荐模块
管理服务启动/停止/重启systemd
安装软件包❌ 不适合,应使用 yumapt
修改服务配置文件❌ 不适合,应使用 copytemplate
在旧系统(SysVinit)上管理服务❌ 不适合,应使用 service 模块

🌟mysql_db/mysql_user模块

在 Ansible 中,mysql_dbmysql_user 是两个用于管理 MySQL 数据库和用户 的模块,非常适合自动化部署 MySQL 相关的配置。它们通常用于:

  • 创建/删除数据库(mysql_db
  • 创建/删除用户、设置权限(mysql_user

✅ 前提条件:

使用这些模块前需要确保远程主机上已安装以下组件:

  • mysql
  • python3-PyMySQLMySQLdb(Python MySQL 驱动)

可以通过以下命令安装依赖:

ansible -m yum -a "name=python3-PyMySQL state=present" your_host

📌mysql_user 模块

🔧 功能:

管理 MySQL 用户账户:创建、删除、授予权限、设置密码等。

✅ 示例 1:创建一个 MySQL 用户并授权访问某个数据库

- name: 创建 MySQL 用户 'app_user' 并授权访问 'app_db'
  mysql_user:
    login_user: root
    login_password: root_password
    name: app_user
    password: secure_password
    priv: "app_db.*:ALL"
    host: "%"
    state: present

上述操作相当于执行 SQL:

CREATE USER 'app_user'@'%' IDENTIFIED BY 'secure_password';
GRANT ALL PRIVILEGES ON app_db.* TO 'app_user'@'%';
FLUSH PRIVILEGES;

✅ 示例 2:删除一个 MySQL 用户

- name: 删除 MySQL 用户 'temp_user'
  mysql_user:
    login_user: root
    login_password: root_password
    name: temp_user
    host: "localhost"
    state: absent

✅ 示例 3:修改用户权限

- name: 修改用户权限为只读
  mysql_user:
    login_user: root
    login_password: root_password
    name: app_user
    priv: "app_db.*:SELECT"
    host: "%"
    append_privs: no

append_privs=no 表示覆盖原有权限;yes 表示追加权限。

📌mysql_db 模块

🔧 功能:

管理 MySQL 数据库:创建、删除数据库,以及导入/导出数据。

✅ 示例 1:创建一个数据库

- name: 创建数据库 'my_database'
  mysql_db:
    login_user: root
    login_password: root_password
    name: my_database
    state: present

✅ 示例 2:创建数据库并指定字符集

- name: 创建数据库并设置字符集
  mysql_db:
    login_user: root
    login_password: root_password
    name: utf8_database
    encoding: utf8mb4
    collation: utf8mb4_unicode_ci
    state: present

✅ 示例 3:导出数据库(备份)

- name: 导出数据库到文件
  mysql_db:
    login_user: root
    login_password: root_password
    name: my_database
    dump:
      target: /backup/my_database.sql

✅ 示例 4:导入数据库(恢复)

- name: 从文件导入数据库
  mysql_db:
    login_user: root
    login_password: root_password
    name: my_database
    state: import
    target: /backup/my_database.sql

📌 参数说明(常见):

mysql_user 模块常用参数:

参数名说明
login_user登录 MySQL 的用户名(如 root)
login_password登录密码
name要操作的 MySQL 用户名
password设置用户的密码
host用户的访问主机(默认 localhost)
priv权限设置格式为 db.table:privileges
statepresent(存在)、absent(不存在)

mysql_db 模块常用参数:

参数名说明
name数据库名称
encoding字符集(如 utf8mb4)
collation排序规则
dump导出数据库时指定目标路径
import导入数据库时使用
target导出或导入的目标文件路径
statepresent, absent, import

✅ 总结对比:

功能推荐模块
管理 MySQL 用户mysql_user
管理 MySQL 数据库mysql_db
安装 MySQL 服务❌ 不适合,应使用 yumapt
执行自定义 SQL 脚本❌ 可用 shell 模块实现

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

朱包林

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值