【问题标题】:Ansible. Updating the hostvars variable安西布尔。更新 hostvars 变量
【发布时间】:2021-07-18 02:39:32
【问题描述】:

如果在 playbook 执行过程中,我们改变了 host_vars 中的主机文件(即添加一个新变量),那么我们如何在 hostvars 中获取这个变量在当前执行的剧本中?当您再次运行它时,它会出现在 hostvars 中。

更新 01:

这是一个例子,它不起作用(

Debug 3 任务应该显示 test_1 而不是 VARIABLE IS NOT DEFINED!

- name: Test
  hosts: mon

  tasks:
  - name: Debug 1
    debug:
      var: hostvars.mon.test_1

  - name: Add vars for host_vars
    delegate_to: 127.0.0.1
    blockinfile:
      path: "{{ inventory_dir }}/host_vars/{{ inventory_hostname }}.yml"
      marker: "# {mark}: {{ item.key }}"
      block: |
        {{ item.key }}: {{ item.value }}
    with_dict:
    - {test_1: "test_1"}

  - name: Debug 2
    debug:
      var: hostvars.mon.test_1

  - name: Clear facts
    meta: clear_facts

  - name: Refresh inventory
    meta: refresh_inventory

  - name: Setup
    setup:

  - name: Debug 3
    debug:
      var: hostvars.mon.test_1

结果:

PLAY [Test] ********************************************************************

TASK [Gathering Facts] *********************************************************
ok: [mon]

TASK [Debug 1] *****************************************************************
ok: [mon] => {
    "hostvars.mon.test_1": "VARIABLE IS NOT DEFINED!"
}

TASK [Add vars for host_vars] **************************************************
changed: [mon -> 127.0.0.1] => (item={'key': 'test_1', 'value': 'test_1'})

TASK [Debug 2] *****************************************************************
ok: [mon] => {
    "hostvars.mon.test_1": "VARIABLE IS NOT DEFINED!"
}

TASK [Setup] *******************************************************************
ok: [mon]

TASK [Debug 3] *****************************************************************
ok: [mon] => {
    "hostvars.mon.test_1": "VARIABLE IS NOT DEFINED!"
}

PLAY RECAP *********************************************************************
mon                        : ok=6    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0  

重启时:

PLAY [Test] ********************************************************************

TASK [Gathering Facts] *********************************************************
ok: [mon]

TASK [Debug 1] *****************************************************************
ok: [mon] => {
    "hostvars.mon.test_1": "test_1"
}

TASK [Add vars for host_vars] **************************************************
ok: [mon -> 127.0.0.1] => (item={'key': 'test_1', 'value': 'test_1'})

TASK [Debug 2] *****************************************************************
ok: [mon] => {
    "hostvars.mon.test_1": "test_1"
}

TASK [Setup] *******************************************************************
ok: [mon]

TASK [Debug 3] *****************************************************************
ok: [mon] => {
    "hostvars.mon.test_1": "test_1"
}

PLAY RECAP *********************************************************************
mon                        : ok=6    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

也许有办法在此过程中手动更改 hostvars

【问题讨论】:

  • 坦率地说,这听起来是个坏主意。你为什么要这么做?
  • @Jack,例如,安装了 grafana-loki 并将其端口(3100)写入 host_vars/host.yml,然后可以由另一个剧本或角色读取以了解此端口grafana-loki.
  • 那个端口是 grafana-loki 安装随机选择的?
  • @Jack,loki 只是一个例子,请看一下 UPDATE 01
  • meta: refresh_inventory 重新执行动态清单脚本。没有理由重新加载静态清单,因为在执行期间更改这些文件是一个坏主意。

标签: ansible


【解决方案1】:

您可以要求 Ansible 重新读取清单(包括 host_vars)。一般来说,我会说即时更改库存是一种代码味道,但很少有有效的案例。

- name: Refreshing inventory, SO copypaste
  meta: refresh_inventory

【讨论】:

  • 请参阅 UPDATE 01
  • 我想不出一个有效的案例。静态清单文件应受版本控制。
  • 当分子场景测试“应用程序和工作人员”时,我们有一个有效的案例。我们需要安装应用程序才能生成临时工人库存。这在应用安装后通过“刷新”完成。这是罕见的边缘情况。一般来说,我会说,任何“刷新库存”都像 Rust 中的“不安全”。注意那些地方。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-06-14
  • 2011-08-03
  • 2015-02-16
  • 2018-03-23
  • 2020-11-29
  • 1970-01-01
相关资源
最近更新 更多