Как запустить тест на идемпотентность для роли ansible через Test-Kitchen?

С Travis-CI это довольно просто:

  # Run the role/playbook again, checking to make sure it's idempotent.
  - >
    ansible-playbook -i tests/inventory tests/test.yml --connection=local --sudo --extra-vars "take_ownership_of_tmp=$OWN_TMP"
    | grep -q 'changed=0.*failed=0'
    && (echo 'Idempotence test: pass' && exit 0)
    || (echo 'Idempotence test: fail' && exit 1)

но я не могу использовать Трэвиса, потому что мне нужно проверить свою роль в системах Debian. Я использую Test-Kitchen с поставщиком ansible_playbook.

Например:

мой .kitchen.yml

---
driver:
  name: vagrant

provisioner:
  name: ansible_playbook
  hosts: test-kitchen
  ansible_verbosity: 2
  ansible_verbose: true
  require_ansible_repo: false
  require_chef_omnibus: false
  require_ansible_omnibus: true
  require_chef_for_busser: false
  ansible_omnibus_url: https://raw.githubusercontent.com/neillturner/omnibus-ansible/master/ansible_install.sh

platforms:
  - name: debian-6.0.10-64-nocm
    driver_config: 
      customize:
           memory: 1024
           cpus: 2
      box: puppetlabs/debian-6.0.10-64-nocm
      box_url: https://atlas.hashicorp.com/puppetlabs/boxes/debian-6.0.10-64-nocm/versions/1.0.2/providers/virtualbox.box


suites:
  - name: default

verifier:
  ruby_bindir: '/usr/bin'

тестовая книга (test/integration/default/default.yml) очень проста

---
- hosts: all
  roles:
    - preconf
  vars:
    #some vars here

Я могу добавить второй вызов роли preconf в default.yml, но это не помогает.

С одним звонком кухня возвращает мне ряд измененных позиций:

   PLAY RECAP ******************************************************************** 
   localhost                  : ok=12   changed=8    unreachable=0    failed=0  

Но с двумя вызовами он возвращает сумму элементов вместо двух отдельных результатов.

   PLAY RECAP ******************************************************************** 
   localhost                  : ok=24   changed=10   unreachable=0    failed=0 

Итак, как я могу запустить playbook во второй раз и проверить результаты теста на идемпотентность?


person strangeman    schedule 09.09.2015    source источник
comment
Пожалуйста, добавьте больше информации   -  person Valeriy Solovyov    schedule 09.09.2015
comment
@ValeriySolovyov добавил, но я думаю, что это абстрактный вопрос, который не привязан к конкретной конфигурации   -  person strangeman    schedule 10.09.2015


Ответы (2)


Решил для себя с тестом BATS:

#!/usr/bin/env bats
#

#
# Idempotence test
#

@test "Second run should change nothing" {
    run bash -c "ansible-playbook -i /tmp/kitchen/hosts /tmp/kitchen/default.yml -c local | grep -q 'changed=0.*failed=0' && exit 0 || exit 1"
    [ "$status" -eq 0 ]
}

Вариант спецификации сервера UPD:

describe command('ansible-playbook -i /tmp/kitchen/hosts /tmp/kitchen/default.yml -c local') do
  its(:stderr) { should match /changed=0.*failed=0/ }

  its(:exit_status) { should eq 0 }
end
person strangeman    schedule 10.09.2015

Как ansible_playbook, так и ansible_push теперь поддерживают параметр idempotency_test, который, по сути, запускает плейбук во второй раз и проверяет наличие failed или changed задач.

Вы можете просто добавить idempotency_test: true к .kitchen.yml вот так:

---
driver:
  name: vagrant

provisioner:
  name: ansible_playbook
  hosts: test-kitchen
  ansible_verbosity: 2
  ansible_verbose: true
  require_ansible_repo: false
  require_chef_omnibus: false
  require_ansible_omnibus: true
  require_chef_for_busser: false
  ansible_omnibus_url: https://raw.githubusercontent.com/neillturner/omnibus-ansible/master/ansible_install.sh
  idempotency_test: true

platforms:
  - name: debian-6.0.10-64-nocm
    driver_config: 
      customize:
           memory: 1024
           cpus: 2
      box: puppetlabs/debian-6.0.10-64-nocm
      box_url: https://atlas.hashicorp.com/puppetlabs/boxes/debian-6.0.10-64-nocm/versions/1.0.2/providers/virtualbox.box


suites:
  - name: default

verifier:
  ruby_bindir: '/usr/bin'
person StockB    schedule 06.04.2018