我对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)]
答案 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_value
和max_size_static
是数字,但max_size_dynamic
是一个字符串(您不能在ansible中的{{...}}
之外创建简单整数 - 仅限字符串/布尔值/列表/字典)。