Ansible-->vars变量
Ansible—>vars变量
[TOC]
概述
- 变量提供了便捷的方式来管理
Ansible playbook项目中的 动态值- ==方便维护==
- ==易读==
- ==修改简单==
定义变量
1️⃣直接在play定义变量
'在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.ymlplaybook: a.yml[root@m01 ansible]# ansible-playbook a.ymlweb01: 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.ymlplaybook: 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.ymlplaybook: 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.ymlplaybook: a.yml[root@m01 ansible]# ansible-playbook a.yml2️⃣在文件中定义变量
1)先在文件中定义变量[root@m01 ansible]# vim vars1.ymlpk1: wgetpk2: 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.ymlpk3: 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.yml3️⃣在主机清单定义变量
1)主机清单中定义[root@m01 ansible]# vim /etc/ansible/hosts[webs]web0[1:2]
[webs:vars]# 给webs组定义两个变量pk1=wgetpk2=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.ymlweb01 : ok=1web02 : ok=14️⃣官方推荐定义变量
1)在当前运行playbook的目录下'创建两个目录'group_vars# 在目录下面,创建组名称命名的文件# ✅️然后在文件中直接定义变量hosts_vars# 创建主机命名的文件======================================[root@m01 ansible]# mkdir group_vars host_vars[root@m01 ansible]# ls | egrep ".*_vars"group_varshost_vars
2)在group_vars下创建webs文件# 以组名-->命名文件[root@m01 ansible]# vim /etc/ansible/hosts# 先把原来主机清单里面的变量删除了[root@m01 ansible]# vim group_vars/webspk1: wgetpk2: 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.ymlok: [web01]ok: [web02]
3)对单台主机定义变量[root@m01 ansible]# vim host_vars/db02# 这里是db02pk1: wgetpk2: tree[root@m01 ansible]# vim a.yml- hosts: db02# 只有db02可以引用变量# 下面还是一样的[root@m01 ansible]# ansible-playbook a.ymldb02 : ok=1
4)all'all表示所有主机'--->主机清单里面的所有主机![root@m01 ansible]# cat /etc/ansible/hostsdb02
[webs]web0[1:2]'所有主机都开着!'[root@m01 ansible]# vim host_vars/allpk1: wgetpk2: tree[root@m01 ansible]# vim a.yml- hosts: all[root@m01 ansible]# ansible-playbook a.ymlok: [db02]ok: [web02]ok: [web01]📚debug&变量注册
通俗版解释:
“这就好比你在 Linux 里敲完命令,屏幕上会‘哗啦啦’显示一堆结果,你一看就知道刚才那步做没做成
但在 Ansible 里,默认情况下它只给你看个大概(比如‘变了’或‘没变’),具体的输出结果它都藏在肚子里不给你看
这时候,变量注册就派上用场了!
它的作用就是把 Ansible 藏在肚子里的那些运行结果(比如命令的输出、报错信息、成功与否的状态码)全都抓取出来,存到一个你指定的变量里
存好之后,你想什么时候看就什么时候看,或者拿这些结果去判断下一步该干嘛,特别灵活”
==变量注册就是把 Ansible 运行时的“心里话”(返回值)掏出来,变成你能随时调用的 变量==
我们以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.ymlchanged: [web01]# 你只知道它改变了,不知道最后结果如何!![root@web01 ~]# head -1 /etc/nginx/nginx.confser www;'将web01的配置文件故意改错!!'[root@m01 ansible]# ansible-playbook b.ymlfatal: [web01]: FAILED!# 再次执行报错!nginx: configuration file /etc/nginx/nginx.conf test failed'改回来'[root@web01 ~]# head -1 /etc/nginx/nginx.confuser 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.ymlPLAY [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}}" #✅️ 先整个打印reok: [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.ymlok: [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.pk1 和 lnmp['nginx']['pk1'] 这种多层级的变量时,确实容易犯嘀咕
为什么说**“点号”**有限制?(颜值派的烦恼)
- 它只能识别: 字母、数字、下划线
一旦你的变量名里出现了以下“刺头”,点号法就会直接报错:
- 连字符/减号 (-):比如
lnmp.nginx-pk1(Ansible 会以为你要做减法运算) - 空格:比如
lnmp.my key(Ansible 会懵圈,不知道哪里是结尾) - 以数字开头:比如
lnmp.1st_package
为什么**“方括号”**是万能药?(实力派的担当)
-
方括号表示法(
['key'])就像给变量名穿了件防弹衣 -
只要用引号包起来放在方括号里,Ansible 都能精准找到它
虽然点号写法(
.)看着很爽,但在写复杂的 Playbook 时,为了避免因为变量名里突然多了个横杠(-)而导致报错
- 官方其实更推荐使用方括号写法(
['key'])- 别忘记引入变量文件
vars_files: 文件名
1)层级定义变量[root@m01 ansible]# vim vars1.ymllnmp: 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.ymlok: [web01]'当然我们也可以使用点.' name: - "{{lnmp.nginx.pk1}}"[root@m01 ansible]# ansible-playbook a.ymlok: [web01]
3)多个层级列表的方式[root@m01 ansible]# vim vars1.ymllnmp: nginx: pk1: wget pk2: tree[root@m01 ansible]# vim a.yml# 调用 name: - "{{lnmp.nginx.pk1}}" - "{{lnmp['nginx']['pk2']}}"# 一个用点.一个用方括号+引号[root@m01 ansible]# ansible-playbook a.ymlok: [web01]Facts缓存
🤔 什么是 **Ansible Facts **?(通俗版)
你可以想象成 Ansible 在干活之前,先给被管理主机做的一次**“全身体检”**
- 默认情况 (
gather_facts: yes):- Ansible 就像个负责任的医生,每次去主机上执行任务前,都要先花几秒钟问一遍:“你叫什么名字?IP是多少?内存多大?系统啥版本?”
- 这就导致了你感觉到的**“卡顿”**
- 主机越多,体检时间越长
- Ad-hoc 对应模块:
setup模块- 可以去参考
📚Ansible 01 - 在命令行直接用
ansible ... -m setup,就是在手动触发这个“体检”
- 可以去参考
- 为什么要缓存?:
- 如果主机信息不常变,我们没必要每次都体检
- 把第一次体检的结果存起来(缓存)
- 下次直接用,速度就会飞快
🚀 怎么开启缓存来解决 “卡顿” 问题❓️
- 这就像把体检报告复印一份存档,下次直接看存档,不用再问主机了
'最简单的方案(使用 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 = Falsedeprecation_warnings = Falseinterpreter_python = /usr/bin/python3gathering = smartfact_caching = jsonfilefact_caching_connection = /tmp/ansible_fact_cachefact_caching_timeout = 86400
[inventory][privilege_escalation][paramiko_connection][ssh_connection][persistent_connection][accelerate][selinux][colors][diff]配置后的效果:
- 第一次运行:Ansible 会慢一点,因为它在收集信息并存到
/tmp目录下 - 第二次运行(24小时内):Ansible 会直接读取文件,速度瞬间完成,不再卡顿!
这样既保留了获取信息的能力,又解决了速度慢的问题
[root@m01 ansible]# ll /tmp/ansible_fact_cachels: 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.ymlPLAY [web01] *************TASK [Gathering Facts] ***ok: [web01]# 第一次进行了信息收集![root@m01 ansible]# ll /tmp/ansible_fact_cachetotal 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.ymlPLAY [web01] *************'再次执行就直接省略信息收集这一步了!'🈚Gathering Facts🈚# 压根没有这一步!TASK [Install pack] *******ok: [web01]📊 常用 Facts 变量速查表
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_vcpus | CPU 总核心数 |
| 🔥 极高 | ansible_memtotal_mb | 系统总内存 |
| ⭐ 常用 | ansible_distribution_major_version | 系统主版本号 |
| ⭐ 常用 | ansible_machine | 硬件架构 |
| ⭐ 常用 | ansible_mounts | 磁盘挂载情况 |
| ⭐ 常用 | ansible_processor | CPU 详细型号 |
| ⭐ 常用 | ansible_memory_mb | ✅详细内存信息(信息全) |
| 📉 低频 | ansible_devices | 磁盘设备详情 |
| 📉 低频 | ansible_kernel | 内核版本 |
| 📉 低频 | ansible_eth0 | eth0 网卡信息 |
| 📉 低频 | ansible_lvm | LVM 逻辑卷信息 |
| 📉 低频 | ansible_memfree_mb | 当前可用内存 |
| 📉 低频 | ansible_swaptotal_mb | Swap 总大小 |
| 📉 低频 | ansible_swapfree_mb | Swap 可用大小 |
| 📉 低频 | ansible_distribution_version | 系统具体版本号 |
'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.ymlok: [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.ymlok: [web01] => { "msg": "10.0.0.7"}ok: [web02] => { "msg": "10.0.0.8"}
案例3.需求创建出以主机名命名+IP地址的目录WEB01: web01_10.0.0.7WEB02: 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.ymlchanged: [web02]changed: [web01][root@m01 ansible]# ssh web01 "ls -lh /home/"total 0drwxr-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 }} - 就像复印身份证,复印件上的字是不会变的
- 主机 A 收到的文件里写着:
==template 模块==:就像“智能填空题”
- 它的逻辑:先读懂内容,填好空,再打印
- 你的情况:当你用
template模块时,它会先打开info.txt(这时候它叫模板文件),发现里面有{{ ansible_hostname }}- 它会立刻去查当前这台主机的信息:“哦,这台机器叫
web-server-01”,然后把空填上,最后生成一个新文件发给主机
- 它会立刻去查当前这台主机的信息:“哦,这台机器叫
- 结果:每个主机收到的都是“私人订制”的
- 主机 A 收到的文件里写着:
hostname: web-server-01 - 主机 B 收到的文件里写着:
hostname: db-server-02 - 就像老师发卷子,虽然题目一样,但每个人填进去的答案是自己的
- 主机 A 收到的文件里写着:
| 模块 | 形象比喻 | 对待变量 {{ xxx }} 的态度 | 最终效果 |
|---|---|---|---|
| copy | 复印机 | 看不见:把它当成普通文字,直接复制粘贴 | 所有主机文件内容==一模一样== |
| template | 填空题 | 能看懂:把它当成指令,替换成真实的值 | 每个主机文件内容==各不相同== |
一句话口诀: 如果文件里没有花括号变量,用 copy(快) 如果文件里有花括号变量,必须用 template(灵)
[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.ymlplaybook: c.yml[root@m01 ansible]# ansible-playbook c.yml[root@m01 ansible]# ssh web01 "cat /home/info.txt"ip: 10.0.0.7hostname: web01total_memory: 948[root@m01 ansible]# ssh web02 "cat /home/info.txt"ip: 10.0.0.8hostname: web02total_memory: 948'他们的 IP地址 和 主机名 各不相同!'backup重构
[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.confrsyncd.conf
1)配置文件更换成变量# 配合template模块[root@m01 ansible]# vim rsyncd.confuid = {{user}}gid = {{user}}port = {{port}}log file =/var/log/rsyncd.log....############################....[data]path = {{dir}}
'恢复快照,免密登录省略'# 10.0.0.412)重新编辑剧本# 这里选择在剧本中定义变量[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.ymlplaybook: 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::dataPassword:hostssent 225 bytes received 43 bytes 76.57 bytes/sectotal size is 363 speedup is 1.35[root@m01 ansible]# ssh backup "ls /data/"hostsnfs重构
'同样也是恢复快照!-->免密登录!'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.ymlplaybook: nfs.yml[root@m01 ansible]# ansible-playbook nfs.yml文章分享
如果这篇文章对你有帮助,欢迎分享给更多人!




