43ansible常用模块及变量定义方式

10 个Ansible 常用核心模块

1yum

bash 复制代码
- name: 安装nginx服务
  yum:
    name: nginx
    state: present / latest /absent
    update_cache: yes

2copy

bash 复制代码
# 本地文件复制到远程主机(并设置权限)
- name: 复制nginx配置文件
  copy:
    src: ./local_nginx.conf
    dest: /etc/nginx/nginx.conf
    mode: 0644
    owner: root
    group: root
    backup: yes  # 覆盖前备份原文件为 nginx.conf.bak

# 远程主机内部复制文件
- name: 复制远程主机的日志文件到备份目录
  copy:
    src: /var/log/nginx/access.log
    dest: /data/backup/nginx/
    remote_src: yes  # 表示src是远程主机的路径

- name: 生成123456.txt
  copy:
    content: 123456
    dest: /data/backup/nginx/123456.txt

3group

bash 复制代码
# 创建系统组nginx(GID为999)
- name: 创建nginx系统组
  group:
    name: nginx
    state: present
    gid: 999
    system: yes

# 删除测试组test_group
- name: 删除test_group组
  group:
    name: test_group
    state: absent

4user

bash 复制代码
# 创建nginx系统用户(无登录shell,主组为nginx,附加组为wheel)
- name: 创建nginx系统用户
  user:
    name: nginx
    state: present
    group: nginx  # 关联之前创建的nginx组
    groups: wheel  # 附加到wheel组(可sudo)
    home: /var/www/nginx  # 自定义家目录
    shell: /sbin/nologin  # 禁止登录
    system: yes
    uid: 999  # 自定义UID

# 创建普通用户test,密码为123456(加密后)
- name: 创建普通用户test
  user:
    name: test
    state: present
    password: "$1$abc123$xyz7890123456789012345"  # 替换为实际加密后的密码
    shell: /bin/bash
    home: /home/test

5file

bash 复制代码
# 创建目录/data/logs,并设置权限和所有者
- name: 创建日志目录
  file:
    path: /data/logs
    state: directory
    mode: 0755
    owner: nginx
    group: nginx
    recurse: yes  # 若目录已存在,递归修改子内容权限

# 创建符号链接(/etc/nginx/conf.d 指向 /data/nginx/conf.d)
- name: 创建nginx配置符号链接
  file:
    src: /data/nginx/conf.d
    path: /etc/nginx/conf.d
    state: link
    force: yes  # 若已存在链接,强制覆盖

# 删除无用文件
- name: 删除临时文件
  file:
    path: /tmp/temp.txt
    state: absent

6mount

bash 复制代码
# 挂载/dev/sdb1到/data(ext4文件系统,永久生效)
- name: 挂载数据盘到/data
  mount:
    path: /data
    src: /dev/sdb1
    fstype: ext4
    state: mounted
    opts: defaults  # 默认挂载参数(rw, suid, dev等)

# 挂载NFS共享目录(192.168.1.100的/nfs/share到/local/nfs)
- name: 挂载NFS共享
  mount:
    path: /local/nfs
    src: 192.168.1.100:/nfs/share
    fstype: nfs
    state: mounted
    opts: rw,defaults,noatime  # 读写、默认参数、禁用访问时间记录

7cron

bash 复制代码
# 每天凌晨3点执行备份脚本(root用户)
- name: 添加备份定时任务
  cron:
    name: "系统数据备份"
    user: root
    minute: "0"
    hour: "3"
    job: "/usr/local/bin/backup.sh > /var/log/backup.log 2>&1"  # 输出重定向到日志

# 每5分钟检查磁盘空间(nginx用户)
- name: 添加磁盘检查任务
  cron:
    name: "检查磁盘空间"
    user: nginx
    minute: "*/5"  # 每5分钟
    job: "df -h | grep /data >> /home/nginx/disk_usage.log"

# 删除名为"旧任务"的定时任务
- name: 删除无用定时任务
  cron:
    name: "旧任务"
    state: absent

8unarchive

bash 复制代码
# 本地tar.gz文件解压到远程主机的/usr/local
- name: 解压nginx安装包
  unarchive:
    src: ./nginx-1.24.0.tar.gz
    dest: /usr/local/
    remote_src: no  # src是本地文件,自动上传到远程再解压
    owner: root
    group: root

# 远程主机上的zip文件解压到/data
- name: 解压远程zip包
  unarchive:
    src: /tmp/app.zip
    dest: /data/
    remote_src: yes  # src是远程主机的文件,直接解压
    mode: 0755

9mysql_db

bash 复制代码
# 先安装依赖(远程主机需安装PyMySQL)
- name: 安装mysql_db模块依赖
  pip:
    name: pymysql
    state: present

# 创建MySQL数据库test_db
- name: 创建test_db数据库
  mysql_db:
    name: test_db
    state: present
    login_user: root
    login_password: "123456"
    login_host: "127.0.0.1"

# 导入SQL文件到test_db
- name: 导入初始化SQL
  mysql_db:
    name: test_db
    state: import
    target: /tmp/init.sql  # 远程主机上的SQL文件路径
    login_user: root
    login_password: "123456"

# 删除无用数据库old_db
- name: 删除old_db数据库
  mysql_db:
    name: old_db
    state: absent
    login_user: root
    login_password: "123456"

10systemd

bash 复制代码
# 启动nginx服务并设置开机自启
- name: 启动并启用nginx服务
  systemd:
    name: nginx
    state: started
    enabled: yes

# 重启mysql服务(修改配置后)
- name: 重启mysql服务
  systemd:
    name: mysqld
    state: restarted
    daemon_reload: yes  # 若修改了mysqld.service文件,需重载配置

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

5种常用变量定义方式

一、Play 内直接定义变量

核心特点:变量只在当前 Play 生效,适合简单场景或临时测试,无需额外文件。

1. 列表式定义(多个独立变量)
复制代码
- hosts: web01
  vars:  # 变量定义段
    - p1: wget    # 变量名: 变量值(字符串直接写,列表/字典需用对应格式)
    - p2: lrzsz
  tasks:
    - name: 安装多个软件(使用列表式变量)
      yum:
        name:
          - "{{ p1 }}"  # 引用变量:单独存在时必须加双引号
          - "{{ p2 }}"
        state: present
2. 单变量多值(变量是列表类型,更简洁)
复制代码
- hosts: web01
  vars:
    pack:  # 变量是列表,包含多个值
      - wget
      - lrzsz
      - tree
  tasks:
    - name: 安装多个软件(使用列表变量)
      yum:
        name: "{{ pack }}"  # 直接引用列表变量,无需拆解
        state: present

变量单独存在时必须加双引号(如 {``{ p1 }}

变量带路径时可省略双引号(如 /root/{``{ ho }}_{``{ ip }}

二、变量文件定义

核心特点:将变量单独存放在文件中,多个 Playbook 可引用,便于维护和统一管理。

1. 单个变量文件(基础用法)

步骤 1:创建变量文件(如 vars/v1.yml,建议建 vars 目录归类)

复制代码
# vars/v1.yml
p1: lrzsz
p2: wget
p3: tree

步骤 2:在 Playbook 中引用变量文件

复制代码
- hosts: web01
  vars_files: ./vars/v1.yml  # 引用单个变量文件(相对路径/绝对路径均可)
  tasks:
    - name: 安装变量文件中定义的软件
      yum:
        name:
          - "{{ p1 }}"
          - "{{ p2 }}"
          - "{{ p3 }}"
        state: present
2. 多个变量文件(复用不同场景的变量)

步骤 1:创建多个变量文件

复制代码
# vars/v1.yml(工具类软件)
p1: tree

# vars/v2.yml(传输类软件)
pack:
  - lrzsz
  - rz

步骤 2:同时引用多个变量文件

复制代码
- hosts: web01
  vars_files:
    - ./vars/v1.yml  # 多个变量文件用列表形式
    - ./vars/v2.yml
  tasks:
    - name: 安装 v1.yml 中的软件
      yum:
        name: "{{ p1 }}"
        state: present

    - name: 卸载 v2.yml 中的软件
      yum:
        name: "{{ pack }}"
        state: absent

三、主机清单中定义变量

核心特点:变量定义在 /etc/ansible/hosts 中,与主机 / 组绑定,适合简单场景,但不利于变量管理(混合了主机配置和变量)。

  1. 定义变量(主机组变量)
bash 复制代码
# /etc/ansible/hosts
nfs ansible_ssh_host=10.0.0.31

[webs]  # 主机组
web01 ansible_ssh_host=10.0.0.7
web02 ansible_ssh_host=10.0.0.8

[webs:vars]  # 给 webs 组所有主机定义变量
p1=wget      # 这里用 = 赋值(ini格式),也支持 yaml 格式
p2=lrzsz
  1. 引用变量(直接使用,无需额外定义)

    • hosts: webs # 针对 webs 组主机
      tasks:
      • name: 安装主机清单中定义的软件
        yum:
        name:
        - "{{ p1 }}"
        - "{{ p2 }}"
        state: present

四、host_vars/group_vars 定义(官方推荐)

Ansible 会自动识别 host_varsgroup_vars 两个目录(需和 Inventory 文件在同一级目录),变量文件的命名有严格规则:

1. group_vars(组专属变量)示例

创建 group_vars/webs.yml(给 webs 组所有主机配置公共变量):

复制代码
# group_vars/webs.yml:webs 组所有主机都生效
p1: wget          # 之前的公共软件变量
p2: lrzsz
ansible_user: root  # 所有 web 主机统一登录用户
web_root: /var/www/html  # 所有 web 主机的网站根目录(自定义变量)
2. host_vars(主机专属变量)示例

假设 web02 主机的 SSH 端口不是默认 22(是 2222),且网站根目录和其他主机不同,创建 host_vars/web02.yml

复制代码
# host_vars/web02.yml:只对 web02 主机生效
ansible_port: 2222  # 单独修改 web02 的 SSH 端口
web_root: /home/www  # 覆盖组变量的 web_root(主机变量优先级更高)
3. 所有主机通用变量(all.yml)
复制代码
# group_vars/all.yml(所有主机都能使用的变量)
common_packages:
  - wget
  - curl
  - vim

五、Ansible 内置变量(无需定义,直接使用)

核心特点:Ansible 自动收集的目标主机信息(如主机名、IP、系统版本等),无需手动定义,直接引用即可,适合动态场景。

bash 复制代码
# 查看 web01 主机的所有系统信息(-i 指定 inventory 文件,可选)
ansible web01 -m setup


# 示例 1:只查看内存相关信息(过滤 ansible_mem* 开头的变量)
ansible web01 -m setup -a "filter=ansible_mem*"

# 示例 2:只查看 CPU 相关信息
ansible web01 -m setup -a "filter=ansible_processor*"

# 示例 3:只查看网络相关信息(IP、网卡等)
ansible web01 -m setup -a "filter=ansible_default_ipv4"  # 默认网卡 IP 信息
ansible web01 -m setup -a "filter=ansible_eth*"  # 以太网网卡信息(CentOS 7)
ansible web01 -m setup -a "filter=ansible_en*"  # 以太网网卡信息(CentOS 8/Ubuntu)

# 示例 4:只查看操作系统相关信息
ansible web01 -m setup -a "filter=ansible_os*"
实战示例(动态创建主机名 + IP 目录):
复制代码
- hosts: webs  # web01、web02 都会执行
  tasks:
    - name: 动态创建目录(主机名_IP)
      file:
        # 引用两个内置变量,拼接目录名
        path: "/root/{{ ansible_hostname }}_{{ ansible_default_ipv4.address }}"
        state: directory
        mode: 0755
效果:
  • web01 主机创建 /root/web01_10.0.0.7
  • web02 主机创建 /root/web02_10.0.0.8

register注册变量

  1. register: 变量名 把命令执行的完整结果保存到变量中;
  2. debug 模块读取变量中的具体字段(如 stdout、stderr、返回码等)。
bash 复制代码
- hosts: web01
  tasks:
    # 第一步:执行命令并注册变量
    - name: 检查 Nginx 配置语法
      command: nginx -t  # 注意:命令字符串无需加单引号(除非有特殊字符)
      register: nginx_check  # 注册结果到变量 nginx_check
      ignore_errors: yes  # 可选:即使命令失败(如配置错误),也继续执行后续任务(方便查看错误信息)

    # 第二步:查看完整结果(适合调试)
    - name: 打印 Nginx 检查的完整结果
      debug:
        var: nginx_check  # 简化写法:用 var 直接指定变量名,无需 msg 拼接
        verbosity: 0  # 默认为 0,执行时必显示(verbosity=1 需加 -v 参数才显示)

    # 第三步:查看具体字段(实战常用)
    - name: 只打印错误信息(若配置有误)
      debug:
        msg: "Nginx 配置错误:{{ nginx_check.stderr_lines }}"  # 错误输出(按行分割)
      when: nginx_check.rc != 0  # 条件判断:只有返回码非0(失败)时才执行

这是我的个人学习笔记,主要用于记录自己对知识点的理解和梳理。由于目前仍在学习探索阶段,内容中难免存在理解偏差或表述疏漏,恳请各位大佬不吝赐教,多提宝贵意见~ 若有不同看法,欢迎理性交流探讨,感谢包容与指正!

相关推荐
翼龙云_cloud1 小时前
阿里云渠道商:无影云电脑常见问题及其解决方法有哪些?
运维·服务器·阿里云·云计算·电脑
小白电脑技术1 小时前
飞牛NAS最近好奇怪啊?一段时间不重启,内存几乎快用完了?
linux·电脑
北珣.1 小时前
docker容器-命令
运维·docker·容器
幸运小猿1 小时前
启动项目报错,zookeeper影响的
linux·运维·服务器
liu****1 小时前
11.字符函数和字符串函数(一)
linux·运维·c语言·开发语言·数据结构·算法
honsor1 小时前
一种采用POE供电的RJ45网络型温湿度传感器
运维·服务器·网络
零匠学堂20251 小时前
woapi-server为Office Online Server文档在线预览提供文档加载地址
java·运维·服务器·oos·wopi
Tandy12356_1 小时前
手写TCP/IP协议栈——环境配置
服务器·网络·网络协议·tcp/ip
桃子叔叔1 小时前
Prompt Engineering完全指南:从基础到高阶技术实战
java·服务器·prompt