Ansible-->vars变量

4338 字
22 分钟
Ansible-->vars变量

Ansible—>vars变量#

[TOC]


概述#

  • 变量提供了便捷的方式来管理 Ansible playbook 项目中的 动态值
    • ==方便维护==
    • ==易读==
    • ==修改简单==

定义变量#

1️⃣直接在play定义变量#

Terminal window
'在tasks: 之前定义'
[root@m01 ~]# mkdir /home/ansible
[root@m01 ~]# cd /home/ansible/
1)单一变量
[root@m01 ansible]# vim a.yml
- hosts: web01
gather_facts: no
vars:
- file1: /tmp/a.txt
# 下面还有个tasks,别忘了
tasks:
- name: Create file /tmp/a.txt
file:
path: "{{ file1 }}"
owner: www
group: www
mode: 0644
state: touch
[root@m01 ansible]# ssh web01 "ls -lh /tmp/a.txt"
-rw-r--r-- 1 www www 0 Apr 3 14:41 /tmp/a.txt
# 成功创建这个文件!
2)多个变量
# vars: 使用列表的方式
file:
'一次性创建多个路径文件'
path:
- "{{ file1 }}"
- "{{ file2 }}"
state: touch
❌️这种方式行不通!
'也就只有yum下载软件包的时候,name:可以这么分!'
✅️正确方式⬇️
[root@m01 ansible]# vim a.yml
- hosts: web01
gather_facts: no
vars:
- file1: /tmp/a.txt
- file2: /tmp/b.txt
# 下面还有个tasks,别忘了
tasks:
- name: Create file /tmp/a.txt
file:
path: "{{ file1 }}"
state: touch
- name: Create file /tmp/b.txt
file:
path: "{{ file2 }}"
state: touch
[root@m01 ansible]# ansible-playbook --syntax-check a.yml
playbook: a.yml
[root@m01 ansible]# ansible-playbook a.yml
web01: ok=2 changed=2
3)是否加引号❓️
# 注意如果path参数中携带路径,则变量不需要加双引号
[root@m01 ansible]# cat a.yml
- hosts: web01
gather_facts: no
vars:
- file1: c.txt
tasks:
- name: Create file /tmp/a.txt
file:
path: /tmp/{{ file1 }}
# 不需要加双引号
state: touch
[root@m01 ansible]# ansible-playbook --syntax-check a.yml
playbook: a.yml
[root@m01 ansible]# ssh web01 "ls /tmp/c.txt"
ls: cannot access '/tmp/c.txt': No such file or directory
[root@m01 ansible]# ansible-playbook a.yml
[root@m01 ansible]# ssh web01 "ls /tmp/c.txt"
/tmp/c.txt
4)一次安装多个软件
[root@m01 ansible]# cat a.yml
- hosts: web01
gather_facts: no
vars:
- pack1: wget
- pack2: lrzsz
tasks:
- name: Install pack
yum:
name:
- "{{pack1}}"
- "{{pack2}}"
state: present
[root@m01 ansible]# ansible-playbook --syntax-check a.yml
playbook: a.yml
[root@m01 ansible]# ansible-playbook a.yml
'其实上面这个方法还是挺冗余的!'
✅️一个变量赋多个值
# 这个简便!
[root@m01 ansible]# cat a.yml
- hosts: web01
gather_facts: no
vars:
pack:
# 一个变量里面放多个值
- wget
- lrzsz
tasks:
- name: Install pack
yum:
name: "{{pack}}"
state: present
[root@m01 ansible]# ansible-playbook --syntax-check a.yml
playbook: a.yml
[root@m01 ansible]# ansible-playbook a.yml

2️⃣在文件中定义变量#

Terminal window
1)先在文件中定义变量
[root@m01 ansible]# vim vars1.yml
pk1: wget
pk2: tree
2)在剧本中调用变量文件
[root@m01 ansible]# vim a.yml
- hosts: web01
gather_facts: no
vars_files:
# 这里是变量文件
- vars1.yml
tasks:
- name: Install pack
yum:
name:
- "{{pk1}}"
- "{{pk2}}"
state: present
[root@m01 ansible]# ansible-playbook a.yml
3)调用多个变量文件
[root@m01 ansible]# vim vars2.yml
pk3: lrzsz
# 又一个变量文件
[root@m01 ansible]# vim a.yml
- hosts: web01
gather_facts: no
vars_files:
- vars1.yml
- vars2.yml
tasks:
- name: Install pack
yum:
name:
- "{{pk1}}"
- "{{pk2}}"
- "{{pk3}}"
state: present
[root@m01 ansible]# ansible-playbook a.yml

3️⃣在主机清单定义变量#

Terminal window
1)主机清单中定义
[root@m01 ansible]# vim /etc/ansible/hosts
[webs]
web0[1:2]
[webs:vars]
# 给webs组定义两个变量
pk1=wget
pk2=tree
2)调用变量
[root@m01 ansible]# vim a.yml
- hosts: webs
# 这里是webs
gather_facts: no
tasks:
- name: Install pack
yum:
name:
- "{{pk1}}"
- "{{pk2}}"
state: present
[root@m01 ansible]# ansible-playbook a.yml
web01 : ok=1
web02 : ok=1

4️⃣官方推荐定义变量#

Terminal window
1)在当前运行playbook的目录下'创建两个目录'
group_vars
# 在目录下面,创建组名称命名的文件
# ✅️然后在文件中直接定义变量
hosts_vars
# 创建主机命名的文件
======================================
[root@m01 ansible]# mkdir group_vars host_vars
[root@m01 ansible]# ls | egrep ".*_vars"
group_vars
host_vars
2)在group_vars下创建webs文件
# 以组名-->命名文件
[root@m01 ansible]# vim /etc/ansible/hosts
# 先把原来主机清单里面的变量删除了
[root@m01 ansible]# vim group_vars/webs
pk1: wget
pk2: tree
[root@m01 ansible]# cat a.yml
- hosts: webs
gather_facts: no
tasks:
- name: Install pack
yum:
name:
- "{{pk1}}"
- "{{pk2}}"
state: present
# 还是上面的配置文件!
[root@m01 ansible]# ansible-playbook a.yml
ok: [web01]
ok: [web02]
3)对单台主机定义变量
[root@m01 ansible]# vim host_vars/db02
# 这里是db02
pk1: wget
pk2: tree
[root@m01 ansible]# vim a.yml
- hosts: db02
# 只有db02可以引用变量
# 下面还是一样的
[root@m01 ansible]# ansible-playbook a.yml
db02 : ok=1
4)all
'all表示所有主机'--->主机清单里面的所有主机!
[root@m01 ansible]# cat /etc/ansible/hosts
db02
[webs]
web0[1:2]
'所有主机都开着!'
[root@m01 ansible]# vim host_vars/all
pk1: wget
pk2: tree
[root@m01 ansible]# vim a.yml
- hosts: all
[root@m01 ansible]# ansible-playbook a.yml
ok: [db02]
ok: [web02]
ok: [web01]

📚debug&变量注册#

通俗版解释:

  • “这就好比你在 Linux 里敲完命令,屏幕上会‘哗啦啦’显示一堆结果,你一看就知道刚才那步做没做成

  • 但在 Ansible 里,默认情况下它只给你看个大概(比如‘变了’或‘没变’),具体的输出结果它都藏在肚子里不给你看

这时候,变量注册就派上用场了!

它的作用就是把 Ansible 藏在肚子里的那些运行结果(比如命令的输出、报错信息、成功与否的状态码)全都抓取出来,存到一个你指定的变量里

存好之后,你想什么时候看就什么时候看,或者拿这些结果去判断下一步该干嘛,特别灵活”

==变量注册就是把 Ansible 运行时的“心里话”(返回值)掏出来,变成你能随时调用的 变量==

Terminal window
我们以nginx举例,检查nginx的配置是否正确
需要用到nginx -t命令!!
[root@m01 ansible]# vim b.yml
- hosts: web01
gather_facts: no
tasks:
- name: nginx check
command: 'nginx -t'
[root@m01 ansible]# ansible-playbook --syntax-check b.yml
[root@m01 ansible]# ansible-playbook b.yml
changed: [web01]
# 你只知道它改变了,不知道最后结果如何!!
[root@web01 ~]# head -1 /etc/nginx/nginx.conf
ser www;
'将web01的配置文件故意改错!!'
[root@m01 ansible]# ansible-playbook b.yml
fatal: [web01]: FAILED!
# 再次执行报错!
nginx: configuration file /etc/nginx/nginx.conf test failed
'改回来'
[root@web01 ~]# head -1 /etc/nginx/nginx.conf
user www;
[root@m01 ansible]# vim b.yml
- hosts: web01
gather_facts: no
tasks:
- name: nginx check
command: 'nginx -t'
register: nginx_re
# 将nginx -t的结果赋值给nginx_re
# 这个变量注册也是一个模块,和command模块平级!
- name: Print nginx_result
debug:
msg: "{{nginx_re}}"
# 这里需要用到debug模块中的msg,打印消息
[root@m01 ansible]# ansible-playbook --syntax-check b.yml
[root@m01 ansible]# ansible-playbook b.yml
PLAY [web01] *************
TASK [nginx check] ******************
changed: [web01]
TASK [Print nginx_result] *************
ok: [web01] => {
"msg": {
"changed": true,
"cmd": [
"nginx",
"-t"
],
"delta": "0:00:00.004444",
"end": "2026-04-04 15:04:48.508624",
"failed": false,
"msg": "",
✅️"rc": 0,
"start": "2026-04-04 15:04:48.504180",
"stderr": "nginx: the configuration file /etc/nginx/nginx.conf syntax is ok\nnginx: configuration file /etc/nginx/nginx.conf test is successful",
✅️"stderr_lines": [
"nginx: the configuration file /etc/nginx/nginx.conf syntax is ok",
"nginx: configuration file /etc/nginx/nginx.conf test is successful"
],
"stdout": "",
"stdout_lines": []
}
}
PLAY RECAP ******************
web01 : ok=2
'是打印出来了,就是东西太多了!!!'
======================================
✅️按照层级关系输出内容✅️
msg: "{{nginx_re.rc}}"
# 打印.rc可以获得是否执行成功!
ok: [web01] => {
"msg": "0"
}
msg: "{{nginx_re.stderr_lines}}"
# 这个就是命令行中的内容
ok: [web01] => {
"msg": [
"nginx: the configuration file /etc/nginx/nginx.conf syntax is ok",
"nginx: configuration file /etc/nginx/nginx.conf test is successful"
]
}
======================================
✅️df -h同理
[root@m01 ansible]# vim b.yml
- name: result
command: 'df -h'
register: re
# 把结果赋值给re
- name: Print result
debug:
msg: "{{re}}"
#✅️ 先整个打印re
ok: [web01] => {
"msg": {
"changed": true,
"cmd": [
"df",
"-h"
],
"delta": "0:00:00.002389",
"end": "2026-04-04 15:17:27.500815",
"failed": false,
"msg": "",
"rc": 0,
"start": "2026-04-04 15:17:27.498426",
"stderr": "",
"stderr_lines": [],
"stdout": "...",
✅️"stdout_lines": [
"Filesystem Size Used Avail Use% Mounted on",
"devtmpfs 459M 0 459M 0% /dev",
"tmpfs 475M 0 475M 0% /dev/shm",
"tmpfs 475M 13M 462M 3% /run",
"tmpfs 475M 0 475M 0% /sys/fs/cgroup",
"/dev/sda3 49G 4.0G 45G 9% /",
"/dev/sda1 195M 122M 74M 63% /boot",
"tmpfs 95M 0 95M 0% /run/user/0"
]
}
}
# 按照层级关系,只获取想要打印的详细信息
✅️msg: "{{re.stdout_lines}}"
[root@m01 ansible]# ansible-playbook b.yml
ok: [web01] => {
"msg": [
"Filesystem Size Used Avail Use% Mounted on",
"devtmpfs 459M 0 459M 0% /dev",
"tmpfs 475M 0 475M 0% /dev/shm",
"tmpfs 475M 13M 462M 3% /run",
"tmpfs 475M 0 475M 0% /sys/fs/cgroup",
"/dev/sda3 49G 4.0G 45G 9% /",
"/dev/sda1 195M 122M 74M 63% /boot",
"tmpfs 95M 0 95M 0% /run/user/0"
]
}

层级定义变量#

特性点号表示法 (lnmp.nginx.pk1)方括号表示法 (lnmp['nginx']['pk1'])
给人的感觉简洁、清爽。写起来快,看着也舒服,像访问对象的属性严谨、啰嗦。写起来要敲很多引号和括号,但看着很稳
适用场景适合规规矩矩的变量名(纯字母、数字、下划线)适合千奇百怪的变量名
容错率==低== 变量名稍微有点特殊字符就报错==高== 几乎通吃所有情况

在 Ansible 里,当你面对像 lnmp.nginx.pk1lnmp['nginx']['pk1'] 这种多层级的变量时,确实容易犯嘀咕


为什么说**“点号”**有限制?(颜值派的烦恼)

  • 它只能识别: 字母、数字、下划线

一旦你的变量名里出现了以下“刺头”,点号法就会直接报错:

  • 连字符/减号 (-):比如 lnmp.nginx-pk1(Ansible 会以为你要做减法运算)
  • 空格:比如 lnmp.my key(Ansible 会懵圈,不知道哪里是结尾)
  • 以数字开头:比如 lnmp.1st_package

为什么**“方括号”**是万能药?(实力派的担当)

  • 方括号表示法(['key'])就像给变量名穿了件防弹衣

  • 只要用引号包起来放在方括号里,Ansible 都能精准找到它

虽然点号写法(.)看着很爽,但在写复杂的 Playbook 时,为了避免因为变量名里突然多了个横杠(-)而导致报错

  • 官方其实更推荐使用方括号写法(['key']
  • 别忘记引入变量文件
    • vars_files: 文件名
Terminal window
1)层级定义变量
[root@m01 ansible]# vim vars1.yml
lnmp:
nginx:
pk1: wget
# 同样是两个空格,进行缩进!
2)引用文件、调用变量
[root@m01 ansible]# vim a.yml
- hosts: web01
gather_facts: no
vars_files: vars1.yml
tasks:
- name: Install pack
yum:
name:
- "{{lnmp['nginx']['pk1']}}"
state: present
[root@m01 ansible]# ansible-playbook a.yml
ok: [web01]
'当然我们也可以使用点.'
name:
- "{{lnmp.nginx.pk1}}"
[root@m01 ansible]# ansible-playbook a.yml
ok: [web01]
3)多个层级列表的方式
[root@m01 ansible]# vim vars1.yml
lnmp:
nginx:
pk1: wget
pk2: tree
[root@m01 ansible]# vim a.yml
# 调用
name:
- "{{lnmp.nginx.pk1}}"
- "{{lnmp['nginx']['pk2']}}"
# 一个用点.一个用方括号+引号
[root@m01 ansible]# ansible-playbook a.yml
ok: [web01]

Facts缓存#

🤔 什么是 **Ansible Facts **?(通俗版)

你可以想象成 Ansible 在干活之前,先给被管理主机做的一次**“全身体检”**

  • 默认情况 (gather_facts: yes)
    • Ansible 就像个负责任的医生,每次去主机上执行任务前,都要先花几秒钟问一遍:“你叫什么名字?IP是多少?内存多大?系统啥版本?”
    • 这就导致了你感觉到的**“卡顿”**
    • 主机越多,体检时间越长
  • Ad-hoc 对应模块setup模块
    • 可以去参考 📚Ansible 01
    • 在命令行直接用 ansible ... -m setup,就是在手动触发这个“体检”
  • 为什么要缓存?
    • 如果主机信息不常变,我们没必要每次都体检
    • 把第一次体检的结果存起来(缓存)
    • 下次直接用,速度就会飞快

🚀 怎么开启缓存来解决 “卡顿” 问题❓️

  • 这就像把体检报告复印一份存档,下次直接看存档,不用再问主机了
Terminal window
'最简单的方案(使用 JSON 文件缓存)'
1)找到ansible.cfg
# 配置文件!
[root@m01 ansible]# updatedb
[root@m01 ansible]# locate ansible.cfg
/etc/ansible/ansible.cfg
2)编辑修改
[root@m01 ansible]# vim /etc/ansible/ansible.cfg
# 在 [defaults] 下面加上这几行配置
[defaults]
✅️gathering = smart
# 开启智能模式:如果有缓存就用缓存,没有才去收集
✅️fact_caching = jsonfile
# 指定缓存方式为 jsonfile(存成本地文件)
✅️fact_caching_connection = /tmp/ansible_fact_cache
# 指定缓存文件存到哪里
✅️fact_caching_timeout = 86400
# 缓存多久失效(秒),这里设置 24 小时
[defaults]
host_key_checking = False
deprecation_warnings = False
interpreter_python = /usr/bin/python3
gathering = smart
fact_caching = jsonfile
fact_caching_connection = /tmp/ansible_fact_cache
fact_caching_timeout = 86400
[inventory]
[privilege_escalation]
[paramiko_connection]
[ssh_connection]
[persistent_connection]
[accelerate]
[selinux]
[colors]
[diff]

配置后的效果:

  • 第一次运行:Ansible 会慢一点,因为它在收集信息并存到 /tmp 目录下
  • 第二次运行(24小时内):Ansible 会直接读取文件,速度瞬间完成,不再卡顿!

这样既保留了获取信息的能力,又解决了速度慢的问题

Terminal window
[root@m01 ansible]# ll /tmp/ansible_fact_cache
ls: cannot access '/tmp/ansible_fact_cache': No such file or directory
# 刚开始没有这个!
[root@m01 ansible]# vim a.yml
- hosts: web01
[root@m01 ansible]# ansible-playbook a.yml
PLAY [web01] *************
TASK [Gathering Facts] ***
ok: [web01]
# 第一次进行了信息收集!
[root@m01 ansible]# ll /tmp/ansible_fact_cache
total 28
-rw------- 1 root root 25381 Apr 4 16:57 web01
# 执行一遍之后,就收集下来了!
[root@m01 ansible]# cat /tmp/ansible_fact_cache/web01
# 里面装的是web01的一些信息!
{
"_ansible_facts_gathered": true,
"ansible_all_ipv4_addresses": [
"10.0.0.7",
"172.16.1.7"
................
[root@m01 ansible]# ansible-playbook a.yml
PLAY [web01] *************
'再次执行就直接省略信息收集这一步了!'
🈚Gathering Facts🈚# 压根没有这一步!
TASK [Install pack] *******
ok: [web01]

📊 常用 Facts 变量速查表

Tip

Ansible开篇 对应的 setup 模块就是这个

  • ansible all -m setup -a “filter=ansible_default_ipv4”
频率变量名含义 (通俗解释)
🔥 极高ansible_hostname✅️主机名
🔥 极高ansible_all_ipv4_addresses✅所有 IPv4 地址(简短)
🔥 极高ansible_default_ipv4.address✅️默认的IPv4地址(信息全)
🔥 极高ansible_distribution✅️操作系统名称
🔥 极高ansible_processor_vcpusCPU 总核心数
🔥 极高ansible_memtotal_mb系统总内存
⭐ 常用ansible_distribution_major_version系统主版本号
⭐ 常用ansible_machine硬件架构
⭐ 常用ansible_mounts磁盘挂载情况
⭐ 常用ansible_processorCPU 详细型号
⭐ 常用ansible_memory_mb✅详细内存信息(信息全)
📉 低频ansible_devices磁盘设备详情
📉 低频ansible_kernel内核版本
📉 低频ansible_eth0eth0 网卡信息
📉 低频ansible_lvmLVM 逻辑卷信息
📉 低频ansible_memfree_mb当前可用内存
📉 低频ansible_swaptotal_mbSwap 总大小
📉 低频ansible_swapfree_mbSwap 可用大小
📉 低频ansible_distribution_version系统具体版本号
Terminal window
'facts可以获取到客户端的信息-->赋值给相对的变量'
案例1.输出两台web的操作系统版本
[root@m01 ansible]# vim os.yml
- hosts: webs
tasks:
- name: print os info
debug:
msg: "{{ansible_distribution}}"
[root@m01 ansible]# ansible-playbook os.yml
ok: [web02] => {
"msg": "Kylin Linux Advanced Server"
}
ok: [web01] => {
"msg": "Kylin Linux Advanced Server"
}
案例2.输出两台web的IP地址
# 默认的IP地址
msg: "{{ansible_default_ipv4.address}}"
[root@m01 ansible]# ansible-playbook os.yml
ok: [web01] => {
"msg": "10.0.0.7"
}
ok: [web02] => {
"msg": "10.0.0.8"
}
案例3.需求创建出以主机名命名+IP地址的目录
WEB01: web01_10.0.0.7
WEB02: web02_10.0.0.8
[root@m01 ansible]# vim os.yml
- hosts: webs
tasks:
- name: Create dir /home/hostname_IP
file:
path: /home/{{ansible_hostname}}_{{ansible_default_ipv4.address}}
# 中间有个_下划线
state: directory
[root@m01 ansible]# ansible-playbook os.yml
changed: [web02]
changed: [web01]
[root@m01 ansible]# ssh web01 "ls -lh /home/"
total 0
drwxr-xr-x 2 root root 6 Apr 4 17:47 web01_10.0.0.7

📚template模块#

==copy 模块==:就像“复印机”

  • 它的逻辑:看到什么,就复制什么
  • 你的情况:当你用 copy 模块去拷贝 info.txt 时,它根本不懂 {{ ansible_hostname }} 是什么意思
  • 结果:它会把文件原封不动地搬过去
    • 主机 A 收到的文件里写着:hostname: {{ ansible_hostname }}
    • 主机 B 收到的文件里也写着:hostname: {{ ansible_hostname }}
    • 就像复印身份证,复印件上的字是不会变的

==template 模块==:就像“智能填空题”

  • 它的逻辑:先读懂内容,填好空,再打印
  • 你的情况:当你用 template 模块时,它会先打开 info.txt(这时候它叫模板文件),发现里面有 {{ ansible_hostname }}
    • 它会立刻去查当前这台主机的信息:“哦,这台机器叫 web-server-01”,然后把空填上,最后生成一个新文件发给主机
  • 结果:每个主机收到的都是“私人订制”的
    • 主机 A 收到的文件里写着:hostname: web-server-01
    • 主机 B 收到的文件里写着:hostname: db-server-02
    • 就像老师发卷子,虽然题目一样,但每个人填进去的答案是自己的
模块形象比喻对待变量 {{ xxx }} 的态度最终效果
copy复印机看不见:把它当成普通文字,直接复制粘贴所有主机文件内容==一模一样==
template填空题能看懂:把它当成指令,替换成真实的值每个主机文件内容==各不相同==

一句话口诀: 如果文件里没有花括号变量,用 copy(快) 如果文件里花括号变量,必须用 template(灵)

Terminal window
[root@m01 ansible]# vim info.txt
# 我们使用模版的时候,最好以j2结尾!
'详细的jinja2模版参考📚Ansible04'
# ✅️info.txt.j2----->说明它是jinja2模版
ip: {{ansible_default_ipv4.address}}
hostname: {{ansible_hostname}}
total_memory: {{ansible_memtotal_mb}}
'这里面不需要给双引号'
[root@m01 ansible]# vim c.yml
- hosts: webs
tasks:
- name: Test template
template:
src: ./info.txt
dest: /home/
[root@m01 ansible]# ansible-playbook --syntax-check c.yml
playbook: c.yml
[root@m01 ansible]# ansible-playbook c.yml
[root@m01 ansible]# ssh web01 "cat /home/info.txt"
ip: 10.0.0.7
hostname: web01
total_memory: 948
[root@m01 ansible]# ssh web02 "cat /home/info.txt"
ip: 10.0.0.8
hostname: web02
total_memory: 948
'他们的 IP地址 和 主机名 各不相同!'

backup重构#

Terminal window
[root@m01 ansible]# cd ~
[root@m01 ~]# ll
-rw-r--r-- 1 root root 410 Mar 30 15:17 rsyncd.conf
[root@m01 ~]# cp rsyncd.conf /home/ansible/
[root@m01 ~]# cd /home/ansible/
[root@m01 ansible]# ls rsyncd.conf
rsyncd.conf
1)配置文件更换成变量
# 配合template模块
[root@m01 ansible]# vim rsyncd.conf
uid = {{user}}
gid = {{user}}
port = {{port}}
log file =/var/log/rsyncd.log
....
############################
....
[data]
path = {{dir}}
'恢复快照,免密登录省略'
# 10.0.0.41
2)重新编辑剧本
# 这里选择在剧本中定义变量
[root@m01 ansible]# vim backup.yml
- hosts: backup
gather_facts: no
vars:
- user: www
- port: 873
- dir: /data
tasks:
- name: Install rsync server
yum:
name: rsync
state: present
- name: Configure rsync file
template:
src: ./rsyncd.conf
dest: /etc/
- name: Create group "{{user}}"
group:
name: "{{user}}"
gid: 888
- name: Create user "{{user}}"
user:
name: "{{user}}"
uid: 888
group: "{{user}}"
shell: /sbin/nologin
create_home: false
- name: Create dir "{{dir}}"
file:
path: "{{dir}}"
state: directory
owner: "{{user}}"
group: "{{user}}"
- name: Create dir /backup
file:
path: /backup
state: directory
owner: "{{user}}"
group: "{{user}}"
- name: Touch passwd file
copy:
content: "rsync_backup:123"
dest: /etc/rsync.passwd
mode: 0600
- name: Touch log file
file:
path: /var/log/rsyncd.log
state: touch
owner: "{{user}}"
group: "{{user}}"
- name: Start rsyncd server
systemd:
name: rsyncd
state: started
enabled: yes
[root@m01 ansible]# ansible-playbook --syntax-check backup.yml
playbook: backup.yml
[root@m01 ansible]# ansible-playbook backup.yml
[WARNING]: Found variable using reserved name: port
# 这个变量port,系统也在用!
# 它是紫色的警告!但是也能跑,无伤大雅
backup : ok=9 changed=8
'测试'
[root@m01 ansible]# rsync -avz /etc/hosts rsync_backup@172.16.1.41::data
Password:
hosts
sent 225 bytes received 43 bytes 76.57 bytes/sec
total size is 363 speedup is 1.35
[root@m01 ansible]# ssh backup "ls /data/"
hosts

nfs重构#

Terminal window
'同样也是恢复快照!-->免密登录!'
1)配置文件中变量的修改
[root@m01 ansible]# vim exports
{{dir}} 172.16.1.0/24(rw,sync,all_squash,anonuid={{ id }},anongid={{ id }})
2)编写剧本
[root@m01 ansible]# vim nfs.yml
- hosts: nfs01
gather_facts: no
vars:
- dir: /data/wp
- id: 888
tasks:
- name: Install nfs server
yum:
name: nfs-utils
state: present
- name: Configure nfs file
template:
src: ./exports
dest: /etc/
- name: Create group www
group:
name: www
gid: "{{id}}"
- name: Create user www
user:
name: www
uid: "{{id}}"
group: www
shell: /sbin/nologin
create_home: false
- name: Create dir {{dir}}
file:
path: "{{dir}}"
state: directory
owner: www
group: www
- name: Start NFS Server
systemd:
name: nfs
state: started
enabled: yes
[root@m01 ansible]# ansible-playbook --syntax-check nfs.yml
playbook: nfs.yml
[root@m01 ansible]# ansible-playbook nfs.yml

文章分享

如果这篇文章对你有帮助,欢迎分享给更多人!

Ansible-->vars变量
https://www.kpyun.fun/posts/automation/ansible/ansible03/
作者
久棹
发布于
2026-05-28
许可协议
CC BY-NC-SA 4.0
Profile Image of the Author
久棹
只要胆子大,天天寒暑假!
公告
欢迎来到久棹的技术小站!本站专注 Linux 运维学习笔记分享,如有问题欢迎交流探讨 🎉
分类
标签
站点统计
文章
98
分类
11
标签
203
总字数
244,453
运行时长
0
最后活动
0 天前
站点信息
构建平台
Local
博客版本
Firefly v6.13.5
文章许可
CC BY-NC-SA 4.0

文章目录