在Ansible中有条件地定义变量

Chr*_*ian 34 ansible

我想在Ansible剧本中有条件地定义一个变量,如下所示:true.如果条件没有解析为true,我希望变量保持未定义.

如果我尝试这样做,Ansible会出错: my_var.为什么这是一个错误呢?

完整的案例如下:when: condition.如果true已定义,则角色会执行特殊操作.在某些情况下,我不希望角色这样做.我可以使用my_var,但后来我必须复制整个角色块.我还可以使用额外的bool变量,但我想要一个解决方案而不必更改角色的"接口".

有任何想法吗?

小智 40

你可以使用这样的东西:__CODE__.如果条件不匹配,则会发生'else',在这种情况下,将为变量设置一个空值.我认为这是一个简短,可读和优雅的解决方案.

  • 如果my_var应设置为其他变量值(可能未定义),请尝试类似:`{{var_a if var_a is defined else var_b | 默认('默认值')}}` (3认同)
  • OP 告诉您:“我希望变量保持未定义”,而您的回答是将其设置为 `''`。 (3认同)

SPM*_*SPM 22

此代码可以帮助您定义具有条件的变量.

- hosts: node1
  gather_facts: yes
  tasks:
   - name: Check File
     shell: ls -ld /etc/postfix/post-install
     register: result
     ignore_errors: yes

   - name: Define Variable
     set_fact:
         exists: "{{ result.stdout }}"
     when: result|success

   - name: Display Variable
     debug: msg="{{ exists }}"
     ignore_errors: yes
Run Code Online (Sandbox Code Playgroud)

因此,只有条件为真时才会显示"存在".

  • 我建议使用stat模块来检查文件,而不是使用shell命令. (13认同)

COD*_*EaD 15

我的例子,在/sf/answers/3038226061/之后:

vars:
    sudoGroup: "{{ 'sudo' if ansible_distribution == 'Ubuntu' else 'wheel' }}"
Run Code Online (Sandbox Code Playgroud)

由于 Ubuntu 与其他平台使用的 sudo 约定不同,这里我告诉 Ansible如果平台是 Ubuntu,则设置一个名为sudoGroupto的变量sudo,否则将其设置为wheel.

稍后在我的剧本中,我将变量与 Ansible 的user模块结合起来,根据 Ansible 运行的操作系统添加sudo或添加wheel到帐户的次要组:

- name: Add or update bob account
  user:
    name: bob
    uid: 3205
    groups: "{{ sudoGroup }}"
    append: yes
Run Code Online (Sandbox Code Playgroud)

笔记:

  • 双引号周围的{{ variable }}需要在user: groups:上面的定义。
  • 一旦我sudoGroup在 playbook 的 globalvars:部分定义了上述内容,Ansible 就会在运行时(基于ansible_distribution)为我在我的hosts:部分中定义的每个目标配置它。


Luc*_*ity 10

我相信你在寻找default(omit)过滤器。(参考)。

根据示例,mode将表现得好像根本没有为循环中的前两项设置。

- name: touch files with an optional mode
  file:
    dest: "{{item.path}}"
    state: touch
    mode: "{{item.mode|default(omit)}}"
  loop:
    - path: /tmp/foo
    - path: /tmp/bar
    - path: /tmp/baz
      mode: "0444"
Run Code Online (Sandbox Code Playgroud)