在变量

时间:2018-04-13 15:59:28

标签: ansible ansible-2.x

我对Ansible相当新,今天在写一本新的剧本时,我遇到了一些我无法解释的行为。我已经阅读了文档并完成了我最好的Google-Fu,但我似乎无法找到答案。

该行为涉及剧本中定义的变量" var"在使用其他变量或算术时,它们没有扩展到适当的值。

用"静态"做一个示例剧本vars中的值:

--- # Test playbook vars
- hosts: 'all'
connection: ssh
gather_facts: false
vars:
    - max_size_bytes: 10240

tasks:
- name: debug!
  debug:
      msg: |
         "max_size_bytes: {{max_size_bytes}}"
         "vars:           {{vars['max_size_bytes']}}"

输出:

# ansible-playbook -i host1, test_vars.yml

PLAY [all] *************************************************************************************************************************

TASK [debug!] **********************************************************************************************************************
ok: [host1] => {}

MSG:

"max_size_bytes: 10240"
"vars:           10240"

这正是我所期待的。

但是,我们要说我想动态计算10240个数字:

--- # Test playbook vars
- hosts: 'all'
connection: ssh
gather_facts: false
vars:
    - max_size_bytes: "{{10 * 1024}}"

tasks:
- name: debug!
  debug:
      msg: |
         "max_size_bytes: {{max_size_bytes}}"
         "vars:           {{vars['max_size_bytes']}}"

新结果是:

# ansible-playbook -i host1, test_vars.yml

PLAY [all] *************************************************************************************************************************

TASK [debug!] **********************************************************************************************************************
ok: [host1] => {}

MSG:

"max_size_bytes: 10240"
"vars:           {{10 * 1024}}"

如果我尝试在赋值中使用另一个变量,我会得到类似的输出。当我想让一个剧本用户快速更改某些设置时,我遇到了这个问题,而不需要他们计算任何东西。例如:

vars:
    - max_size_in_megabytes: 100 #change me if required
    - max_size_bytes: "{{max_size_in_megabytes * 1024 * 1024}}"

但如上所述,这并没有像我预期的那样奏效。

在某些地方,变量被正确扩展并给出我期望的结果(即计算值)。在其他时候,似乎变量未展开,并根据vars['max_size_bytes']的输出被视为字符串。

  • 这种行为的原因是什么?变量扩展和计算值似乎在剧本中的其他地方起作用 - 为什么不预先定义变量?
  • 如果这种行为被认为是正常的,那么创建可能需要动态计算的全局/可重用变量的正确方法是什么?

更新

我意识到我的问题实际上可能存在一些混乱。这是我的错。

为了更好地解释,请看另一个例子:

--- # Test playbook vars
 - hosts: 'localhost'
   connection: local
   gather_facts: false
   vars:
       - multiplier: 10 #change me as required
       - some_value: 300
       - max_size_dynamic: "{{10 * 20}}"
       - max_size_static: 200

   tasks:
   - set_fact:
       is_bigger_dynamic: "{{some_value > max_size_dynamic}}"
       is_bigger_static: "{{some_value > max_size_static}}"

   - name: debug!
     debug:
         msg: |
            multiplier:          {{multiplier}}
            some_value           {{some_value}}

            Is {{some_value}} bigger than {{max_size_static}}?
            is_bigger_static:   {{is_bigger_static}}     <-- hooray

            Is {{some_value}} bigger than {{max_size_dynamic}}?
            is_bigger_dynamic:   {{is_bigger_dynamic}}   <-- woops!

运行此playbook时,您可以看到set_fact任务中条件子句的值根据vars中变量的创建方式而有所不同。

输出:

PLAY [localhost] **********************************************************************************************************************

TASK [set_fact] ***********************************************************************************************************************
ok: [localhost]

TASK [debug!] *************************************************************************************************************************
ok: [localhost] => {}

MSG:

multiplier:          10
some_value           300

Is 300 bigger than 200?
is_bigger_static:   True     <-- hooray

Is 300 bigger than 200?
is_bigger_dynamic:   False   <-- woops!

条件语句检查相同的表达式:300 > 200,但如果值200是从vars中的另一个表达式派生的,则条件错误。

我怀疑在{{some_value > max_size_dynamic}}的情况下,变量未被展开(很像使用评论中提到的vars['name\])。所以有条件的结果似乎是{{some_value > "{{10 * 20}}"}}

这是set_fact的预期行为吗?我可以做些什么来允许vars中允许在set_fact任务中进一步使用的表达式吗?

这是在MacOS High Sierra上运行最新版本的Ansible:

# ansible --version
ansible 2.5.0
  config file = /Users/xxx/.ansible.cfg
  configured module search path = [u'/Users/xxx/.ansible/plugins/modules', u'/usr/share/ansible/plugins/modules']
  ansible python module location = /usr/local/Cellar/ansible/2.5.0/libexec/lib/python2.7/site-packages/ansible
  executable location = /usr/local/bin/ansible
  python version = 2.7.14 (default, Apr  9 2018, 16:44:39) [GCC 4.2.1 Compatible Apple LLVM 9.1.0 (clang-902.0.39.1)]

1 个答案:

答案 0 :(得分:0)

您对问题的更新与原始帖子完全不同。

更新部分的问题是:Why a string in always "greater than" a number?

只需进行类型转换:

- set_fact:
    is_bigger_dynamic: "{{some_value > max_size_dynamic | int }}"
    is_bigger_static: "{{some_value > max_size_static }}"

在您的情况下,some_valuemax_size_static是数字,但max_size_dynamic是一个字符串(您不能在ansible中的{{...}}之外创建简单整数 - 仅限字符串/布尔值/列表/字典)。