如何使用ansible基于vars标志将文件复制到计算机



我正试图获得一个剧本,将不同的文件集复制到服务器上,这取决于它在ansible库存中所属的组的标志集。

代码如下

- name: check if they exist already
stat:
path: /home/me/set1files
register: st
- name: copy pre-prod if they don't
copy:
src: /home/me/set1files
dest: /home/me
owner: me
group: me
mode: "0644"
when: (st.stat.exists==false) and (is_emms_pp==true)
- name: check if prod files exist
stat:
path: /home/me/set2files
register: stprod
- name: copy prod files
copy:
src: /home/me/set2files
dest: /home/me
owner: me
group: me
mode: "0644"
when: (stprod.stat.exists==false) and (is_emms_pp==false)

并且在库存文件中

[PPEMMS]
emmspp1
emmspp2
emmspp3
[PPEMMS:vars]
is_emms_pp = true
                                                        
[PRODEMMS]
emms1
emms2
emms3
[PRODEMMS:vars]
is_emms_pp = false
[EMMS:children]
PPEMMS
PRODEMMS

当我在一台新的PP机器上运行脚本时,一切似乎都很好,但当我在新的Prod机器上运行它时,它仍然会复制PP文件并跳过Prod机器的步骤。

这是一个有效的测试还是我出了问题?

我的一个想法是,因为我将脚本限制在一台机器上,而不是一个组,所以它不会拾取group_var?

我正在使用脚本作为

ansible-playbook -i inventory/hosts -l emms1 install_emms.yml  --ask-vault-pass  --extra-vars '@passwd.yml'

对于每台机器。

变量is_emms_pp = true是一个字符串。引用运行时定义变量

">使用key=value语法传入的值被解释为字符串。如果需要传递布尔值、整数、浮点值、列表等非字符串值,请使用JSON格式。">

给定库存以简化测试

test_01 is_emms_pp=true
test_02 is_emms_pp=false

战术手册

- hosts: test_01,test_02
tasks:
- debug:
var: is_emms_pp|type_debug

给出

ok: [test_01] => 
is_emms_pp|type_debug: str
ok: [test_02] => 
is_emms_pp|type_debug: str

字符串和布尔值之间的比较将使失败

- debug:
msg: Copy file
when: is_emms_pp == true

给出

skipping: [test_01]
skipping: [test_02]

一种选择是比较字符串。以下任务按预期工作

- debug:
msg: Copy file
when: is_emms_pp == 'true'

给出

ok: [test_01] => 
msg: Copy file
skipping: [test_02]

更干净的选项是将变量转换为布尔值。下面的任务给出了相同的结果

- debug:
msg: Copy file
when: is_emms_pp|bool

参见CONDITIONAL_BARE_VARS


如何修复条件的示例

- name: check if they exist already
stat:
path: /home/me/set1files
register: st
- name: copy pre-prod if they don't
debug:
msg: Copy set1files
when:
- not st.stat.exists
- is_emms_pp|bool
- name: check if prod files exist
stat:
path: /home/me/set2files
register: st
- name: copy prod files
debug:
msg: Copy set2files
when:
- not st.stat.exists
- not is_emms_pp|bool

最新更新