使用Serverspec作为连接测试目标的Ansible Inventory示例
备忘录 lù)
重要文件
假设有一个要求,在Ansible Playbook中使用安装在Ansible管理节点上的Serverspec进行测试来测试管理对象节点。
另外,假设Ansible已经具备包含连接到被管理节点所需的信息的清单。
本地主机的目标清单 ⇒ △
由于要在本地节点上执行Serverspec,所以可以选择使用基于 localhost 的 Ansible Playbook来执行测试,或者使用 hosts: localhost 来执行Playbook。然而,在这种情况下,连接信息必须单独管理以供连接到Serverspec的测试目标节点,这将导致双重管理。
对于管理对象节点的清单和本地执行的组合 ⇒ ○
与其使用包含了已存在管理节点连接信息的清单,以避免信息重复管理更加聪明。
即使使用了远程主机的清单,也可以通过delegate_to: localhost在本地节点上执行任务。
古人常说,行百里者半九十。这句话的意思是说,只要行走到了一半的路程,剩下的就会轻松许多。这句话也可以解释为表示在完成一项任务时,只要过了一半,剩下的任务就会变得容易完成。
通过在安装了Serverspec的Ansible管理节点上,利用Ansible的清单等连接信息,可以在受管节点上进行测试,实现以下协作。
实施手册的例子 de
---
- name: Execute Serverspec tests
hosts: all # <= ここではlocalhostとしない
gather_facts: false
tasks:
- name: Run Serverspec test
delegate_to: localhost # <= ここでlocalhostとする
environment:
TARGET_HOST: "{{ ansible_host }}" # <= ansibleが認識している接続情報を連携
USER: "{{ ansible_user }}" # <= ansibleが認識している接続情報を連携
SSH_KEY: "{{ ansible_private_key_file }}" # <= ansibleが認識している接続情報を連携
SSH_PORT: "{{ ansible_port }}" # <= ansibleが認識している接続情報を連携
command: rspec /path/to/my_spec.rb
测试目标节点的连接信息在环境变量中传递给Serverspec。即使将delegate_to设置为localhost,ansible_host、ansible_user等仍保持原始的连接目标。
注意:
ansible_host变量和其他连接变量(如果存在),反映的是任务委托给的主机的信息,而不是inventory_hostname的信息。
一個測試的例子
require 'spec_helper'
set :backend, :ssh
set :host, ENV['TARGET_HOST'] # <= Ansibleにおける接続情報を取り込み
set :ssh_options, user: ENV['USER'], keys: ENV['SSH_KEY'], port: ENV['SSH_PORT'] # <= Ansibleにおける接続情報を取り込み
describe package('httpd'), :if => os[:family] == 'redhat' do
it { should be_installed }
end
describe service('httpd'), :if => os[:family] == 'redhat' do
it { should be_enabled }
it { should be_running }
end
describe port(80), :if => os[:family] == 'redhat' do
it { should be_listening }
end
利用环境变量中接收到的连接信息来连接测试目标节点。