如果只定义了一个变量,如何 运行 一个任务
how to run a task if only a variable is defined
我有以下任务:
-name : task name
cron:
...
...
...
when: "{{ vars[cname].cron }}" is defined
我想运行一个任务,只有当主机server1的变量server1.cron和主机server2的server2.cron等变量被定义但ansible不喜欢当我只让 vars[cname].cron ansible 与你 " " 时的语法它不会用 server1.cron 或 server2.cron 替换 vars[cname].cron 它将它解释为 "vars[cname].cron" 变量这是不存在的。
你遇到过这个问题吗?
提前致谢^^ !
试穿:
---
- hosts: all
gather_facts: False
vars:
my_vars:
cname1:
cron: "val1"
cname2:
cron2: "val2"
tasks:
- name: task name 1
debug:
msg: "test"
when: my_vars['cname1']['cron'] is defined
- name: task name 2
debug:
msg: "test"
when: my_vars['cname2']['cron'] is defined
输出为
PLAY [all] ***************************************************************************************************************************************************
TASK [task name 1] *******************************************************************************************************************************************
ok: [host] => {
"msg": "test"
}
TASK [task name 2] *******************************************************************************************************************************************
skipping: [host]
PLAY RECAP ***************************************************************************************************************************************************
host : ok=1 changed=0 unreachable=0 failed=0
或另一种方法:
库存
[all]
staging cname=server1_prod
testing cname=server2_prod
剧本:
---
- hosts: all
gather_facts: False
vars:
my_vars:
server1_prod:
cron: "val1"
server2_prod:
cron2: "val2"
tasks:
- name: task name 1
debug:
msg: "test"
when: my_vars[cname]['cron'] is defined
您应该跳过 when
部分中的引号。
https://docs.ansible.com/ansible/latest/user_guide/playbooks_conditionals.html
我在库存文件中有:
server1-prod cname=server1_prod
server2-prdo cname=server2_prod
......
.....
在我的角色中,我在每个服务器的 vars 中都有一个这样的文件:server1_pprod server2_pp 等... <== 这是 [=24 中的文件的名称=]/
cron:
job1:
name: "******"
job: "********"
minute: "0"
hour: "0"
day: "*"
month: "*"
weekday: "*"
disabled: "no"
backup: yes
job: "*******************************"
cron_special_time:
job1:
name: "******"
special_time: "reboot"
disabled: "yes"
backup: yes
job: "*****"
job2:
name: "*****"
special_time: "reboot"
disabled: "yes"
backup: yes
job: "*****"
我将文件包含在这个任务中,这样我就有了每个文件的变量 serveX_prod serverX_prod,它与清单中的 serveX-prod 相关联
- name: Loading system cron file to vars
include_vars:
file: "{{ cname }}"
name: "{{ cname }}"
然后我在任务中访问变量:
- name: Add system cron jobs
cron:
.....
......
with_dict:
- "{{ vars[cname].cron }}"
when: "{{ vars[cname].cron }}" is defined
你看,问题是我不能在 when 句子中加上“”,没有“”我就不能得到一个动态变量,我很困惑
我有以下任务:
-name : task name
cron:
...
...
...
when: "{{ vars[cname].cron }}" is defined
我想运行一个任务,只有当主机server1的变量server1.cron和主机server2的server2.cron等变量被定义但ansible不喜欢当我只让 vars[cname].cron ansible 与你 " " 时的语法它不会用 server1.cron 或 server2.cron 替换 vars[cname].cron 它将它解释为 "vars[cname].cron" 变量这是不存在的。 你遇到过这个问题吗? 提前致谢^^ !
试穿:
---
- hosts: all
gather_facts: False
vars:
my_vars:
cname1:
cron: "val1"
cname2:
cron2: "val2"
tasks:
- name: task name 1
debug:
msg: "test"
when: my_vars['cname1']['cron'] is defined
- name: task name 2
debug:
msg: "test"
when: my_vars['cname2']['cron'] is defined
输出为
PLAY [all] ***************************************************************************************************************************************************
TASK [task name 1] *******************************************************************************************************************************************
ok: [host] => {
"msg": "test"
}
TASK [task name 2] *******************************************************************************************************************************************
skipping: [host]
PLAY RECAP ***************************************************************************************************************************************************
host : ok=1 changed=0 unreachable=0 failed=0
或另一种方法:
库存
[all]
staging cname=server1_prod
testing cname=server2_prod
剧本:
---
- hosts: all
gather_facts: False
vars:
my_vars:
server1_prod:
cron: "val1"
server2_prod:
cron2: "val2"
tasks:
- name: task name 1
debug:
msg: "test"
when: my_vars[cname]['cron'] is defined
您应该跳过 when
部分中的引号。
https://docs.ansible.com/ansible/latest/user_guide/playbooks_conditionals.html
我在库存文件中有:
server1-prod cname=server1_prod
server2-prdo cname=server2_prod
......
.....
在我的角色中,我在每个服务器的 vars 中都有一个这样的文件:server1_pprod server2_pp 等... <== 这是 [=24 中的文件的名称=]/
cron:
job1:
name: "******"
job: "********"
minute: "0"
hour: "0"
day: "*"
month: "*"
weekday: "*"
disabled: "no"
backup: yes
job: "*******************************"
cron_special_time:
job1:
name: "******"
special_time: "reboot"
disabled: "yes"
backup: yes
job: "*****"
job2:
name: "*****"
special_time: "reboot"
disabled: "yes"
backup: yes
job: "*****"
我将文件包含在这个任务中,这样我就有了每个文件的变量 serveX_prod serverX_prod,它与清单中的 serveX-prod 相关联
- name: Loading system cron file to vars
include_vars:
file: "{{ cname }}"
name: "{{ cname }}"
然后我在任务中访问变量:
- name: Add system cron jobs
cron:
.....
......
with_dict:
- "{{ vars[cname].cron }}"
when: "{{ vars[cname].cron }}" is defined
你看,问题是我不能在 when 句子中加上“”,没有“”我就不能得到一个动态变量,我很困惑