当前位置: 首页 > news >正文

部署文件到受管主机

准备环境

[lyk@controller ~]$ mkdir web && cd web​[lyk@controller web 16:37:14]$ cat > ansible.cfg <<'EOF'> [defaults]> remote_user = lyk> inventory = ./inventory> > [privilege_escalation]> become = True> become_user = root> become_method = sudo> become_ask_pass = False> EOF[lyk@controller web 17:03:18]$ cat > inventory <<'EOF'> controller> node1> node2> node3> node4> EOF​

修改文件并将其复制到主机

添加文件
1 ---2 - hosts: node13   gather_facts: no4   tasks:5     - name: Touch a file and set permissions6       file:7         path: /tmp/testfile8         owner: lyk9         group: wheel10         mode: 064011         state: touch  ​​​[lyk@controller web 17:20:21]$ ansible-playbook playbook.yml ​PLAY [node1] ************************************************************************​TASK [Touch a file and set permissions] *********************************************changed: [node1]​PLAY RECAP **************************************************************************node1                      : ok=1    changed=1    unreachable=0    failed=0    skippe​#创建出新文件[root@node1 ~ 17:14:30]# ls -1 /tmp/testfile/tmp/testfile​
删除文件
1 ---                  2 - hosts: node1       3   gather_facts: no   4   tasks:             5     - name: delete file 6       file:          7         path: /tmp/testfile8         state: absent    [lyk@controller web 17:20:27]$ ansible-playbook playbook.yml ​PLAY [node1] ***********************************************************************​TASK [delete file] *****************************************************************changed: [node1]​PLAY RECAP *************************************************************************node1                      : ok=1    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   ​#已删除  [root@node1 ~ 17:17:45]# ls -1 /tmp/testfilels: 无法访问/tmp/testfile: 没有那个文件或目录​

sefcontext 模块

1 ---                   2 - hosts: node1        3   gather_facts: no    4   tasks:              5     - sefcontext:     6         target: '/samba(/.*)?'7         setype: samba_share_t8         state: present   ​​[root@node1 ~ 17:29:29]# sudo yum install -y policycoreutils-python[root@node1 ~ 17:29:29]# sudo vim /etc/selinux/configSELINUX=enforcing[root@node1 ~ 17:31:16]# sudo reboot[lyk@controller web 17:31:39]$ ansible-playbook playbook.yml ​PLAY [node1] ***********************************************************************​TASK [sefcontext] ******************************************************************changed: [node1]​PLAY RECAP *************************************************************************node1                      : ok=1    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   ​

lineinfile 模块

示例1:给文件加一行内容(确保存在)

核心功能:往文件里加一行特定内容,如果这行已经有了,就不动;没有就加上。

#基础用法:直接在文件里加一行(默认加在文件末尾)---- hosts: node1gather_facts: notasks:- name: add linelineinfile:path: /tmp/testfileline: 'Add this line to file'   # 要加的内容state: present
  • insertbefore,最后一个匹配到前插入

---- hosts: node1gather_facts: notasks:- name: add linelineinfile:path: /etc/httpd/conf/httpd.confline: 'Listen 82'insertbefore: 'Listen 80'state: present#Listen 82  # 新内容插在"Listen 80"的前面#Listen 80  # 原来的行
  • insertafter,最后一个匹配到后插入

---- hosts: node1gather_facts: notasks:- name: add linelineinfile:path: /etc/httpd/conf/httpd.confline: 'Listen 82'insertafter: 'Listen 80'state: present#Listen 80  # 原来的行#Listen 82  # 新内容插在"Listen 80"的后面
示例2:替换文件里的某一行*

核心功能:找到文件中符合 “规则” 的行,用新内容替换它。

#regexp: 'Add':只要一行里有Add这个词,就把整行换成replace---- hosts: node1gather_facts: notasks:- name: replace linelineinfile:path: /tmp/testfileregexp: 'Add'    line: 'replace'state: present
#regexp: '^Listen 80':专门找以Listen 80开头的行,把它换成#Listen 80(加个注释符)
---
- hosts: node1gather_facts: notasks:- name: add linelineinfile:path: /etc/httpd/conf/httpd.confline: '#Listen 80'regexp: '^Listen 80' state: present
示例3:替换成多行内容

核心功能:找到符合规则的行后,不是换一行,而是换成好几行内容。

---
- hosts: node1gather_facts: notasks:- name: add linelineinfile:path: /tmp/testfileline: |line 1line 2regexp: 'replace'state: present #这里的|符号表示 “多行文本”,意思是:把找到的行(符合regexp: 'replace'的行)换成两行内容:line 1和line 2。#举例:相当于把作文里的某一句话,改成一整段话(包含好几行)。

总结区别

示例操作目的关键点
1加一行(可指定位置)只加不删,已有则不重复加
2替换某一行用新内容换掉旧行(按规则找旧行)
3替换成多行用好几行内容换掉旧行

replace 模块:批量替换符合规则的内容

---
- hosts: node1gather_facts: notasks:- name: replace multi linereplace:path: /tmp/testfileregexp: '^Hello World.*'replace: 'Hello lyk'#执行示例中的replace任务后:#会找所有 “以Hello World开头” 的行(regexp: '^Hello World.*'的意思)
#把这些行全部换成Hello lyk#举例:
Hello lyk  # 替换了第一行
abc Hello World xyz  # 没被替换(因为不是以Hello World开头)其他不相关的内容

blockinfile 模块:添加一整块内容(带标记)

  • 作用:往文件里插入 “一整块多行内容”,并且会自动加特殊标记(注释)把这块内容包起来。

    执行示例中的blockinfile任务后,/tmp/testfile里会新增这样一段:

---
- hosts: node1gather_facts: notasks:- name: add block lines to fileblockinfile:path: /tmp/testfileblock: |line 1 in fileline 2 in fileaaline 3 in file sssstate:  present

执行示例中的blockinfile任务后,/tmp/testfile里会新增这样一段:

# BEGIN ANSIBLE MANAGED BLOCK
line 1 in file
line 2 in fileaa
line 3 in file sss
# END ANSIBLE MANAGED BLOCK

关键点

  • 插入的是 “多行内容”(用|符号定义)

  • 自动在内容前后加注释标记(# BEGIN...# END...),方便后续识别和管理

  • 如果再次执行同样的任务,不会重复添加,只会更新内容(如果内容有变化)

举例:就像给文件贴了一张 “便利贴”,便利贴里写了多行内容,并且有明确的开头和结尾标记,别人一看就知道这部分是通过 Ansible 添加的。

copy 模块:从控制节点 “推” 文件到被管理节点

就像你把自己电脑上的文件,通过 U 盘拷贝到别人电脑上。

  • 示例 1: 把控制节点(你操作的电脑)上的/tmp/testfile文件,复制到被管理节点(node1)的/tmp目录下。

    • 特点:如果 node1 的/tmp目录下已经有这个文件,默认会直接覆盖(类似强制复制);如果设置force: no,则不会覆盖。

---
- hosts: node1gather_facts: notasks:- name: copy /tmp/testfile to remote nodecopy:src: /tmp/testfiledest: /tmp
  • 示例 2: 不拷贝现成文件,而是直接在 node1 的/tmp/testfile里写内容 —— 比如写一句 “hello world”。

    • 相当于直接在别人电脑上新建文件并输入内容,不用先在自己电脑上创建。

---
- hosts: node1gather_facts: notasks:- name: write string into /tmp/testfilecopy:content: "hello world\n"dest: /tmp/testfile

synchronize 模块:用 rsync 工具 “同步” 文件 / 目录(更智能的复制)

类似 “双向同步”,但主要是从控制节点往被管理节点同步,会自动跳过没变的文件,效率更高。

  • 前提:控制节点和被管理节点都要装rsync工具(类似两个人都要有 “同步工具”)。

  • 示例 1(同步文件): 把控制节点的/tmp/testfile同步到 node1 的/tmp目录。

    • 区别于copy:如果文件内容没变化,就不重复传输,节省时间;如果变了,只传变化的部分。

    ---
    - hosts: node1gather_facts: notasks:- name: synchronize filesynchronize:src: /tmp/testfiledest: /tmp/
  • 示例 2(同步目录): 把控制节点的/etc/sysconfig整个目录(包括里面的所有文件和子目录)同步到 node1 的/tmp目录下。

    • 适合批量同步文件夹,比如网站目录、配置文件夹等。

    ---
    - hosts: node1gather_facts: noremote_user: roottasks:- name: synchronize directorysynchronize:src: /etc/sysconfigdest: /tmp/

fetch 模块:从被管理节点 “拉” 文件到控制节点

copy相反,是把别人电脑上的文件拷贝到自己电脑上。

  • 示例

    把 node1 上的 /tmp/testfile 拉到控制节点的 /tmp目录下。

    • 特殊点:拉过来的文件会自动按 “被管理节点的名字 + 原路径” 存放,比如/tmp/node1/tmp/testfile

    • 这样做是为了区分不同节点的文件(比如从多个节点拉同一个文件名的文件,不会混乱)。

    • 适合收集日志、配置文件等,比如从所有服务器拉取/var/log/messages日志到本地分析。

---
- hosts: node1gather_facts: notasks:- name: fetch file from remote nodefetch:src: /tmp/testfiledest: /tmp

文件保存在:/tmp/node1/tmp/testfile

[lyk@controller web]$ tree /tmp/node1
/tmp/node1
└── tmp└── testfile1 directory, 1 file

总结区别

模块方向特点通俗比喻
copy控制节点 → 被管理节点强制复制,覆盖方便用 U 盘把自己的文件拷给别人
synchronize控制节点 → 被管理节点智能同步,只传变化的部分用 “增量同步工具” 更新别人的文件
fetch被管理节点 → 控制节点拉取文件,自动按节点分类把别人的文件拷到自己电脑,按人名建文件
http://www.lryc.cn/news/621119.html

相关文章:

  • 远程影音访问:通过 cpolar 内网穿透服务使用 LibreTV
  • 高效TypeScript开发:VSCode终极配置指南
  • 莫队 + 离散化 Ann and Books
  • 浏览器面试题及详细答案 88道(34-44)
  • 宝塔配置反向代理
  • 机器学习基础讲解
  • Linux:Samba 服务部署
  • 机器学习学习总结
  • 基于机器学习的文本情感极性分析系统设计与实现
  • 【深度学习】深度学习的四个核心步骤:从房价预测看机器学习本质
  • 机器学习--KNN算法
  • 减重小知识
  • AI幻觉终结之后:GPT-5开启的“可靠性”新赛道与开发者生存指南
  • 系统思考:转型困扰与突破
  • [ HTML 前端 ] 语法介绍和HBuilderX安装
  • 语义 HTML 的核心价值:提升 SEO 与 AI 理解
  • 解剖HashMap的put <五> JDK1.8
  • scikit-learn/sklearn学习|广义线性回归 Logistic regression的三种成本函数
  • Android POS应用在android运行常见问题及解决方案
  • 【数据结构初阶】--排序(一):直接插入排序,希尔排序
  • 前端框架选择之争:jQuery与Vue在现代Web开发中的真实地位-优雅草卓伊凡
  • 机器学习核心概念与实践笔记
  • spring mvc HttpMessageConverter 消息转换器
  • 【互动屏幕】解析双屏联动在数字展厅中的应用与价值
  • 系统升级后客户端缓存问题的无感知解决方案
  • [激光原理与应用-273]:理论 - 波动光学 - 光是电磁波,本身并没有颜色,可见光的颜色不过是人的主观感受
  • 网络组播技术详解
  • 考研408《计算机组成原理》复习笔记,第五章(3)——CPU的【数据通路】
  • 深入理解管道(上):PowerShell 管道参数绑定原理与高频范式
  • 玩转QEMU硬件模拟器 - Versatilepb模拟器开发概述