使用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

利用环境变量中接收到的连接信息来连接测试目标节点。

bannerAds