问题描述
在使用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的hostvars
和groups
变量。这些变量在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的hostvars
和groups
变量来实现。
请根据你的具体需求选择适合的方法,并确保在运行goss测试之前,ansible已经执行过,并且相关的主机和组变量已经设置。