使用Ansible常用文件模块,我的工作效率上来了,业余生活也丰富了

使用Ansible常用文件模块,我的工作效率上来了,业余生活也丰富了,第1张

使用Ansible常用文件模块,我的工作效率上来了,业余生活也丰富了 使用Ansible常用文件模块,我的工作效率上来了,业余生活也丰富了

专栏回顾(文章描述为章节):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. 同步控制节点和受管主机之间的文件
        • 演示实例:
    • 总结

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。
  • 若喜欢金鱼哥的文章,顺手点个赞。也可点个关注,因为后续会不断上干货。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5680789.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存