在被管理节点上创建文件或目录

本文详细介绍了Ansible中的Files模块,包括如何使用file、copy、fetch、lineinfile、blockinfile等模块进行文件操作,如创建、复制、编辑、删除和管理SELinux上下文。同时提到了stat和synchronize模块用于文件状态检查和同步文件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

| blockinfile | 插入、更新或删除由可自定义标记线包围的多行文本块 |

| copy | 将文件从本地或远程计算机复制到受管主机上的某个位置。类似于file模块copy模块还可以设置文件属性,包括SELinux上下文件。 |

| fetch | 此模块的作用和copy模块类似,但以相反方式工作。此模块用于从远程计算机获取文件到控制节点,并将它们存储在按主机名组织的文件树中。 |

| file | 设置权限、所有权、SELinux上下文以及常规文件、符号链接、硬链接和目录的时间戳等属性。此模块还可以创建或删除常规文件、符号链接、硬链接和目录。其他多个与文件相关的模块支持与file模块相同的属性设置选项,包括copy模块。 |

| lineinfile | 确保特定行位于某文件中,或使用反向引用正则表达式来替换现有行。此模块主要在用户想要更改文件的某一行时使用。 |

| stat | 检索文件的状态信息,类似于Linux中的stat命令。 |

| synchronize | 围绕rsync命令的一个打包程序,可加快和简化常见任务。synchronize模块无法提供对rsync命令的完整功能的访问权限,但确实最常见的调用更容易实施。用户可能仍需通过run command模块直接调用rsync命令。 |

2、files模块的自动化示例


在受管主机上创建、复制、编辑和删除文件是用户可以使用Files模块库中的模块实施的常见任务。

2.1 确保受管主机上存在文件

使用file模块处理受管主机上的文件。其工作方式与touch命令类似,如果不存在则创建一个空文件,如果存在,则更新其修改时间。在本例中,除了处理文件之外,Ansible还确保将文件的所有者、组和权限设置为特定值。


  • name: test

hosts: all

tasks:

  • name:Touch a file and set permissions

file:

path: /root/file

owner: hhh

group: hhh

mode: 0755

state: touch

2.2 修改文件属性

使用file模块还可以确保新的或现有的文件具有正确的权限和SELinux类型。

例如,以下文件保留了相对于用户主目录的默认SELinux上下文,这不是所需的上下文。

[root@localhost ~]# ls -Z samba_file

  • rw-r–r-- owner group unconfined_u:object_r:user_home_t:s0 samba_file

以下任务确保了anaconda-ks.cfg文件的SELinux上下文件类型属性是所需的samba_share_t类型。此行为与Linux中的chcon命令类似。


  • name: SELinux type is set to samba_share_t

file:

path: /root/samba_file

setype: samba_share_t

示例结果:

[root@localhost ~]# ls -Z samba_file

  • rw-r–r-- owner group unconfined_u:object_r:samba_share_t:s0 samba_file

文件属性参数在多个文件管理模块中可用。运行ansible-doc file和ansible-doc copy命令以获取其他信息。

2.3 使SELinux文件上下文更改具有持久性

设置文件上下文时,file模块的行为与chcon类似。通过运行restorecon,可能会意外地撤消使用该模块所做的更改。使用file设置上下文后,用户可以使用system模块集合中的sefcontext来更新SELinux策略,如semanage fcontext。


  • hosts: web

tasks:

  • name: SELinux type is persistently set to samba_share_t

sefcontext:

target: /path/to/samba_file

setype: samba_share_t

state: present

注意:sefcontext模块更新SELinux策略中目标的默认上下文,但不更改现有文件的上下文。

2.4 在受管主机上复制和编辑文件

在此示例中,copy模块用于将位于控制节点上的Ansible工作目录中的文件复制到选定的受管主机。

默认情况下,此模块假定设置了force: yes。这会强制该模块覆盖远程文件(如果存在但包含与正在复制的文件不同的内容)。如果设置force: no,则它仅会将该文件复制到受管主机(如果该文件尚不存在)。

[root@192 project]# cat playbook/test.yml


  • hosts: web

name: Touch a file and set permission

tasks:

  • name:

copy:

src: /root/abc

dest: /root

[root@192 project]# ansible-playbook playbook/test.yml

PLAY [Touch a file and set permission] ****************************************************************

TASK [Gathering Facts] ********************************************************************************

ok: [192.168.129.137]

TASK [copy] *******************************************************************************************

changed: [192.168.129.137]

PLAY RECAP ********************************************************************************************

192.168.129.137 : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0

从受管主机检索文件,请使用fetch模块。这可用于在将参考系统分发给其他受管主机之前从参考系统中检查诸如SSH公钥之类的文件。

fetch

[root@192 project]# cat playbook/test.yml


  • hosts: web

name: Touch a file and set permission

gather_facts: no

tasks:

  • name:

fetch:

src: /root/abc

dest: /opt

[root@192 project]# ansible-playbook playbook/test.yml

PLAY [Touch a file and set permission] ****************************************************************

TASK [fetch] ******************************************************************************************

changed: [192.168.129.137]

PLAY RECAP ********************************************************************************************

192.168.129.137 : ok=1 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0

查看:

[root@192 project]# ls /opt/

192.168.129.137 project

要确保现有文件中存在特定的单行文本,请使用lineinfile模块:

lineinfile

[root@192 project]# cat playbook/test.yml


  • hosts: web

name: Touch a file and set permission

tasks:

  • name:

lineinfile:

path: /root/abc

line: ‘Add this line to the file’

state: present

[root@192 project]# ansible-playbook playbook/test.yml

PLAY [Touch a file and set permission] ****************************************************************

TASK [Gathering Facts] ********************************************************************************

ok: [192.168.129.137]

TASK [lineinfile] *************************************************************************************

changed: [192.168.129.137]

PLAY RECAP ********************************************************************************************

192.168.129.137 : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0

要将文本块添加到现有文件,请使用blockinfile模块:

block(会覆盖掉之前的数据)

[root@192 project]# cat playbook/test.yml


  • hosts: web

name: Touch a file and set permission

tasks:

  • name:

blockinfile:

path: /root/abc

block: |

jjyy

hello

bakabaka

state: present

[root@192 project]# ansible-playbook playbook/test.yml

PLAY [Touch a file and set permission] ****************************************************************

TASK [Gathering Facts] ********************************************************************************

ok: [192.168.129.137]

TASK [blockinfile] ************************************************************************************

changed: [192.168.129.137]

PLAY RECAP ********************************************************************************************

192.168.129.137 : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0

查看:

[root@hhr ~]# cat abc

Add this line to the file

BEGIN ANSIBLE MANAGED BLOCK

jjyy

hello

bakabaka

END ANSIBLE MANAGED BLOCK

注意:使用blockinfile模块时,注释块标记插入到块的开头和结尾,以确保幂等性。

BEGIN ANSIBLE MANAGED BLOCK

First line in the additional block of text

Second line in the additional block of text

END ANSIBLE MANAGED BLOCK

用户可以使用该模块的marker参数,帮助确保将正确的注释字符或文本用于相关文件。

2.5 从受管主机中删除文件

受管主机中删除文件的基本示例是使用file模块state: absent参数。state参数对于许多模块是可选的。一些模块也支持其他选项。

[root@192 project]# cat playbook/test.yml


  • hosts: web

name: Touch a file and set permission

tasks:

  • name:

file:

path: /root/123

state: absent

[root@192 project]# ansible-playbook playbook/test.yml

PLAY [Touch a file and set permission] ****************************************************************

TASK [Gathering Facts] ********************************************************************************

ok: [192.168.129.137]

TASK [file] *******************************************************************************************

changed: [192.168.129.137]

PLAY RECAP ********************************************************************************************

192.168.129.137 : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0

2.6 检索受管主机上的文件状态

stat模块检索文件的事实,类似于Linux中的stat命令。参数提供检索文件属性、确定文件检验和等功能。

stat模块返回一个包含文件状态数据的值的散列字典,允许用户使用单独的变量引用各条信息。

以下示例注册stat模块的结果,然后显示它检查的文件的MD5检验和。

[root@192 project]# cat playbook/test.yml


  • hosts: web

name: Touch a file and set permission

gather_facts: no

tasks:

  • name:

stat:

path: /root/abc

register: result

  • debug:

var: result

[root@192 project]# ansible-playbook playbook/test.yml

PLAY [Touch a file and set permission] ****************************************************************

TASK [stat] *******************************************************************************************

ok: [192.168.129.137]

TASK [debug] ******************************************************************************************

ok: [192.168.129.137] => {

“result”: {

“ansible_facts”: {

“discovered_interpreter_python”: “/usr/libexec/platform-python”

},

“changed”: false,

“failed”: false,

“stat”: {

“atime”: 1627393830.848072,

“attr_flags”: “”,

“attributes”: [],

“block_size”: 4096,

“blocks”: 8,

“charset”: “us-ascii”,

“checksum”: “5d15a6efdb648d1eb6712f828e21473baa87705f”,

“ctime”: 1627393546.8900664,

“dev”: 64768,

“device_type”: 0,

“executable”: false,

“exists”: true,

“gid”: 0,

“gr_name”: “root”,

“inode”: 67166408,

“isblk”: false,

“ischr”: false,

“isdir”: false,

“isfifo”: false,

“isgid”: false,

“islnk”: false,

“isreg”: true,

“issock”: false,

“isuid”: false,

“mimetype”: “text/plain”,

“mode”: “0644”,

“mtime”: 1627393546.8890662,

“nlink”: 1,

“path”: “/root/abc”,

“pw_name”: “root”,

“readable”: true,

“rgrp”: true,

“roth”: true,

“rusr”: true,

“size”: 118,

“uid”: 0,

“version”: “1435065990”,

“wgrp”: false,

“woth”: false,

“writeable”: true,

“wusr”: true,

“xgrp”: false,

“xoth”: false,

“xusr”: false

}

}

}

PLAY RECAP ********************************************************************************************

192.168.129.137 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0

有关stat模块返回的值的信息由ansible-doc记录,或者可以注册一个变量并显示其内容以查看可用内容:


  • name: Examine all stat output of /etc/passwd

hosts: web

tasks:

  • name: stat /etc/passwd

stat:

path: /etc/passwd

register: results

  • name: Display stat results

debug:

var: results

2.7 同步控制节点和受管主机之间的文件(目录文件都可同步)

synchronize模块是一个围绕rsync工具的打包程序,它简化了playbook中的常见文件管理任务。rsync工具必须同时安装在本机和远程主机上。默认情况下,在使用synchronize模块时,“本地主机”是同步任务所源自的主机(通常是控制节点),而“目标主机”是synchronize连接到的主机。

以下示例将位于Ansible工作目录中的文件同步到受管主机:注意:本机和受管机都要安装rsync

[root@192 project]# cat playbook/test.yml


  • hosts: web

name: Touch a file and set permission

gather_facts: no

tasks:

  • name:

yum:

name: rsync

state: present

  • name: tongbu

synchronize:

src: /root/file

dest: /opt

[root@192 project]# ansible-playbook playbook/test.yml

PLAY [Touch a file and set permission] ****************************************************************

TASK [yum] ********************************************************************************************

ok: [192.168.129.135]

TASK [tongbu] *****************************************************************************************

changed: [192.168.129.135]

PLAY RECAP ********************************************************************************************

192.168.129.135 : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0

查看:

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)

img

最后

针对最近很多人都在面试,我这边也整理了相当多的面试专题资料,也有其他大厂的面经。希望可以帮助到大家。

下面的面试题答案都整理成文档笔记。也还整理了一些面试资料&最新2021收集的一些大厂的面试真题(都整理成文档,小部分截图)

在这里插入图片描述

最新整理电子书

在这里插入图片描述

《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门即可获取!
碰到天花板技术停滞不前!**

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。[外链图片转存中…(img-gJKJePPb-1711933561383)]

[外链图片转存中…(img-zZpGv2A4-1711933561384)]

[外链图片转存中…(img-UFJWyxXX-1711933561384)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)

img

最后

针对最近很多人都在面试,我这边也整理了相当多的面试专题资料,也有其他大厂的面经。希望可以帮助到大家。

下面的面试题答案都整理成文档笔记。也还整理了一些面试资料&最新2021收集的一些大厂的面试真题(都整理成文档,小部分截图)

[外链图片转存中…(img-ERdxZ5LD-1711933561384)]

最新整理电子书

[外链图片转存中…(img-IJiYpKEj-1711933561385)]

《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门即可获取!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值