如何在goss测试中访问hostvars和组变量

72次阅读
没有评论

问题描述

在使用molecule创建了3个docker实例,每个实例都有来自同一个角色的不同配置。这三个实例之间通过将各自的IP地址放入配置文件中进行通信。

用户需要测试每个实例的配置文件中是否设置了正确的IP地址。

用户想知道如何在goss中访问ansible组和主机变量。

解决方案

请注意以下操作注意版本差异及修改前做好备份。

方案1

由于goss可以使用来自yaml或json文件的变量,我们可以修改verify.yml示例playbook来导出这个变量,并在goss命令中使用它。

以下是修改后的verify.yml示例playbook的部分内容:

- name: Verify
  hosts: all
  become: true
  vars:
    [...]
    goss_vars: "{{ goss_test_directory }}/vars"
  tasks:
    [...]
    - name: Register hostvars
      copy:
        content: "{'hostvars': {{ hostvars }}}"
        dest: "{{ goss_vars }}"
    - name: Execute Goss tests
      command: "{{ goss_bin }} --vars {{ goss_vars }} -g {{ item }} validate --format {{ goss_format }}"
      register: test_results
      with_items: "{{ test_files.stdout_lines }}"
      failed_when: false
    [...]

在上面的示例中,我们添加了一个名为goss_vars的变量,用于存储goss测试文件中的变量。然后,我们使用copy模块将hostvars导出为一个文件,并将其保存到goss_vars变量指定的路径中。

最后,我们使用command模块执行goss测试命令,并将之前导出的变量文件作为参数传递给goss命令。在goss测试文件中,我们可以使用{{ .Vars.hostvars }}来访问这个变量。

方案2

如果方案1无法满足需求,你可以尝试使用其他方法来访问ansible组和主机变量。

另一种方法是在goss测试文件中直接使用ansible的hostvarsgroups变量。这些变量在goss测试文件中是可用的,可以直接使用。

以下是一个示例goss测试文件的内容:

package:
  nginx:
    installed: true

service:
  nginx:
    enabled: true
    running: true

http:
  http://{{ hostvars['webserver']['ansible_default_ipv4']['address'] }}:
    status_code: 200

在上面的示例中,我们使用了hostvars变量来访问webserver主机的ansible_default_ipv4变量,并将其作为HTTP请求的目标地址。

请注意,这种方法需要确保在运行goss测试时,ansible已经执行过,并且相关的主机和组变量已经设置。

总结

在goss测试中访问ansible组和主机变量有多种方法。你可以通过在playbook中导出变量并在goss命令中使用,或者直接在goss测试文件中使用ansible的hostvarsgroups变量来实现。

请根据你的具体需求选择适合的方法,并确保在运行goss测试之前,ansible已经执行过,并且相关的主机和组变量已经设置。

正文完