我正试图获得一个剧本,将不同的文件集复制到服务器上,这取决于它在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