jimlu

V1

2023/04/18阅读:80主题:默认主题

ansible实战之下载文件

ansible实战之文件下载

1、实现思路思路

  • ansible下载文件需要用到fetch模块
  • fetch模块只能下载文件,目录无法下载,如果要下载目录或者多个文件fetch模块无法实现
  • 使用archive模块将多个文件压缩成一个文件,就可用fetch模块进行下载了
  • 基于以上思路,就需要创建一个临时目录用来存放文件
  • 稍微扩展一下,如果记不清楚自己到底要下载什么文件,想通过关键字或者其他如linux中find命令一样查找文件的方式,查找到文件然后下载的话,ansible有find模块可以实现
  • 最后创建的临时文件会占用被控主机磁盘空间,使用完成后删除,需要使用到file模块

2、实现过程

1、使用file模块在被控端创建存放查找到文件的临时目录

  • file模块 管理文件
    • path 指定路径
    • state 具体的操作,directory表示创建目录,如果是file则表示创建文件,absent表示删除文件……
  • 使用vars 定义了一个tmpdir变量,变量值就是临时存放文件的目录
  • 如果不定义的话,可以直接商量vars及下面一行,直接将/tmp/tmp_download_dir写到file模块的path后面,替换掉"{{tmpdir}}",如:path: /tmp/tmp_download_dir
---
- name: test find
  hosts: all
  gather_facts: no
  vars:
    - tmpdir: /tmp/tmp_download_dir   #定义临时存放文件目录

  tasks:
    - name: create dir    #创建临时存放文件的目录
      file:
        path: "{{tmpdir}}"
        state: directory

2、使用find模块查找需要下载的文件

  • rescurse:no #表示不进行子目录查找
  • patterns #指定匹配条件
  • register: refiles #将find模块执行的结果保存到refiles变量中
    - name: find contain  #查找匹配的文件
      find:
        paths: /etc
        recurse: no
        file_type: file
        size: 500b
        patterns: "*.conf"
      register: refiles    #结果存放到refiles变量中

3、使用shell模块将查找到的文件拷贝到临时下载目录

---
    - name: find contain  #查找匹配的文件
      find:
        paths: /etc
        recurse: no
        file_type: file
        size: 500b
        patterns: "*.conf"
      register: refiles    #结果存放到refiles变量中
    - shell: "cp {{item.path}} /tmp/tmp_download_dir"    #将查找到的文件拷贝到用于存放下载文件的临时目录
      with_items: "{{refiles.files}}"

4、使用archive模块将存放下载文件的临时目录进行压缩

  • {{inventory_hostname}} #变量,对应inventory中的主机
  • format: zip #压缩成.zip文件
  • remove: yes #压缩完后删除源我呢见
    - archive:
        path: "/tmp/tmp_download_dir"
        dest: "/tmp/{{inventory_hostname}}.zip"  #对临时目录进行压缩
        format: zip
        remove: yes

5、使用fetch模块建压缩好的下载文件进行下载

  • flat: yes #使用自定义文件名
    - fetch:                            #下载 压缩文件
        src: "/tmp/{{inventory_hostname}}.zip"
        dest: /home/admin/jin/test1/
        flat: yes

6、删除临时目录及压缩包

  • with_items和{{item}}搭配使用,item循环遍历with_items中的内容
    - file:           #删除sahng'被控端的临时目录
        path: "{{item}}"
        state: absent
      with_items:
        - "/tmp/tmp_download_dir"
        - "/tmp/{{inventory_hostname}}.zip"

3、最终成型playbook如下


[root@jfedu01 jin]# more find1.yaml
---
- name: test find
  hosts: all
  gather_facts: no
  vars:
    - tmpdir: /tmp/tmp_download_dir   #定义临时存放文件目录

  tasks:
    - name: create dir    #创建临时存放文件的目录
      file:
        path: "{{tmpdir}}"
        state: directory
    - name: find contain  #查找匹配的文件
      find:
        paths: /etc
        recurse: no
        file_type: file
        size: 500b
        patterns: "*.conf"
      register: refiles    #结果存放到refiles变量中
    - shell: "cp {{item.path}} {{tmpdir}}"    #将查找到的文件拷贝到用于存放下载文件的临时目录
      with_items: "{{refiles.files}}"
    - archive:
        path: "{{tmpdir}}"
        dest: "/tmp/{{inventory_hostname}}.zip"  #对临时目录进行压缩
        format: zip
        remove: yes
    - fetch:                            #下载 压缩文件
        src: "/tmp/{{inventory_hostname}}.zip"
        dest: /home/admin/jin/test1/
        flat: yes
    - file:           #删除'被控端的临时目录
        path: "{{item}}"
        state: absent
      with_items:
        - "{{tmpdir}}"
        - "/tmp/{{inventory_hostname}}.zip"

分类:

后端

标签:

运维部署

作者介绍

jimlu
V1