文章目录专栏回顾(文章描述为章节):https://blog.csdn.net/qq_41765918/category_11512932.html
本章节介绍如何在ansilbe中使用常用的文件模块,让你的工作效率飞起来,可以多点时间看 剧。
- 使用Ansible常用文件模块,我的工作效率上来了,业余生活也丰富了
- 1. 描述文件模块
- 常用的文件模块
- (已介绍的可参照笔记此前的模块参数说明)
- 2. 使用file模块确保受管主机上存在文件
- 3. 在受管主机上删除文件
- 4. 在受管主机上复制和编辑文件
- 5. 使用lineinfile模块,确保文件中主机单个文件中存在特定的单行文本(扩展来讲)
- 常用参数
- 1.正则匹配,更改某个关键参数值
- 2.在匹配的内容前或后增加一行
- insertbefore匹配内容在前面添加
- insertafter匹配内容在后面添加
- 3.修改文件内容和权限
- 4.删除某一行内容
- 5.文件存在就添加一行
- 6.使用valiate参数
- 7. 使用backrefs参数
- 6. 使用blockinfile模块将所列出的文件块添加到受管主机现有文件中
- 7. 使用sefcontext模块更新selinux策略
- 8. 检索受管主机上的文件状态
- 演示实例:
- 9. 同步控制节点和受管主机之间的文件
- 演示实例:
- 总结
Files模块库包含的模块允许用户完成与Linux文件管理相关的大多数任务,如创建、复制、编辑和修改文件的权限和其他属性。下表提供了常用文件管理模块的列表:
常用的文件模块使用file模块处理受管主机上的文件。其工作方式与touch命令类似,如果不存在则创建一个空文件,如果存在,则更新其修改时间。
# cat playbook.yml --- - hosts: all gather_facts: no tasks: - name: look the file is exit file: path: /root/file mode: 0755 state: touch3. 在受管主机上删除文件
从受管主机中删除文件的基本示例是使用file模块和state: absent参数
# cat playbook.yml --- - hosts: all gather_facts: no tasks: - name: look the file is exit file: path: /root/file state: absent4. 在受管主机上复制和编辑文件
使用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/file5. 使用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 #Portinsertbefore匹配内容在前面添加
- 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 #Portinsertafter匹配内容在后面添加
- 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 80803.修改文件内容和权限
# 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 hosts4.删除某一行内容
# 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 localhosts5.文件存在就添加一行
# 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 foo6.使用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 file8. 检索受管主机上的文件状态
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=09. 同步控制节点和受管主机之间的文件
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条)