大家。我是 ansible 的新手。 我需要通过 ansible 将各种文件部署到 PC 中的各个文件夹。 我有这样的文件:
foo.txt
bar.txt
并且需要将此文件复制到 PC 文件夹中,例如:
/home/foo/file
/home/bar/file
如何检查文件是否存在并复制,如果不存在
我尝试使用ansible.builtin.copy,但我不知道如何使用文件名作为变量。
例如,给定控制器上的文件
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