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命令 |
1.2 files模块的自动化示例
在受管主机上创建、复制、编辑和删除文件是用户可以使用Files模块库中的模块实施的常见任务。以下显示了可以使用这些模块自动执行常见文件管理任务的方式。
1.2.1 确保受管主机上存在文件
使用file模块处理受管主机上的文件。其工作方式与touch命令类似,如果不存在则创建一个空文件,如果存在,则更新其修改时间
---
- hosts: 192.168.25.130
file:
path: /path/to/file
owner: user1
group: group1
mode: 0640
state: touch
1.2.2 修改文件属性
使用file模块还可以确保新的或现有的文件具有正确的权限和SELinux类型
文件属性参数在多个文件管理模块中可用。运行ansible-doc file和ansible-doc copy命令以获取其他信息
以下文件保留了相对于用户主目录的默认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: /path/to/samba_file
setype: samba_share_t
1.2.3 使SELinux文件上下文更改具有持久性
设置文件上下文时,file模块的行为与chcon类似,通过运行restorecon,使用file设置上下文后,用户可以使用system模块集合中的sefcontext来更新SELinux策略。
- name: SELinux type is persistently set to samba_share_t
sefcontext:
target: /path/to/samba_file
setype: samba_share_t
state: present
1.2.4 在受管主机上复制和编辑文件
copy模块用于将位于控制节点上的Ansible工作目录中的文件复制到选定的受管主机,此模块假定设置了force: yes。这会强制该模块覆盖远程文件(如果存在但包含与正在复制的文件不同的内容)。如果设置force: no,则它仅会将该文件复制到受管主机(如果该文件尚不存在)。
- name: SELinux type is persistently set to samba_share_t
sefcontext:
target: /path/to/samba_file
setype: samba_share_t
state: present
要从受管主机检索文件,请使用fetch模块
- name: Retrieve SSH key from reference host
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: Add additional lines to a file
blockinfile:
path: /path/to/file
block: |
First line in the additional block of text
Second line in the additional block of text
state: present
1.2.5 从受管主机中删除文件
从受管主机中删除文件的基本示例是使用file模块和state: absent参数
---
- hosts: 192.168.25.130
gather_facts: no
tasks:
- name:
file:
dest: /var/www/html/index.php
state: absent
[root@ansible ansible]# ansible-playbook group_vars/file.yml
PLAY [192.168.25.130] *************************************************************
TASK [file] ***********************************************************************
changed: [192.168.25.130]
PLAY RECAP ************************************************************************
192.168.25.130 : ok=1 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
1.2.6 检索受管主机上的文件状态
stat模块检索文件的事实,类似于Linux中的stat命令参数提供检索文件属性、确定文件检验和等功能
有关stat模块返回的值的信息由ansible-doc记录,或者可以注册一个变量并显示其内容以查看可用内容
- name: Verify the checksum of a file
stat:
path: /path/to/file
checksum_algorithm: md5
register: result
- debug
msg: "The checksum of the file is {{ result.stat.checksum }}"
1.2.7 同步控制节点和受管主机之间的文件
synchronize模块是一个围绕rsync工具的打包程序,它简化了playbook中的常见文件管理任务。rsync工具必须同时安装在本机和远程主机上。默认情况下,在使用synchronize模块时,“本地主机”是同步任务所源自的主机(通常是控制节点),而“目标主机”是synchronize连接到的主机
很多种方法可以使用synchronize模块及其许多参数,包括同步目录。运行ansible-doc synchronize命令查看其他参数和playbook示例
- name: synchronize local file to remote files
synchronize:
src: file
dest: /path/to/file
|