Ansible - 名称中包含 host_vars 和字符串的动态变量

标签 ansible dynamic-variables

我正在尝试在 Ansible 中创建一个工作角色来运行包的 yum 安装/更新,这将由第 3 方系统作为 .yml 文件提供给具有以下约定的角色的 vars 目录:server01.yml , server02.yml, serverX.yml,变量格式为 packageList_serverNumber: 'list of packages'。 该变量将使用任务读取:

 - name: server update packages from host_vars
yum:
  name: "{{ install_pkgs }}"
  state: latest

这应该指向特定主机的 host_vars 文件:

install_pkgs: "{{ packageList_server01 }}"

由于此任务只应在定义变量时运行,因此我尝试将 when 子句与指向 packageList_serverNumber 的变量一起使用。当我对其进行硬编码时,如下图所示:

when: packageList_server01 is defined

请问如何让它动态化? 我正在尝试:

when: packageList_{{hostvars[inventory_hostname]}} is defined

但不幸的是,这不起作用。

最佳答案

使用lookup 插件vars。运行以下命令以查看详细信息

shell> ansible-doc -t lookup vars

给定变量文件

shell> cat roles/test4/vars/server01.yml 
packageList_server01: [pkg1, pkg2, pkg3]

shell> cat roles/test4/vars/server02.yml 
packageList_server02: [pkg4, pkg5, pkg6]

shell> cat roles/test4/vars/server03.yml 
packageList_server03: [pkg7, pkg8, pkg9]

读取变量,声明变量install_pkgs,并使用它

shell> cat roles/test4/tasks/main.yml
- include_vars: "vars/{{ inventory_hostname }}.yml"
- set_fact:
    install_pkgs: "{{ lookup('vars', 'packageList_' ~ inventory_hostname) }}"
- debug:
    msg: "Install {{ install_pkgs }}"

例如剧本

- hosts: server01,server02,server03
  gather_facts: false
  roles:
    - test4

给出(删节)

TASK [test4 : debug] ****
ok: [server01] => 
  msg: Install ['pkg1', 'pkg2', 'pkg3']
ok: [server03] => 
  msg: Install ['pkg7', 'pkg8', 'pkg9']
ok: [server02] => 
  msg: Install ['pkg4', 'pkg5', 'pkg6']

关于Ansible - 名称中包含 host_vars 和字符串的动态变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64646591/

相关文章:

Ansible:循环中设置每个项目的标签

Ansible 列出目录文件(ansible 2.9.10)

amazon-ec2 - Ansible:如何停止由不同剧本启动的 EC2 实例

python - 索引错误: list index out of range on python dynamic variable length

ansible - 获取任务文件的目录以获取相对路径

ansible - 告诉 Ansible 迭代(网络摄像头)配置 json 文件并通过新的 api 调用更新每个值

JavaScript 全局动态变量从函数到函数未定义,似乎是局部范围

c++ - C++中动态数组的长度信息是关联指针还是首元素地址?

ruby-on-rails - 如何在 Ruby 变量名中使用字符串?