43ansible常用模块及变量定义方式
发布时间:2026/9/7 18:34:15 作者:尧图编辑部 阅读量:1,286

10 个Ansible 常用核心模块1yum- name: 安装nginx服务 yum: name: nginx state: present / latest /absent update_cache: yes2copy# 本地文件复制到远程主机并设置权限 - 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.txt3group# 创建系统组nginxGID为999 - name: 创建nginx系统组 group: name: nginx state: present gid: 999 system: yes # 删除测试组test_group - name: 删除test_group组 group: name: test_group state: absent4user# 创建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/test5file# 创建目录/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: absent6mount# 挂载/dev/sdb1到/dataext4文件系统永久生效 - 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# 每天凌晨3点执行备份脚本root用户 - name: 添加备份定时任务 cron: name: 系统数据备份 user: root minute: 0 hour: 3 job: /usr/local/bin/backup.sh /var/log/backup.log 21 # 输出重定向到日志 # 每5分钟检查磁盘空间nginx用户 - name: 添加磁盘检查任务 cron: name: 检查磁盘空间 user: nginx minute: */5 # 每5分钟 job: df -h | grep /data /home/nginx/disk_usage.log # 删除名为旧任务的定时任务 - name: 删除无用定时任务 cron: name: 旧任务 state: absent8unarchive# 本地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: 07559mysql_db# 先安装依赖远程主机需安装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: 12345610systemd# 启动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: no11debug参数说明msg输出自定义字符串 / 表达式最常用var直接输出变量名不要{{}}自动打印变量内容 类型verbosity调试级别1~5默认 0只有-v对应 verbosity1-vvv对应 3字段含义nginx_check.stdout标准输出完整字符串nginx_check.stdout_lines标准输出按行切分 →列表nginx_check.stderr错误输出完整字符串nginx_check.stderr_lines错误输出按行切分 →列表nginx_check.rc命令返回码5种常用变量定义方式一、Play 内直接定义变量核心特点变量只在当前 Play 生效适合简单场景或临时测试无需额外文件。1. 列表式定义多个独立变量- hosts: web01 vars: # 变量定义段 - p1: wget # 变量名: 变量值字符串直接写列表/字典需用对应格式 - p2: lrzsz tasks: - name: 安装多个软件使用列表式变量 yum: name: - {{ p1 }} # 引用变量单独存在时必须加双引号 - {{ p2 }} state: present2. 单变量多值变量是列表类型更简洁- 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: present2. 多个变量文件复用不同场景的变量步骤 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. 定义变量主机组变量# /etc/ansible/hosts nfs ansible_ssh_host10.0.0.31 [webs] # 主机组 web01 ansible_ssh_host10.0.0.7 web02 ansible_ssh_host10.0.0.8 [webs:vars] # 给 webs 组所有主机定义变量 p1wget # 这里用 赋值ini格式也支持 yaml 格式 p2lrzsz2. 引用变量直接使用无需额外定义- hosts: webs # 针对 webs 组主机 tasks: - name: 安装主机清单中定义的软件 yum: name: - {{ p1 }} - {{ p2 }} state: present四、host_vars/group_vars 定义官方推荐Ansible 会自动识别host_vars和group_vars两个目录需和 Inventory 文件在同一级目录变量文件的命名有严格规则1. group_vars组专属变量示例创建group_vars/webs.yml给 webs 组所有主机配置公共变量# group_vars/webs.ymlwebs 组所有主机都生效 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、系统版本等无需手动定义直接引用即可适合动态场景。# 查看 web01 主机的所有系统信息-i 指定 inventory 文件可选 ansible web01 -m setup # 示例 1只查看内存相关信息过滤 ansible_mem* 开头的变量 ansible web01 -m setup -a filteransible_mem* # 示例 2只查看 CPU 相关信息 ansible web01 -m setup -a filteransible_processor* # 示例 3只查看网络相关信息IP、网卡等 ansible web01 -m setup -a filteransible_default_ipv4 # 默认网卡 IP 信息 ansible web01 -m setup -a filteransible_eth* # 以太网网卡信息CentOS 7 ansible web01 -m setup -a filteransible_en* # 以太网网卡信息CentOS 8/Ubuntu # 示例 4只查看操作系统相关信息 ansible web01 -m setup -a filteransible_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.7web02 主机创建/root/web02_10.0.0.8register注册变量用register: 变量名把命令执行的完整结果保存到变量中用debug模块读取变量中的具体字段如 stdout、stderr、返回码等。- 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执行时必显示verbosity1 需加 -v 参数才显示 # 第三步查看具体字段实战常用 - name: 只打印错误信息若配置有误 debug: msg: Nginx 配置错误{{ nginx_check.stderr_lines }} # 错误输出按行分割 when: nginx_check.rc ! 0 # 条件判断只有返回码非0失败时才执行这是我的个人学习笔记主要用于记录自己对知识点的理解和梳理。由于目前仍在学习探索阶段内容中难免存在理解偏差或表述疏漏恳请各位大佬不吝赐教多提宝贵意见 若有不同看法欢迎理性交流探讨感谢包容与指正