金鱼哥说Ansible:第六章 在被管理节点上创建文件和目录---常用文件模块
使用Ansible常用文件模块,我的工作效率上来了,业余生活也丰富了
本章节介绍如何在ansilbe中使用常用的文件模块,让你的工作效率飞起来,可以多点时间看 剧。
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命令。 |
(已介绍的可参照此前文章的模块参数说明)
2. 使用file模块确保受管主机上存在文件
使用file模块处理受管主机上的文件。其工作方式与touch命令类似,如果不存在则创建一个空文件,如果存在,则更新其修改时间。
# cat playbook.yml
---
- hosts: all
gather_facts: no
tasks:
- name: look the file is exit
file:
path: /root/file
mode: 0755
state: touch
3. 在受管主机上删除文件
从受管主机中删除文件的基本示例是使用file模块和state: absent参数
# cat playbook.yml
---
- hosts: all
gather_facts: no
tasks:
- name: look the file is exit
file:
path: /root/file
state: absent
4. 在受管主机上复制和编辑文件
使用fetch模块将受管主机上的文件索取到控制节点上进行检索
功能:从远程节点获取文件(只能是文件)到本地目录。默认会以主机清单中的主机名为目录存放获取到的文件
# cat playbook.yml
---
- hosts: all
gather_facts: no
tasks:
- name: test
fetch:
src: /root/file
dest: files
[root@servera ~]# ansible-playbook -i hosts playbook.yml
PLAY [all] *****************************************************************************
TASK [test] ****************************************************************************
changed: [servera]
PLAY RECAP *****************************************************************************
servera : ok=1 changed=1 unreachable=0 failed=0
[root@servera ~]# ll files/servera/root/file # fetch模块会自动生成以受管主机域名的目录
-rw-r--r--. 1 root root 4 Sep 9 08:49 files/servera/root/file
5. 使用lineinfile模块,确保文件中主机单个文件中存在特定的单行文本(扩展来讲)
功能:替换一个文件中特定的行,或者使用一个反引用的正则表达式替换一个现有的行。
常用参数
path : 必须参数,指定要操作的文件。
line : 使用此参数指定文本内容。
regexp: 使用正则表达式匹配对应的行,当替换文本时,如果有多行文本都能被匹配,则只有最后面被匹配到的那行文本才会被替换,当删除文本时,如果有多行文本都能被匹配,这么这些行都会被删除。
state: 当想要删除对应的文本时,需要将state参数的值设置为absent,absent为缺席之意,表示删除,state的默认值为present。
backrefs : 默认情况下,当根据正则替换文本时,即使regexp参数中的正则存在分组,在line参数中也不能对正则中的分组进行引用,除非将backrefs参数的值设置为yes。backrefs=yes表示开启后向引用,这样,line参数中就能对regexp参数中的分组进行后向引用了,这样说不太容易明白,可以参考后面的示例命令理解。backrefs=yes除了能够开启后向引用功能,还有另一个作用,默认情况下,当使用正则表达式替换对应行时,如果正则没有匹配到任何的行,那么line对应的内容会被插入到文本的末尾,不过,如果使用了backrefs=yes,情况就不一样了,当使用正则表达式替换对应行时,同时设置了backrefs=yes,那么当正则没有匹配到任何的行时,则不会对文件进行任何操作,相当于保持原文件不变。
(为no时,如果没有匹配,则添加一行line。如果匹配了,则把匹配内容替被换为line内容。
为yes时,如果没有匹配,则文件保持不变。如果匹配了,把匹配内容替被换为line内容。)
insertafter:配合state=present。 借助insertafter参数可以将文本插入到“指定的行”之后,insertafter参数的值可以设置为EOF或者正则表达式,EOF为End Of File之意,表示插入到文档的末尾,默认情况下insertafter的值为EOF,如果将insertafter的值设置为正则表达式,表示将文本插入到匹配到正则的行之后,如果正则没有匹配到任何行,则插入到文件末尾,当使用backrefs参数时,此参数会被忽略。
insertbefore :配合state=present。 借助insertbefore参数可以将文本插入到“指定的行”之前,insertbefore参数的值可以设置为BOF或者正则表达式,BOF为Begin Of File之意,表示插入到文档的开头,如果将insertbefore的值设置为正则表达式,表示将文本插入到匹配到正则的行之前,如果正则没有匹配到任何行,则插入到文件末尾,当使用backrefs参数时,此参数会被忽略。
backup : 是否在修改文件之前对文件进行备份。
create : 当要操作的文件并不存在时,是否创建对应的文件。
valiate: 在保存sudoers文件前,验证语法,如果有错,执行时,会报出来,重新编辑playbook
1.正则匹配,更改某个关键参数值
- name: seline modify enforcing
lineinfile:
dest: /etc/selinux/config
regexp: '^SELINUX='
line: 'SELINUX=enforcing'
2.在匹配的内容前或后增加一行
# cat http.conf
#Listen 12.34.56.78:80
#Listen 80
#Port
insertbefore匹配内容在前面添加
- name: httpd.conf modify 8080
lineinfile:
dest: /opt/playbook/test/http.conf
regexp: '^Listen'
insertbefore: '^#Port'
line: 'Listen 8080'
# cat http.conf
#Listen 12.34.56.78:80
#Listen 80
Listen 8080
#Port
insertafter匹配内容在后面添加
- name: httpd.conf modify 8080
lineinfile:
dest: /opt/playbook/test/http.conf
regexp: '^Listen'
insertafter: '^#Port'
line: 'Listen 8080'
# cat http.conf
#Listen 12.34.56.78:80
#Listen 80
#Port
Listen 8080
3.修改文件内容和权限
# cat hosts
127.0.0.1 localhost.localdomain localhost ::1 localhost6.localdomain6 localhost6
192.168.1.2 foo.lab.net foo
# ls -l hosts
-rwxrwxr-x 1 root test 111 Sep 9 18:07 hosts
# 执行剧本:
- name: modify hosts
lineinfile:
dest: /opt/playbook/test/hosts
regexp: '^127\.0\.0\.1'
line: '127.0.0.1 localhosts'
owner: root
group: root
mode: 0644
# cat hosts
127.0.0.1 localhosts
192.168.1.2 foo.lab.net foo
# ls -l hosts
-rwxrwxr-x 1 root root 111 Sep 9 18:10 hosts
4.删除某一行内容
# cat hosts
127.0.0.1 localhosts
192.168.1.2 foo.lab.net foo
# absent剧本
- name: delete 192.168.1.1
lineinfile:
dest: /opt/playbook/test/hosts
state: absent
regexp: '^192\.'
[root@master test]# cat hosts
127.0.0.1 localhosts
5.文件存在就添加一行
# cat hosts
127.0.0.1 localhosts
# 剧本
- name: add a line
lineinfile:
dest: /opt/playbook/test/hosts
line: '192.168.1.2 foo.lab.net foo'
# cat hosts
127.0.0.1 localhosts
192.168.1.2 foo.lab.net foo
6.使用valiate参数
在保存sudoers文件前,验证语法,如果有错,执行时,会报出来,重新编辑playbook
- name: test validate
lineinfile:
dest: /etc/sudoers
state: present
regexp: '^%ADMIN ALL='
line: '%ADMIN ALL=(ALL)'
validate: '/usr/sbin/visudo -cf %s'
7. 使用backrefs参数
- name: set the zabbix UnsafeUserParameters up
lineinfile:
path: /etc/zabbix/zabbix_agentd.conf
regexp: '^# UnsafeUserParameters=0'
line: 'UnsafeUserParameters=1'
backrefs: yes
backrefs默认为no,如果没有匹配,则添加一行line,但这样操作会造成配置文件的问题,所以设置成yes,匹配才进行替换内容,没匹配就不改变。
6. 使用blockinfile模块将所列出的文件块添加到受管主机现有文件中
# cat playbook.yaml
---
- hosts: all
gather_facts: no
tasks:
- name: test
blockinfile:
path: /root/file
block: |
this is one line
this is two line
tjis is three line
state: present
# cat file
This is test file
# BEGIN ANSIBLE MANAGED BLOCK
this is one line
this is two line
tjis is three line
# END ANSIBLE MANAGED BLOCK
注意:state:{present、absent}:present表示在现有文件中,如果存在,则报OK;如果不存在,则添加该文件块;absent表示如果存在该文件块,则删除该文件块;如果不存在,则报OK 。
7. 使用sefcontext模块更新selinux策略
sefcontext模块更新SELinux策略中目标的默认上下文,但不更改现有文件的上下文
# 在7中,需要明确控制节点和受管主机上安装这两个模块:libselinux-python和policycoreutils-python
# ls -Z /var/www/html/file
unconfined_u:object_r:admin_home_t:s0 /var/www/html/file
# cat playbook.yaml
---
- hosts: all
gather_facts: no
tasks:
- name: test
sefcontext:
path: /var/www/html/file
setype: httpd_sys_content_t
state: present
# ansible-playbook playbook.yaml
PLAY [all] ******************************************************************************
TASK [test] *****************************************************************************
changed: [client.example.com]
PLAY RECAP ******************************************************************************
client.example.com : ok=1 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
# ll -Z file
-rw-r--r--. 1 root root unconfined_u:object_r:httpd_sys_content_t:s0 0 Sep 8 17:38 file
8. 检索受管主机上的文件状态
stat模块检索文件的事实,类似于Linux中的stat命令;参数提供检索文件属性、确定文件检验和等功能。
stat模块返回一个包含文件状态数据的值的散列字典,允许用户使用单独的变量引用各条信息。
演示实例:
注册stat模块的结果,然后显示它检查的文件的MD5检验和
# cat playbook.yaml
---
- hosts: all
gather_facts: no
tasks:
- name: test
stat:
path: /root/file
checksum_algorithm: md5
register: result
- debug:
msg: "{{ result['stat']['checksum'] }}"
# msg: "{{ result.stat.checksum }}"
[root@servera ~]# ansible-playbook -i hosts playbook.yml
PLAY [all] ******************************************************************************
TASK [test] *****************************************************************************
ok: [servera]
TASK [debug] ****************************************************************************
ok: [servera] => {
"msg": "ba1f2511fc30423bdbb183fe33f3dd0f"
}
PLAY RECAP ******************************************************************************
servera : ok=2 changed=0 unreachable=0 failed=0
9. 同步控制节点和受管主机之间的文件
synchronize模块是一个围绕rsync工具的打包程序,它简化了playbook中的常见文件管理任务
rsync工具必须同时安装在本机和远程主机上
默认情况下,在使用synchronize模块时,“本地主机”是同步任务所源自的主机(通常是控制节点),而“目标主机”是synchronize连接到的主机
演示实例:
明确控制节点和受管主机上安装rsync工具:yum install -y rsync
# cat playbook.yaml
---
- hosts: all
gather_facts: no
tasks:
- name: test
synchronize:
src: abc/test
dest: /root/file
[root@servera ~]# ansible-playbook -i hosts playbook.yml
PLAY [all] ******************************************************************************
TASK [test] *****************************************************************************
changed: [servera]
PLAY RECAP ******************************************************************************
servera : ok=1 changed=1 unreachable=0 failed=0
[root@servera ~]# ansible -i hosts all -a 'cat /root/file'
servera | CHANGED | rc=0 >>
test rysnc
总结
- 介绍常用文件模块的使用:file、lineinfile、blockinfile、sefcontext、stat、synchronize。
以上就是【金鱼哥】对 第六章 在被管理节点上创建文件和目录—常用文件模块 的简述和讲解。希望能对看到此文章的小伙伴有所帮助。
如果这篇【文章】有帮助到你,希望可以给【金鱼哥】点个赞👍,创作不易,相比官方的陈述,我更喜欢用【通俗易懂】的文笔去讲解每一个知识点,如果有对【运维技术】感兴趣,也欢迎关注❤️❤️❤️ 【金鱼哥】❤️❤️❤️,我将会给你带来巨大的【收获与惊喜】💕💕!
- 点赞
- 收藏
- 关注作者
评论(0)