Как запустить задачу, если определена только переменная
У меня есть следующая задача:
-name : task name
cron:
...
...
...
when: "{{ vars[cname].cron }}" is defined
я хочу выполнить задачу, только если переменная server1.cron для хоста server1 и server2.cron для хоста server2 и т.д.. определена, но ansible не нравится синтаксис, когда я разрешаю только vars[cname].cron ansible с ou " " он не заменяет vars [cname].cron на server1.cron или server2.cron, он интерпретирует его как переменную "vars[cname].cron", которая не существует. Сталкивались ли вы с этой проблемой? Заранее спасибо ^^!
2 ответа
Попробуйте это на:
---
- 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
Playbook:
---
- 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 и т. д... <== это имя файлов, которые находятся в роли / VARS /
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: "*****"
Я включил файл с этой задачей, чтобы у меня был variabl 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
вы видите проблему в том, что я не могу поставить " " в предложении, и я не могу получить динамическую переменную без " ", я запутался