如何根据组成员身份将文件复制到主机?
我不知道该怎么做。我唯一能想到的就是这样:
hostsfile:
[webserver]
hostA
[dbserver]
hostB
files:
webfile.zip
dbfile.zip
- copy:
src: one of the files
dest: /opt
owner: '{owner}}'
group: '{group}}'
Fashion: 0644
when: groupname == webserver then file: webfile.zip OR groupname == dbserver then dbfile.zip
但是据我所知,它是行不通的。
答案 0 :(得分:0)
使用Ansible,通常有几种处理方法,因此实际上取决于此剧本的最终结果以及以后是否进行扩展。但是,您可以通过使用组变量来完成此操作(主机变量可以做同样的事情,但是设置不同)。
[WEBSERVERS]
hostname1
[DBSERVERS]
hostname2
[WEBSERVERS:vars]
file=webserver_file.txt
destination=/web/server/path
[DBSERVERS:vars]
file=dbserver_file.txt
destination=/db/server/path
- name: Deployment Files to Hosts
hosts: all
gather_facts: false
vars:
owner: user_name
group: group_name
tasks:
- name: loop through items based on group_vars
copy:
src: '{{ file }}'
dest: '{{ destination }}'
owner: '{{ owner }}'
group: '{{ group }}'
mode: 644
答案 1 :(得分:0)
您可以为此使用组变量。当剧本在Web服务器上运行时,webserver.yml将被加载,而dbserver则相同:
group_vars / webserver.yml
file: webfile.zip
group_vars / dbserver.yml
file: dbfile.zip
task.yml
- copy:
src: "{{ file }}"
dest: /opt
owner: "{{ owner }}"
group: "{{ group }}"
Fashion: 0644
答案 2 :(得分:0)
预先准备一个包含文件位置的数组,然后在with_first_found
查找中使用它。以下内容可用于选择主机定制的资源,组(无优先级)或默认资源。
这对于没有公用主机(即prod
,test
,dev
)的组非常适用。
- hosts: all
tasks:
- name: create group paths array
set_fact:
group_paths: "{{ group_paths | default([]) + [ 'files/' + item ] }}"
with_items: "{{ group_names }}"
- name: show first found based on group
debug:
msg: "found {{ item }}"
with_first_found:
- "files/{{ inventory_hostname }}"
- "{{ group_paths }}"
- "files/default"