如何强制使用Ansible变量

时间:2017-07-10 13:26:06

标签: ansible

我正在寻找如何让Ansible在运行playbook执行之前分析必备和强制变量的剧本的方式,如:

- name: create remote app directory hierarchy
  file:
    path: "/opt/{{ app_name | required }}/"
    state: directory
    owner: "{{ app_user | required }}"
    group: "{{ app_user_group | required }}"
  ...

并且如果变量未定义则会出现错误消息,例如:

please set "app_name" variable before run (file XXX/main.yml:99)

5 个答案:

答案 0 :(得分:7)

您可以使用this

{{ variable | mandatory }}

答案 1 :(得分:6)

Arbab Nazar所述,您可以在Ansible任务中使用{{ variable | mandatory }}(请参阅Forcing variables to be defined)。

但我认为将其添加为第一个任务看起来更好,它检查是否存在app_nameapp_userapp_user_group

- name: 'Check mandatory variables are defined'
  assert:
    that:
      - app_name is defined
      - app_user is defined
      - app_user_group is defined

答案 2 :(得分:6)

通常在角色内部,像示例一样执行输入变量检查:

- name: "Verify that required string variables are defined"
  assert:
    that: ahs_var is defined and ahs_var | length > 0 and ahs_var != None
    fail_msg: "{{ ahs_var }} needs to be set for the role to work "
    success_msg: "Required variable {{ ahs_var }} is defined"
  loop_control:
    loop_var: ahs_var
  with_items:
    - ahs_item1
    - ahs_item2
    - ahs_item3

顺便说一下,有一些技巧:

  1. 请勿在角色内部使用全局变量。
  2. 如果要使用全局变量,请定义角色特定的变量并为其设置全局变量,即some_role_name__db_port: "{{ db_port | default(5432) }}"
  3. 使用角色名称作为变量的前缀是有意义的。它有助于更​​轻松地了解源清单。
  4. 您的角色可能会以某种方式循环播放,因此可以覆盖默认的item

答案 3 :(得分:3)

定义检查强制变量的一种方法是:

- fail:
    msg: "Variable '{{ item }}' is not defined"
  when: item not in vars
  with_items:
    - app_nam
    - var2

答案 4 :(得分:1)

有两种方法:

  1. 指定|mandatory过滤器

    1. 小心词典 - 如果一个具有强制值的键无法评估,您可能很难理解它是什么。
  2. 使用assert模块