首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从Ansible中的查找中创建常量

从Ansible中的查找中创建常量
EN

Stack Overflow用户
提问于 2021-08-19 14:50:56
回答 2查看 249关注 0票数 1

我正在尝试从Ansible中的查找中创建一个变量。然后,我想在角色的其余部分中使用该变量作为常量。下面是来自defaults/main.yml的几行代码。

代码语言:javascript
复制
job_start_time: "{{ lookup('pipe','date +%Y%m%d_%H%M%S') }}"
new_virtual_machine_name: "{{ template_name }}-pkrclone-{{ job_start_time }}"

new_virtual_machine_name变量在tasks/main.yml中使用时,运行角色的结果会导致一个错误,因为查找会再次发生。您可以看到后续任务中的第二个增量。

代码语言:javascript
复制
TASK [update_vsphere_template : Write vsphere source file] changed: [localhost] => {"changed": true, "checksum": "c2ee7ed6fad0b26aea825233f3e714862de3ac28", "dest": "packer-DevOps-Windows2019-Base-DevOps-Windows2019-Base-pkrclone-20210819_**093122**/vsphere-source-DevOps-Windows2019-Base-DevOps-Windows2019-Base-pkrclone-20210819_**093122**.pkr.hcl", 148765781020136/source", "state": "file", "uid": 1000}

TASK [update_vsphere_template : Write the template update file] *fatal: [localhost]: FAILED! => {"changed": false, "checksum": "6fd97c1d2373b9c71ad6b5246529c46a38f55c48", "msg": "Destination directory packer-DevOps-Windows2019-Base-DevOps-Windows2019-Base-pkrclone-20210819_**093123** does not exist"}

下面是如何在new_virtual_machine_name中引用tasks/main.yml变量

代码语言:javascript
复制
- name: Write vsphere source file
  template:
    src: ../templates/vsphere-source.j2
    dest: 'packer-{{template_name}}-{{ new_virtual_machine_name }}/vsphere-source-{{ template_name }}-{{ new_virtual_machine_name }}.pkr.hcl'

- name: Write the template update file
  template:
    src: ../templates/update-template.j2
    dest: 'packer-{{template_name}}-{{ new_virtual_machine_name }}/update-{{ template_name }}-{{ new_virtual_machine_name }}.pkr.hcl'

在每次引用作业开始时从查找中创建的变量时,我如何防止Ansible运行查找?谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-08-19 15:48:30

问:“每次引用变量时,如何防止Ansible运行查找?

答:使用绞合时间,每次调用过滤器时,您都会得到当前的日期。

代码语言:javascript
复制
    - set_fact:
        job_start_time: "{{ '%Y%m%d_%H%M%S'|strftime }}"
    - debug:
        msg: "pkrclone-{{ job_start_time }}"
    - wait_for:
        timeout: 3
    - debug:
        msg: "pkrclone-{{ job_start_time }}"
    - set_fact:
        job_start_time: "{{ '%Y%m%d_%H%M%S'|strftime }}"
    - debug:
        msg: "pkrclone-{{ job_start_time }}"

给出

代码语言:javascript
复制
  msg: pkrclone-20210819_174748
  msg: pkrclone-20210819_174748
  msg: pkrclone-20210819_174753
票数 2
EN

Stack Overflow用户

发布于 2021-08-19 15:29:41

是的,每次调用变量时都会对它们进行评估。解决这一问题的一种方法是使用set_facts来存储一个事实,这个事实只在被设置并存储为主机的静态值时才会被评估。

编辑:注意到,正如@的答案(并在评论中讨论过的)所指出的,使用pipe查找获取这样的信息并不是一个很好的实践,如果您在核心Ansible中使用了strftime过滤器。所以我在下面的例子中改变了它。

为了说明这一点,请看以下剧本:

代码语言:javascript
复制
---
- hosts: localhost
  gather_facts: false

  vars:
    _job_start_time: "{{ '%Y%m%d_%H%M%S'| strftime }}"

  tasks:
    - name: Force var into a fact that will be constant throughout play
      set_fact:
        job_start_time: "{{ _job_start_time }}"

    - name: Wait a bit making sure time goes on
      pause:
        seconds: 1

    - name: Show that fact is constant whereas inital var changes
      debug:
        msg: "var is: {{ _job_start_time }}, fact is: {{ job_start_time }}"

    - name: Wait a bit making sure time goes on
      pause:
        seconds: 1

    - name: Show that fact is constant whereas inital var changes
      debug:
        msg: "var is: {{ _job_start_time }}, fact is: {{ job_start_time }}"

给予:

代码语言:javascript
复制
PLAY [localhost] ***********************************************************************************************************************************************************************************************************************

TASK [Force var into a fact that will be constant throughout play] *********************************************************************************************************************************************************************
ok: [localhost]

TASK [Wait a bit making sure time goes on] *********************************************************************************************************************************************************************************************
Pausing for 1 seconds
(ctrl+C then 'C' = continue early, ctrl+C then 'A' = abort)
ok: [localhost]

TASK [Show that fact is constant whereas inital var changes] ***************************************************************************************************************************************************************************
ok: [localhost] => {
    "msg": "var is: 20210819_172528, fact is: 20210819_172527"
}

TASK [Wait a bit making sure time goes on] *********************************************************************************************************************************************************************************************
Pausing for 1 seconds
(ctrl+C then 'C' = continue early, ctrl+C then 'A' = abort)
ok: [localhost]

TASK [Show that fact is constant whereas inital var changes] ***************************************************************************************************************************************************************************
ok: [localhost] => {
    "msg": "var is: 20210819_172529, fact is: 20210819_172527"
}

PLAY RECAP *****************************************************************************************************************************************************************************************************************************
localhost                  : ok=5    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68850093

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档