使用来自ansible文件的文件名,如变量

问题描述 投票:0回答:1

大家。我是 ansible 的新手。 我需要通过 ansible 将各种文件部署到 PC 中的各个文件夹。 我有这样的文件:

foo.txt
bar.txt

并且需要将此文件复制到 PC 文件夹中,例如:

/home/foo/file
/home/bar/file

如何检查文件是否存在并复制,如果不存在

我尝试使用ansible.builtin.copy,但我不知道如何使用文件名作为变量。

ansible
1个回答
0
投票

例如,给定控制器上的文件

shell> ls /tmp/ansible/files/
admin.txt  bob.txt  www.txt

获取文件

  files: "{{ query('fileglob', '/tmp/ansible/files/*') }}"

给予

  files:
  - /tmp/ansible/files/admin.txt
  - /tmp/ansible/files/www.txt
  - /tmp/ansible/files/bob.txt

获取名字

  names: "{{ files | map('basename') | map('splitext') | map('first') }}"

给予

  names:
  - admin
  - www
  - bob

并创建下面的字典

  names_files: "{{ dict(names | zip(files)) }}"

给予

  names_files:
    admin: /tmp/ansible/files/admin.txt
    bob: /tmp/ansible/files/bob.txt
    www: /tmp/ansible/files/www.txt

查找远程主机上的目录

    - find:
        paths: /home
        file_type: directory
      register: out

并声明目录列表

dirs: "{{ out.files | map(attribute='path') | map('basename') }}"

例如,在三个远程主机上

ok: [test_01] => 
  dirs:
  - admin
  - theo
  - bob
ok: [test_02] => 
  dirs:
  - admin
ok: [test_03] => 
  dirs:
  - admin

如果目录存在则复制文件

    - copy:
        src: "{{ item.value }}"
        dest: "/home/{{ item.key }}/file"
      loop: "{{ names_files | dict2items }}"
      when: item.key in dirs

提供 --check --diff 选项

changed: [test_01] => (item={'key': 'admin', 'value': '/tmp/ansible/files/admin.txt'})
changed: [test_02] => (item={'key': 'admin', 'value': '/tmp/ansible/files/admin.txt'})
changed: [test_03] => (item={'key': 'admin', 'value': '/tmp/ansible/files/admin.txt'})
skipping: [test_01] => (item={'key': 'www', 'value': '/tmp/ansible/files/www.txt'}) 
skipping: [test_03] => (item={'key': 'www', 'value': '/tmp/ansible/files/www.txt'}) 
skipping: [test_02] => (item={'key': 'www', 'value': '/tmp/ansible/files/www.txt'}) 
skipping: [test_03] => (item={'key': 'bob', 'value': '/tmp/ansible/files/bob.txt'}) 
skipping: [test_02] => (item={'key': 'bob', 'value': '/tmp/ansible/files/bob.txt'}) 
changed: [test_01] => (item={'key': 'bob', 'value': '/tmp/ansible/files/bob.txt'})

用于测试的完整剧本示例

- hosts: all

  vars:

    files: "{{ query('fileglob', '/tmp/ansible/files/*') }}"
    names: "{{ files | map('basename') | map('splitext') | map('first') }}"
    names_files: "{{ dict(names | zip(files)) }}"
    dirs: "{{ out.files | map(attribute='path') | map('basename') }}"

  tasks:

    - block:
        - debug:
            var: files
        - debug:
            var: names
        - debug:
            var: names_files
      run_once: true

    - find:
        paths: /home
        file_type: directory
      register: out
    - debug:
        var: dirs

    - copy:
        src: "{{ item.value }}"
        dest: "/home/{{ item.key }}/file"
      loop: "{{ names_files | dict2items }}"
      when: item.key in dirs
© www.soinside.com 2019 - 2024. All rights reserved.