zoukankan      html  css  js  c++  java
  • Ansible_使用文件模块将修改文件复制到受管主机

    一、描述常用文件模块

    1、常用文件模块

    模块名称模块说明
    blockinfile 插入、更新或删除由可自定义标记线包围的多行文本块
    copy 将文件从本地或远程计算机复制到受管主机上的某个位置。
    类似于file模块,copy模块还可以设置文件属性,包括SELinux上下文件。
    fetch 此模块的作用和copy模块类似,但以相反方式工作。此模块用于从远程计算机获取文件到控制节点,
    并将它们存储在按主机名组织的文件树中。
    file 设置权限、所有权、SELinux上下文以及常规文件、符号链接、硬链接和目录的时间戳等属性。
    此模块还可以创建或删除常规文件、符号链接、硬链接和目录。其他多个与文件相关的
    模块支持与file模块相同的属性设置选项,包括copy模块。
    lineinfile 确保特定行位于某文件中,或使用反向引用正则表达式来替换现有行。
    此模块主要在用户想要更改文件的某一行时使用。
    stat 检索文件的状态信息,类似于Linux中的stat命令。
    synchronize 围绕rsync命令的一个打包程序,可加快和简化常见任务。
    synchronize模块无法提供对rsync命令的完整功能的访问权限,但确实最常见的调用更容易实施。
    用户可能仍需通过run command模块直接调用rsync命令。

     2、Ansible常用模块使用详解

    二、file模块的自动化演示

    1、使用file模块确保受管主机上存在文件

    1️⃣:使用file模块处理受管主机上的文件。其工作方式与touch命令类似,如果不存在则创建一个空文件,如果存在,则更新其修改时间

    • 演示实例:
       //查看playbook
      [root@localhost project]# cat playbook.yaml 
      ---
      - hosts: all
        gather_facts: no
        tasks:
          - name: look the file is exit
            file:
              path: /root/file
              mode: 0755
              state: touch
      
       //执行play
      [root@localhost project]# ansible-playbook playbook.yaml 
      
      PLAY [all] ****************************************************************************************************************************************************************
      
      TASK [look the file is exit] **********************************************************************************************************************************************
      changed: [client.example.com]
      
      PLAY RECAP ****************************************************************************************************************************************************************
      client.example.com         : ok=1    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

    2、在受管主机上删除文件

    1️⃣:从受管主机中删除文件的基本示例是使用file模块和state: absent参数

    • 演示实例:
       //查看playbook
      [root@localhost project]# cat playbook.yaml 
      ---
      - hosts: all
        gather_facts: no
        tasks:
          - name: look the file is exit
            file:
              path: /root/file
              state: absent
      
       //执行play
      [root@localhost project]# ansible-playbook playbook.yaml 
      
      PLAY [all] ****************************************************************************************************************************************************************
      
      TASK [look the file is exit] **********************************************************************************************************************************************
      changed: [client.example.com]
      
      PLAY RECAP ****************************************************************************************************************************************************************
      client.example.com         : ok=1    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

    3、在受管主机上复制和编辑文件

    1️⃣:使用fetch模块将受管主机上的文件索取到控制节点上进行检索(fetch拿来、取来、提取

    • 演示实例:
       //查看playbook
      [root@localhost project]# cat playbook.yaml 
      ---
      - hosts: all
        gather_facts: no
        tasks:
          - name: test
            fetch:
              src: /root/file
              dest: files
      
       //执行play
      [root@localhost project]# 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   
      
       //查看file下是否有该文件
      [root@localhost project]# ls files/
      client.example.com            //fetch模块会自动生成以受管主机域名的目录
      
      [root@localhost project]# cat files/client.example.com/root/file 
      This is test file

    2️⃣:使用lineinfile模块,确保件中主机单个文件中存在特定的单行文本

    • 演示实例:
       //查看playbook
      [root@localhost project]# cat playbook.yaml 
      ---
      - hosts: all
        gather_facts: no
        tasks:
          - name: test
            lineinfile:
              path: /etc/selinux/config
              line: SELINUX=enforcing
              state: present
      
       //执行play
      [root@localhost project]# ansible-playbook playbook.yaml 
      
      PLAY [all] ****************************************************************************************************************************************************************
      
      TASK [test] ***************************************************************************************************************************************************************
      ok: [client.example.com]
      
      PLAY RECAP ****************************************************************************************************************************************************************
      client.example.com         : ok=1    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
       //OK表示存在该行,如果是changed则表示不存在
    • 注意:state:{present、absent}:present表示所列出的行在对应文本里边,如果存在,则报OK,如果不存在,则添加该行;absent表示如果存在对应的列,则删除该列,如果不存在,则返回OK

    3️⃣:使用blockinfile模块将所列出的文件块添加到受管主机现有文件中

    • 演示实例:
         //查看playbook
      [root@localhost project]# 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
      
        //执行play
      [root@localhost project]# 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   
      
       //查看受管主机上file文件
      [root@client ~]# 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、

    4、使用sefcontext模块更新selinux策略

    1️⃣:设置文件上下文时,file模块的行为与chcon类似;使用file设置上下文后,用户可以使用system模块集合中的sefcontext来更新SELinux策略,如semanage fcontext

    2️⃣:sefcontext模块更新SELinux策略中目标的默认上下文(一般对目录使用,对文件使用file模块直接修改属性即可),但不更改现有文件的上下文

    • 演示实例:
      • 首先在控制节点和受管主机上安装两个模块:python3-libselinuxpolicycoreutils-python-utils这两个模块
        [root@localhost ~]# yum install -y python3-libselinux
        [root@localhost ~]# yum install -y policycoreutils-python-utils
    • 演示:
       //查看受管主机上的file文件属性
      [root@client ~]# ls -Z /var/www/html/file 
      unconfined_u:object_r:admin_home_t:s0 /var/www/html/file
       
      //查看playbook
      [root@localhost project]# cat playbook.yaml 
      ---
      - hosts: all
        gather_facts: no
        tasks:
          - name: test
            sefcontext:
              path: /var/www/html/file
              setype: httpd_sys_content_t
              state: present
      
       //执行play
      [root@localhost project]# 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   
      
       //查看受管主机上的file文件属性
      [root@client html]# ll -Z file 
      -rw-r--r--. 1 root root unconfined_u:object_r:httpd_sys_content_t:s0 0 Sep  8 17:38 file

    5、检索受管主机上的文件状态

    1️⃣:stat模块检索文件的事实,类似于Linux中的stat命令;参数提供检索文件属性、确定文件检验和等功能

    2️⃣:stat模块返回一个包含文件状态数据的值的散列字典,允许用户使用单独的变量引用各条信息

    • 演示实例:注册stat模块的结果,然后显示它检查的文件的MD5检验和
       //查看playbook
      [root@localhost project]# 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'] }}" 
      
       //执行play
      [root@localhost project]# ansible-playbook playbook.yaml 
      
      PLAY [all] ****************************************************************************************************************************************************************
      
      TASK [test] ***************************************************************************************************************************************************************
      ok: [client.example.com]
      
      TASK [debug] **************************************************************************************************************************************************************
      ok: [client.example.com] => {
          "msg": "d41d8cd98f00b204e9800998ecf8427e"
      }
      
      PLAY RECAP ****************************************************************************************************************************************************************
      client.example.com         : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

    6、同步控制节点和受管主机之间的文件

    1️⃣:synchronize模块是一个围绕rsync工具的打包程序,它简化了playbook中的常见文件管理任务

    2️⃣:rsync工具必须同时安装在本机和远程主机上

    3️⃣:默认情况下,在使用synchronize模块时,“本地主机”是同步任务所源自的主机(通常是控制节点),而“目标主机”是synchronize连接到的主机

    • 演示实例:
      • 首先下控制节点和受管主机上安装rsync工具
        [root@localhost ~]# yum install -y rsync
        [root@localhost ~]# yum install -y rsync
    • 演示:
       //查看playbook
      [root@localhost project]# cat playbook.yaml 
      ---
      - hosts: all
        gather_facts: no
        tasks:
          - name: test
            synchronize:
              src: files/test
              dest: /root/file
      
       //执行play
      [root@localhost project]# 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   

    7、使用file模块修改文件的上下文属性

    1️⃣:使用file模块还可以确保新的或现有的文件具有正确的权限和SELinux类型

    • 演示实例:
      //查看受管主机上文件默认的上下文属性
      [root@client ~]# ls -Z /root/file 
      unconfined_u:object_r:admin_home_t:s0 /root/file
        //可以看到默认对类型是admin_home_t,我们需要换成httpd_sys_content_t类型
      
       //查看playbook
      [root@localhost project]# cat playbook.yaml 
      ---
      - hosts: all
        gather_facts: no
        tasks:
          - name: test
            file:
              path: /root/file
              setype: httpd_sys_content_t
      
       //执行play 
      [root@localhost project]# 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   
      
       //执行成功够在受管主机上执行restoncon命令恢复file文件的安全上下文属性
      
       //再次查看受管主机上文件上下文属性
      [root@client ~]# ls -Z /root/file 
      unconfined_u:object_r:httpd_sys_content_t:s0 /root/file
       //此时发现file文件的上下文属性已经发生改变
  • 相关阅读:
    LeetCode 83. Remove Duplicates from Sorted List (从有序链表中去除重复项)
    LeetCode 21. Merge Two Sorted Lists (合并两个有序链表)
    LeetCode 720. Longest Word in Dictionary (字典里最长的单词)
    LeetCode 690. Employee Importance (职员的重要值)
    LeetCode 645. Set Mismatch (集合不匹配)
    LeetCode 500. Keyboard Row (键盘行)
    LeetCode 463. Island Perimeter (岛的周长)
    115.Distinct Subsequences
    55.Jump Game
    124.Binary Tree Maximum Path Sum
  • 原文地址:https://www.cnblogs.com/itwangqiang/p/13631934.html
Copyright © 2011-2022 走看看