如果只定义了一个变量,如何 运行 一个任务

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 句子中加上“”,没有“”我就不能得到一个动态变量,我很困惑