1.修改文件并将其复制到主机
1.1 描述文件模块
Files模块库包含的模块允许用户完成与Linux文件管理相关的大多数任务,如创建、复制、编辑和修改文件的权限和其他属性。下表提供了常用文件管理模块的列表:
常用文件模块
模块名称 | 模块说明 |
---|
blockinfile | 插入、更新或删除由可自定义标记线包围的多行文本块 | copy | 将文件从本地或远程计算机复制到受管主机上的某个位置。 类似于file模块,copy模块还可以设置文件属性,包括SELinux上下文件。 | fetch | 此模块的作用和copy模块类似,但以相反方式工作。此模块用于从远程计算机获取文件到控制节点,并将它们存储在按主机名组织的文件树中。 | file | 设置权限、所有权、SELinux上下文以及常规文件、符号链接、硬链接和目录的时间戳等属性。 此模块还可以创建或删除常规文件、符号链接、硬链接和目录。 其他多个与文件相关的模块支持与file模块相同的属性设置选项,包括copy模块。 | lineinfile | 确保特定行位于某文件中,或使用反向引用正则表达式来替换现有行。 此模块主要在用户想要更改文件的某一行时使用。 | stat | 检索文件的状态信息,类似于Linux中的stat命令。 | synchronize | 围绕rsync命令的一个打包程序,可加快和简化常见任务。synchronize模块无法提供对rsync命令的完整功能的访问权限,但确实最常见的调用更容易实施。 用户可能仍需通过run command模块直接调用rsync命令。 |
blockinfile: 在指定的文件中插入”一段文本”,这段文本是被标记过的
[root@localhost ansible]# cat test.yml
---
- name: www
hosts: all
tasks:
- name: ss
blockinfile:
path: /tmp/abc
block: | //多行内容
123
abc
ag d sc s
[root@localhost tmp]# cat abc
# BEGIN ANSIBLE MANAGED BLOCK
123
abc
ag d sc s
# END ANSIBLE MANAGED BLOCK
fetch: 把受控节点的文件copy到控制节点上,并将它们存储在按主机名组织的文件树中
[root@localhost ansible]# cat test.yml
---
- name: www
hosts: all
tasks:
- name: www
fetch:
src: /opt/123 //受控主机文件位置
dest: /opt //控制主机位置
[root@localhost opt]# tree
. //按主机名组织的文件树中
└── 192.168.237.168
└── opt
└── 123
1.2 files模块的自动化示例
在受管主机上创建、复制、编辑和删除文件是用户可以使用Files模块库中的模块实施的常见任务。
1.2.1 确保受管主机上存在文件
使用file模块处理受管主机上的文件。其工作方式与touch命令类似,如果不存在则创建一个空文件,如果存在,则更新其修改时间。
- name:
file:
path: /etc/123/file
owner: user1 //确保受管主机已经有user1用户
group: group1 //所属组为group1
mode: 0640 //文件的权限
state: touch //状态为创建文件
1.2.2 修改文件属性
使用file模块还可以确保新的或现有的文件具有正确的权限和SELinux类型。
以下任务确保了anaconda-ks.cfg 文件的SELinux上下文件类型属性是所需的samba_share_t类型。此行为与Linux中的chcon命令类似。
- name:
file:
path: /etc/wjm1/file
setype: samba_share_t
1.2.3 使SELinux文件上下文更改具有持久性
设置文件上下文时,file 模块的行为与chcon 类似。通过运行restorecon ,可能会意外地撤消使用该模块所做的更改。 使用file设置上下文后,用户可以使用system 模块集合中的sefcontext 来更新SELinux策略,如semanage fcontext 。
- name:
samba_share_t:
sefcontext:
target: /etc/123/file
setype: samba_share_t
state: present
1.2.4 在受管主机上复制和编辑文件
copy模块用于将位于控制节点上的Ansible工作目录中的文件复制到选定的受管主机。
默认情况下,此模块假定设置了force: yes 。这会强制该模块覆盖远程文件(如果存在但包含与正在复制的文件不同的内容)。如果设置force: no ,则它仅会将该文件复制到受管主机(如果该文件尚不存在)。
- name:
copy:
src: file
dest: /path/to/file
要从受管主机检索文件,使用fetch模块。这可用于在将参考系统分发给其他受管主机之前从参考系统中检查诸如SSH公钥之类的文件。
name:
fetch:
src: "/home/{{ user }}/.ssh/id_rsa.pub"
dest: "files/keys/{{ user }}.pub"
要确保现有文件中存在特定的单行文本,使用lineinfile模块:
- name: Add a line of text to a file
lineinfile:
path: /path/to/file
line: 'Add this line to the file'
state: present
要将文本块添加到现有文件,请使用blockinfile模块:
- name:
blockinfile:
path: /path/to/file
block: | //块 将块的两行内容添加到file文件中
First line in the additional block of text
Second line in the additional block of text
state: present
1.2.5 从受管主机中删除文件
从受管主机中删除文件的基本示例是使用file模块和state: absent参数。state参数对于许多模块是可选的。一些模块也支持其他选项。
- name: Make sure a file does not exist on managed hosts
file:
dest: /path/to/file
state: absent
1.2.6 同步控制节点和受管主机之间的文件
synchronize模块是一个围绕rsync工具的打包程序,它简化了playbook中的常见文件管理任务。rsync工具必须同时安装在本机和远程主机上。 默认情况下,在使用synchronize模块时,控制节点为本地主机,受控节点为目标主机。
synchronize: 推送模式push:将控制主机上的目录或文件推送到受控主机(默认模式) 拉取模式pull:将受控主机上的目录或文件拉取到控制主机 控制节点和受控节点都需要安装rsync程序才可以
//将控制主机上的目录或文件推送至受控主机
[root@localhost ansible]# cat test.yml
---
- name: Simple Boolean Task Demo
hosts: all
tasks:
- name:
yum:
name: rsync
state: present
- name:
synchronize:
src: /var/123 //目录或文件都可以
dest: /opt
[root@localhost opt]# ls
123
//将受控主机上的目录或文件拉取到控制主机
[root@localhost ansible]# cat test.yml
---
- name: Simple Boolean Task Demo
hosts: all
tasks:
- name:
synchronize:
src: /opt/123
dest: /opt
mode: pull //改为拉取模式pull
[root@localhost ansible]# ls /opt/
123
|