ci: migrate to woodpecker
ci/woodpecker/push/lint Pipeline was successful Details
ci/woodpecker/push/test Pipeline was successful Details
ci/woodpecker/push/notify Pipeline was successful Details
ci/woodpecker/push/docs Pipeline was successful Details

This commit is contained in:
Robert Kaussow 2024-02-18 13:53:53 +01:00
parent 7a53ca1044
commit c9d89cf541
Signed by: xoxys
GPG Key ID: 4E692A2EAECC03C0
33 changed files with 212 additions and 1560 deletions

View File

@ -1,161 +0,0 @@
local PipelineLinting = {
kind: 'pipeline',
name: 'linting',
platform: {
os: 'linux',
arch: 'amd64',
},
steps: [
{
name: 'ansible-later',
image: 'thegeeklab/ansible-later',
commands: [
'ansible-later',
],
},
{
name: 'python-format',
image: 'python:3.11',
environment: {
PY_COLORS: 1,
},
commands: [
'pip install -qq yapf',
'[ -z "$(find . -type f -name *.py)" ] || (yapf -rd ./)',
],
},
{
name: 'python-flake8',
image: 'python:3.11',
environment: {
PY_COLORS: 1,
},
commands: [
'pip install -qq flake8',
'flake8',
],
},
],
trigger: {
ref: ['refs/heads/main', 'refs/tags/**', 'refs/pull/**'],
},
};
local PipelineDeployment(scenario='centos7') = {
kind: 'pipeline',
name: 'testing-' + scenario,
platform: {
os: 'linux',
arch: 'amd64',
},
concurrency: {
limit: 1,
},
workspace: {
base: '/drone/src',
path: '${DRONE_REPO_NAME}',
},
steps: [
{
name: 'ansible-molecule',
image: 'thegeeklab/molecule:4',
environment: {
HCLOUD_TOKEN: { from_secret: 'hcloud_token' },
},
commands: [
'molecule test -s ' + scenario,
],
},
],
depends_on: [
'linting',
],
trigger: {
ref: ['refs/heads/main', 'refs/tags/**', 'refs/pull/**'],
},
};
local PipelineDocumentation = {
kind: 'pipeline',
name: 'documentation',
platform: {
os: 'linux',
arch: 'amd64',
},
steps: [
{
name: 'generate',
image: 'thegeeklab/ansible-doctor',
environment: {
ANSIBLE_DOCTOR_LOG_LEVEL: 'INFO',
ANSIBLE_DOCTOR_FORCE_OVERWRITE: true,
ANSIBLE_DOCTOR_EXCLUDE_FILES: 'molecule/',
ANSIBLE_DOCTOR_TEMPLATE: 'hugo-book',
ANSIBLE_DOCTOR_ROLE_NAME: '${DRONE_REPO_NAME#*.}',
ANSIBLE_DOCTOR_OUTPUT_DIR: '_docs/',
},
},
{
name: 'publish',
image: 'plugins/gh-pages',
settings: {
remote_url: 'https://gitea.rknet.org/ansible/${DRONE_REPO_NAME}',
netrc_machine: 'gitea.rknet.org',
username: { from_secret: 'gitea_username' },
password: { from_secret: 'gitea_token' },
pages_directory: '_docs/',
target_branch: 'docs',
},
when: {
ref: ['refs/heads/main'],
},
},
],
trigger: {
ref: ['refs/heads/main', 'refs/tags/**', 'refs/pull/**'],
},
depends_on: [
'testing-centos7',
'testing-rocky8',
],
};
local PipelineNotification = {
kind: 'pipeline',
name: 'notification',
platform: {
os: 'linux',
arch: 'amd64',
},
clone: {
disable: true,
},
steps: [
{
name: 'matrix',
image: 'thegeeklab/drone-matrix',
settings: {
homeserver: { from_secret: 'matrix_homeserver' },
roomid: { from_secret: 'matrix_roomid' },
template: 'Status: **{{ .Build.Status }}**<br/> Build: [{{ .Repo.Owner }}/{{ .Repo.Name }}]({{ .Build.Link }}){{ if .Build.Branch }} ({{ .Build.Branch }}){{ end }} by {{ .Commit.Author }}<br/> Message: {{ .Commit.Message.Title }}',
username: { from_secret: 'matrix_username' },
password: { from_secret: 'matrix_password' },
},
},
],
depends_on: [
'documentation',
],
trigger: {
status: ['success', 'failure'],
ref: ['refs/heads/main', 'refs/tags/**'],
},
};
[
PipelineLinting,
PipelineDeployment(scenario='centos7'),
PipelineDeployment(scenario='rocky8'),
PipelineDocumentation,
PipelineNotification,
]

View File

@ -1,187 +0,0 @@
---
kind: pipeline
name: linting
platform:
os: linux
arch: amd64
steps:
- name: ansible-later
image: thegeeklab/ansible-later
commands:
- ansible-later
- name: python-format
image: python:3.11
commands:
- pip install -qq yapf
- "[ -z \"$(find . -type f -name *.py)\" ] || (yapf -rd ./)"
environment:
PY_COLORS: 1
- name: python-flake8
image: python:3.11
commands:
- pip install -qq flake8
- flake8
environment:
PY_COLORS: 1
trigger:
ref:
- refs/heads/main
- refs/tags/**
- refs/pull/**
---
kind: pipeline
name: testing-centos7
platform:
os: linux
arch: amd64
concurrency:
limit: 1
workspace:
base: /drone/src
path: ${DRONE_REPO_NAME}
steps:
- name: ansible-molecule
image: thegeeklab/molecule:4
commands:
- molecule test -s centos7
environment:
HCLOUD_TOKEN:
from_secret: hcloud_token
trigger:
ref:
- refs/heads/main
- refs/tags/**
- refs/pull/**
depends_on:
- linting
---
kind: pipeline
name: testing-rocky8
platform:
os: linux
arch: amd64
concurrency:
limit: 1
workspace:
base: /drone/src
path: ${DRONE_REPO_NAME}
steps:
- name: ansible-molecule
image: thegeeklab/molecule:4
commands:
- molecule test -s rocky8
environment:
HCLOUD_TOKEN:
from_secret: hcloud_token
trigger:
ref:
- refs/heads/main
- refs/tags/**
- refs/pull/**
depends_on:
- linting
---
kind: pipeline
name: documentation
platform:
os: linux
arch: amd64
steps:
- name: generate
image: thegeeklab/ansible-doctor
environment:
ANSIBLE_DOCTOR_EXCLUDE_FILES: molecule/
ANSIBLE_DOCTOR_FORCE_OVERWRITE: true
ANSIBLE_DOCTOR_LOG_LEVEL: INFO
ANSIBLE_DOCTOR_OUTPUT_DIR: _docs/
ANSIBLE_DOCTOR_ROLE_NAME: ${DRONE_REPO_NAME#*.}
ANSIBLE_DOCTOR_TEMPLATE: hugo-book
- name: publish
image: plugins/gh-pages
settings:
netrc_machine: gitea.rknet.org
pages_directory: _docs/
password:
from_secret: gitea_token
remote_url: https://gitea.rknet.org/ansible/${DRONE_REPO_NAME}
target_branch: docs
username:
from_secret: gitea_username
when:
ref:
- refs/heads/main
trigger:
ref:
- refs/heads/main
- refs/tags/**
- refs/pull/**
depends_on:
- testing-centos7
- testing-rocky8
---
kind: pipeline
name: notification
platform:
os: linux
arch: amd64
clone:
disable: true
steps:
- name: matrix
image: thegeeklab/drone-matrix
settings:
homeserver:
from_secret: matrix_homeserver
password:
from_secret: matrix_password
roomid:
from_secret: matrix_roomid
template: "Status: **{{ .Build.Status }}**<br/> Build: [{{ .Repo.Owner }}/{{ .Repo.Name }}]({{ .Build.Link }}){{ if .Build.Branch }} ({{ .Build.Branch }}){{ end }} by {{ .Commit.Author }}<br/> Message: {{ .Commit.Message.Title }}"
username:
from_secret: matrix_username
trigger:
ref:
- refs/heads/main
- refs/tags/**
status:
- success
- failure
depends_on:
- documentation
---
kind: signature
hmac: 32eeea3ed510da5eac9b739b1cf3b09c99cf7222cb1a51a621359c2676da0532
...

2
.gitignore vendored
View File

@ -9,5 +9,3 @@ __pycache__/
*.py[cod]
*$py.class
# ---> Docs
/_docs

View File

@ -10,10 +10,6 @@ ansible:
rules:
exclude_files:
- molecule/
- "LICENSE*"
- "**/*.md"
- "**/*.ini"
exclude_filter:
- LINT0009

7
.markdownlint.yml Normal file
View File

@ -0,0 +1,7 @@
---
default: True
MD013: False
MD041: False
MD024: False
MD004:
style: dash

1
.prettierignore Normal file
View File

@ -0,0 +1 @@
LICENSE

47
.woodpecker/docs.yaml Normal file
View File

@ -0,0 +1,47 @@
---
when:
- event: [pull_request]
- event: [push, manual]
branch:
- ${CI_REPO_DEFAULT_BRANCH}
steps:
- name: generate
image: quay.io/thegeeklab/ansible-doctor
environment:
ANSIBLE_DOCTOR_EXCLUDE_FILES: molecule/
ANSIBLE_DOCTOR_FORCE_OVERWRITE: "true"
ANSIBLE_DOCTOR_LOG_LEVEL: INFO
ANSIBLE_DOCTOR_ROLE_NAME: ${CI_REPO_NAME}
ANSIBLE_DOCTOR_TEMPLATE: readme
- name: format
image: quay.io/thegeeklab/alpine-tools
commands:
- prettier -w README.md
- name: diff
image: quay.io/thegeeklab/alpine-tools
commands:
- git diff --color=always README.md
- name: publish
image: quay.io/thegeeklab/wp-git-action
settings:
action:
- commit
- push
author_email: ci-bot@rknet.org
author_name: ci-bot
branch: main
message: "[skip ci] automated docs update"
netrc_machine: gitea.rknet.org
netrc_password:
from_secret: gitea_token
when:
- event: [push, manual]
branch:
- ${CI_REPO_DEFAULT_BRANCH}
depends_on:
- test

30
.woodpecker/lint.yaml Normal file
View File

@ -0,0 +1,30 @@
---
when:
- event: [pull_request, tag]
- event: [push, manual]
branch:
- ${CI_REPO_DEFAULT_BRANCH}
steps:
- name: ansible-later
image: quay.io/thegeeklab/ansible-later:4
commands:
- ansible-later
environment:
FORCE_COLOR: "1"
- name: python-format
image: docker.io/python:3.12
commands:
- pip install -qq ruff
- ruff format --check --diff .
environment:
PY_COLORS: "1"
- name: python-lint
image: docker.io/python:3.12
commands:
- pip install -qq ruff
- ruff .
environment:
PY_COLORS: "1"

26
.woodpecker/notify.yml Normal file
View File

@ -0,0 +1,26 @@
---
when:
- event: [tag]
- event: [push, manual]
branch:
- ${CI_REPO_DEFAULT_BRANCH}
runs_on: [success, failure]
steps:
- name: matrix
image: quay.io/thegeeklab/wp-matrix
settings:
homeserver:
from_secret: matrix_homeserver
password:
from_secret: matrix_password
roomid:
from_secret: matrix_roomid
username:
from_secret: matrix_username
when:
- status: [success, failure]
depends_on:
- docs

25
.woodpecker/test.yaml Normal file
View File

@ -0,0 +1,25 @@
---
when:
- event: [pull_request, tag]
- event: [push, manual]
branch:
- ${CI_REPO_DEFAULT_BRANCH}
variables:
- &molecule_base
image: quay.io/thegeeklab/molecule:6
group: molecule
secrets:
- source: molecule_hcloud_token
target: HCLOUD_TOKEN
environment:
PY_COLORS: "1"
steps:
- name: molecule-default
<<: *molecule_base
commands:
- molecule test -s default
depends_on:
- lint

View File

@ -1,12 +1 @@
# xoxys.pam
[![Build Status](https://img.shields.io/drone/build/ansible/xoxys.pam?logo=drone&server=https%3A%2F%2Fdrone.rknet.org)](https://drone.rknet.org/ansible/xoxys.pam)
[![License: MIT](https://img.shields.io/badge/license-MIT-blue.svg)](LICENSE)
Configure pam stack.
You can find the full documentation at [https://galaxy.geekdocs.de](https://galaxy.geekdocs.de/roles/system/pam/).
## License
This project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details.

View File

@ -1,4 +1,3 @@
# Standards: 0.2
---
galaxy_info:
# @meta author:value: [Robert Kaussow](https://gitea.rknet.org/xoxys)
@ -6,19 +5,18 @@ galaxy_info:
namespace: xoxys
role_name: pam
# @meta description: >
# [![Source Code](https://img.shields.io/badge/gitea-source%20code-blue?logo=gitea&logoColor=white)](https://gitea.rknet.org/ansible/xoxys.pam)
# [![Build Status](https://img.shields.io/drone/build/ansible/xoxys.pam?logo=drone&server=https%3A%2F%2Fdrone.rknet.org)](https://drone.rknet.org/ansible/xoxys.pam)
# [![License: MIT](https://img.shields.io/badge/license-MIT-blue.svg)](https://gitea.rknet.org/ansible/xoxys.pam/src/branch/main/LICENSE)
# [![Build Status](https://ci.rknet.org/api/badges/ansible/xoxys.pam/status.svg)](https://ci.rknet.org/repos/ansible/xoxys.pam)
# [![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg?label=license)](https://gitea.rknet.org/ansible/xoxys.pam/src/branch/main/LICENSE)
#
# Configure pam stack.
# @end
description: Configure pam stack
license: MIT
min_ansible_version: 2.10
min_ansible_version: "2.10"
platforms:
- name: EL
versions:
- 7
- "9"
galaxy_tags:
- pam
dependencies: []

View File

@ -1,120 +0,0 @@
---
- name: Create
hosts: localhost
connection: local
gather_facts: false
no_log: "{{ molecule_no_log }}"
vars:
ssh_port: 22
ssh_user: root
ssh_path: "{{ lookup('env', 'MOLECULE_EPHEMERAL_DIRECTORY') }}/ssh_key"
tasks:
- name: Create SSH key
user:
name: "{{ lookup('env', 'USER') }}"
generate_ssh_key: true
ssh_key_file: "{{ ssh_path }}"
force: true
register: generated_ssh_key
- name: Register the SSH key name
set_fact:
ssh_key_name: "molecule-generated-{{ 12345 | random | to_uuid }}"
- name: Register SSH key for test instance(s)
hcloud_ssh_key:
name: "{{ ssh_key_name }}"
public_key: "{{ generated_ssh_key.ssh_public_key }}"
state: present
- name: Create molecule instance(s)
hcloud_server:
name: "{{ item.name }}"
server_type: "{{ item.server_type }}"
ssh_keys:
- "{{ ssh_key_name }}"
image: "{{ item.image }}"
location: "{{ item.location | default(omit) }}"
datacenter: "{{ item.datacenter | default(omit) }}"
user_data: "{{ item.user_data | default(omit) }}"
api_token: "{{ lookup('env', 'HCLOUD_TOKEN') }}"
state: present
register: server
loop: "{{ molecule_yml.platforms }}"
async: 7200
poll: 0
- name: Wait for instance(s) creation to complete
async_status:
jid: "{{ item.ansible_job_id }}"
register: hetzner_jobs
until: hetzner_jobs.finished
retries: 300
loop: "{{ server.results }}"
- name: Create volume(s)
hcloud_volume:
name: "{{ item.name }}"
server: "{{ item.name }}"
location: "{{ item.location | default(omit) }}"
size: "{{ item.volume_size | default(10) }}"
api_token: "{{ lookup('env', 'HCLOUD_TOKEN') }}"
state: "present"
loop: "{{ molecule_yml.platforms }}"
when: item.volume | default(False) | bool
register: volumes
async: 7200
poll: 0
- name: Wait for volume(s) creation to complete
async_status:
jid: "{{ item.ansible_job_id }}"
register: hetzner_volumes
until: hetzner_volumes.finished
retries: 300
when: volumes.changed
loop: "{{ volumes.results }}"
# Mandatory configuration for Molecule to function.
- name: Populate instance config dict
set_fact:
instance_conf_dict:
{
"instance": "{{ item.hcloud_server.name }}",
"ssh_key_name": "{{ ssh_key_name }}",
"address": "{{ item.hcloud_server.ipv4_address }}",
"user": "{{ ssh_user }}",
"port": "{{ ssh_port }}",
"identity_file": "{{ ssh_path }}",
"volume": "{{ item.item.item.volume | default(False) | bool }}",
}
loop: "{{ hetzner_jobs.results }}"
register: instance_config_dict
when: server.changed | bool
- name: Convert instance config dict to a list
set_fact:
instance_conf: "{{ instance_config_dict.results | map(attribute='ansible_facts.instance_conf_dict') | list }}"
when: server.changed | bool
- name: Dump instance config
copy:
content: |
# Molecule managed
{{ instance_conf | to_nice_yaml(indent=2) }}
dest: "{{ molecule_instance_config }}"
when: server.changed | bool
- name: Wait for SSH
wait_for:
port: "{{ ssh_port }}"
host: "{{ item.address }}"
search_regex: SSH
delay: 10
loop: "{{ lookup('file', molecule_instance_config) | from_yaml }}"
- name: Wait for VM to settle down
pause:
seconds: 30

View File

@ -1,78 +0,0 @@
---
- name: Destroy
hosts: localhost
connection: local
gather_facts: false
no_log: "{{ molecule_no_log }}"
tasks:
- name: Check existing instance config file
stat:
path: "{{ molecule_instance_config }}"
register: cfg
- name: Populate the instance config
set_fact:
instance_conf: "{{ (lookup('file', molecule_instance_config) | from_yaml) if cfg.stat.exists else [] }}"
- name: Destroy molecule instance(s)
hcloud_server:
name: "{{ item.instance }}"
api_token: "{{ lookup('env', 'HCLOUD_TOKEN') }}"
state: absent
register: server
loop: "{{ instance_conf }}"
async: 7200
poll: 0
- name: Wait for instance(s) deletion to complete
async_status:
jid: "{{ item.ansible_job_id }}"
register: hetzner_jobs
until: hetzner_jobs.finished
retries: 300
loop: "{{ server.results }}"
- pause:
seconds: 5
- name: Destroy volume(s)
hcloud_volume:
name: "{{ item.instance }}"
server: "{{ item.instance }}"
api_token: "{{ lookup('env', 'HCLOUD_TOKEN') }}"
state: "absent"
register: volumes
loop: "{{ instance_conf }}"
when: item.volume | default(False) | bool
async: 7200
poll: 0
- name: Wait for volume(s) deletion to complete
async_status:
jid: "{{ item.ansible_job_id }}"
register: hetzner_volumes
until: hetzner_volumes.finished
retries: 300
when: volumes.changed
loop: "{{ volumes.results }}"
- name: Remove registered SSH key
hcloud_ssh_key:
name: "{{ instance_conf[0].ssh_key_name }}"
state: absent
when: (instance_conf | default([])) | length > 0
# Mandatory configuration for Molecule to function.
- name: Populate instance config
set_fact:
instance_conf: {}
- name: Dump instance config
copy:
content: |
# Molecule managed
{{ instance_conf | to_nice_yaml(indent=2) }}
dest: "{{ molecule_instance_config }}"
when: server.changed | bool

View File

@ -1,24 +0,0 @@
---
dependency:
name: galaxy
options:
role-file: molecule/requirements.yml
requirements-file: molecule/requirements.yml
env:
ANSIBLE_GALAXY_DISPLAY_PROGRESS: "false"
driver:
name: delegated
platforms:
- name: centos7-pam
image: centos-7
server_type: cx11
lint: |
/usr/local/bin/flake8
provisioner:
name: ansible
env:
ANSIBLE_FILTER_PLUGINS: ${ANSIBLE_FILTER_PLUGINS:-./plugins/filter}
ANSIBLE_LIBRARY: ${ANSIBLE_LIBRARY:-./library}
log: False
verifier:
name: testinfra

View File

@ -1,15 +0,0 @@
---
- name: Prepare
hosts: all
gather_facts: false
tasks:
- name: Bootstrap python for Ansible
raw: |
command -v python3 python || (
(test -e /usr/bin/dnf && sudo dnf install -y python3) ||
(test -e /usr/bin/apt && (apt -y update && apt install -y python-minimal)) ||
(test -e /usr/bin/yum && sudo yum -y -qq install python3) ||
echo "Warning: Python not boostrapped due to unknown platform."
)
become: true
changed_when: false

View File

@ -1,16 +0,0 @@
import os
import testinfra.utils.ansible_runner
testinfra_hosts = testinfra.utils.ansible_runner.AnsibleRunner(
os.environ["MOLECULE_INVENTORY_FILE"]
).get_hosts("all")
def test_pam_config(host):
auth = host.file("/etc/pam.d/system-auth")
assert auth.contains("auth sufficient pam_unix.so nullok try_first_pass")
assert auth.contains(
"password sufficient pam_unix.so sha512 shadow nullok try_first_pass use_authtok"
)

View File

@ -1 +0,0 @@
rocky8

View File

@ -0,0 +1,17 @@
---
driver:
name: molecule_hetznercloud
dependency:
name: galaxy
options:
role-file: molecule/requirements.yml
requirements-file: molecule/requirements.yml
platforms:
- name: "rocky9-pam"
server_type: "cx11"
image: "rocky-9"
provisioner:
name: ansible
log: False
verifier:
name: testinfra

View File

@ -0,0 +1,11 @@
---
- name: Prepare
hosts: all
gather_facts: False
tasks:
- name: Bootstrap Python for Ansible
ansible.builtin.raw: |
command -v python3 python ||
((test -e /usr/bin/apt && (apt -y update && apt install -y python-minimal)) ||
echo "Warning: Python not boostrapped due to unknown platform.")
changed_when: False

View File

@ -1,3 +0,0 @@
[pytest]
filterwarnings =
ignore::DeprecationWarning

View File

@ -1,6 +1,3 @@
---
collections:
- name: https://gitea.rknet.org/ansible/xoxys.general/releases/download/v2.1.1/xoxys-general-2.1.1.tar.gz
- name: community.general
collections: []
roles: []

View File

@ -1,5 +0,0 @@
---
- name: Converge
hosts: all
roles:
- role: xoxys.pam

View File

@ -1,120 +0,0 @@
---
- name: Create
hosts: localhost
connection: local
gather_facts: false
no_log: "{{ molecule_no_log }}"
vars:
ssh_port: 22
ssh_user: root
ssh_path: "{{ lookup('env', 'MOLECULE_EPHEMERAL_DIRECTORY') }}/ssh_key"
tasks:
- name: Create SSH key
user:
name: "{{ lookup('env', 'USER') }}"
generate_ssh_key: true
ssh_key_file: "{{ ssh_path }}"
force: true
register: generated_ssh_key
- name: Register the SSH key name
set_fact:
ssh_key_name: "molecule-generated-{{ 12345 | random | to_uuid }}"
- name: Register SSH key for test instance(s)
hcloud_ssh_key:
name: "{{ ssh_key_name }}"
public_key: "{{ generated_ssh_key.ssh_public_key }}"
state: present
- name: Create molecule instance(s)
hcloud_server:
name: "{{ item.name }}"
server_type: "{{ item.server_type }}"
ssh_keys:
- "{{ ssh_key_name }}"
image: "{{ item.image }}"
location: "{{ item.location | default(omit) }}"
datacenter: "{{ item.datacenter | default(omit) }}"
user_data: "{{ item.user_data | default(omit) }}"
api_token: "{{ lookup('env', 'HCLOUD_TOKEN') }}"
state: present
register: server
loop: "{{ molecule_yml.platforms }}"
async: 7200
poll: 0
- name: Wait for instance(s) creation to complete
async_status:
jid: "{{ item.ansible_job_id }}"
register: hetzner_jobs
until: hetzner_jobs.finished
retries: 300
loop: "{{ server.results }}"
- name: Create volume(s)
hcloud_volume:
name: "{{ item.name }}"
server: "{{ item.name }}"
location: "{{ item.location | default(omit) }}"
size: "{{ item.volume_size | default(10) }}"
api_token: "{{ lookup('env', 'HCLOUD_TOKEN') }}"
state: "present"
loop: "{{ molecule_yml.platforms }}"
when: item.volume | default(False) | bool
register: volumes
async: 7200
poll: 0
- name: Wait for volume(s) creation to complete
async_status:
jid: "{{ item.ansible_job_id }}"
register: hetzner_volumes
until: hetzner_volumes.finished
retries: 300
when: volumes.changed
loop: "{{ volumes.results }}"
# Mandatory configuration for Molecule to function.
- name: Populate instance config dict
set_fact:
instance_conf_dict:
{
"instance": "{{ item.hcloud_server.name }}",
"ssh_key_name": "{{ ssh_key_name }}",
"address": "{{ item.hcloud_server.ipv4_address }}",
"user": "{{ ssh_user }}",
"port": "{{ ssh_port }}",
"identity_file": "{{ ssh_path }}",
"volume": "{{ item.item.item.volume | default(False) | bool }}",
}
loop: "{{ hetzner_jobs.results }}"
register: instance_config_dict
when: server.changed | bool
- name: Convert instance config dict to a list
set_fact:
instance_conf: "{{ instance_config_dict.results | map(attribute='ansible_facts.instance_conf_dict') | list }}"
when: server.changed | bool
- name: Dump instance config
copy:
content: |
# Molecule managed
{{ instance_conf | to_nice_yaml(indent=2) }}
dest: "{{ molecule_instance_config }}"
when: server.changed | bool
- name: Wait for SSH
wait_for:
port: "{{ ssh_port }}"
host: "{{ item.address }}"
search_regex: SSH
delay: 10
loop: "{{ lookup('file', molecule_instance_config) | from_yaml }}"
- name: Wait for VM to settle down
pause:
seconds: 30

View File

@ -1,78 +0,0 @@
---
- name: Destroy
hosts: localhost
connection: local
gather_facts: false
no_log: "{{ molecule_no_log }}"
tasks:
- name: Check existing instance config file
stat:
path: "{{ molecule_instance_config }}"
register: cfg
- name: Populate the instance config
set_fact:
instance_conf: "{{ (lookup('file', molecule_instance_config) | from_yaml) if cfg.stat.exists else [] }}"
- name: Destroy molecule instance(s)
hcloud_server:
name: "{{ item.instance }}"
api_token: "{{ lookup('env', 'HCLOUD_TOKEN') }}"
state: absent
register: server
loop: "{{ instance_conf }}"
async: 7200
poll: 0
- name: Wait for instance(s) deletion to complete
async_status:
jid: "{{ item.ansible_job_id }}"
register: hetzner_jobs
until: hetzner_jobs.finished
retries: 300
loop: "{{ server.results }}"
- pause:
seconds: 5
- name: Destroy volume(s)
hcloud_volume:
name: "{{ item.instance }}"
server: "{{ item.instance }}"
api_token: "{{ lookup('env', 'HCLOUD_TOKEN') }}"
state: "absent"
register: volumes
loop: "{{ instance_conf }}"
when: item.volume | default(False) | bool
async: 7200
poll: 0
- name: Wait for volume(s) deletion to complete
async_status:
jid: "{{ item.ansible_job_id }}"
register: hetzner_volumes
until: hetzner_volumes.finished
retries: 300
when: volumes.changed
loop: "{{ volumes.results }}"
- name: Remove registered SSH key
hcloud_ssh_key:
name: "{{ instance_conf[0].ssh_key_name }}"
state: absent
when: (instance_conf | default([])) | length > 0
# Mandatory configuration for Molecule to function.
- name: Populate instance config
set_fact:
instance_conf: {}
- name: Dump instance config
copy:
content: |
# Molecule managed
{{ instance_conf | to_nice_yaml(indent=2) }}
dest: "{{ molecule_instance_config }}"
when: server.changed | bool

View File

@ -1,24 +0,0 @@
---
dependency:
name: galaxy
options:
role-file: molecule/requirements.yml
requirements-file: molecule/requirements.yml
env:
ANSIBLE_GALAXY_DISPLAY_PROGRESS: "false"
driver:
name: delegated
platforms:
- name: rocky8-pam
image: rocky-8
server_type: cx11
lint: |
/usr/local/bin/flake8
provisioner:
name: ansible
env:
ANSIBLE_FILTER_PLUGINS: ${ANSIBLE_FILTER_PLUGINS:-./plugins/filter}
ANSIBLE_LIBRARY: ${ANSIBLE_LIBRARY:-./library}
log: False
verifier:
name: testinfra

View File

@ -1,15 +0,0 @@
---
- name: Prepare
hosts: all
gather_facts: false
tasks:
- name: Bootstrap python for Ansible
raw: |
command -v python3 python || (
(test -e /usr/bin/dnf && sudo dnf install -y python3) ||
(test -e /usr/bin/apt && (apt -y update && apt install -y python-minimal)) ||
(test -e /usr/bin/yum && sudo yum -y -qq install python3) ||
echo "Warning: Python not boostrapped due to unknown platform."
)
become: true
changed_when: false

17
pyproject.toml Normal file
View File

@ -0,0 +1,17 @@
[tool.ruff]
exclude = [".git", "__pycache__"]
line-length = 99
indent-width = 4
[tool.ruff.lint]
ignore = ["W191", "E111", "E114", "E117", "S101", "S105"]
select = ["F", "E", "I", "W", "S"]
[tool.ruff.format]
quote-style = "double"
indent-style = "space"
line-ending = "lf"
[tool.pytest.ini_options]
filterwarnings = ["ignore::FutureWarning", "ignore::DeprecationWarning"]

View File

@ -1,645 +0,0 @@
versions pytest-6.2.5, py-1.10.0, python-3.9.7.final.0
cwd=/home/rknet/rkau2905/Devel/private/ansible/roles/xoxys.pam
args=('--ansible-inventory', '/home/rknet/rkau2905/.cache/molecule/xoxys.pam/rocky8/inventory', '--connection', 'ansible', '--debug', '-p', 'no:cacheprovider', '/home/rknet/rkau2905/Devel/private/ansible/roles/xoxys.pam/molecule/rocky8/tests/test_default.py', '-vvv')
pytest_cmdline_main [hook]
config: <_pytest.config.Config object at 0x7f7ba4a9ca30>
pytest_plugin_registered [hook]
plugin: <Session molecule exitstatus='<UNSET>' testsfailed=0 testscollected=0>
manager: <_pytest.config.PytestPluginManager object at 0x7f7ba49edc40>
finish pytest_plugin_registered --> [] [hook]
pytest_configure [hook]
config: <_pytest.config.Config object at 0x7f7ba4a9ca30>
early skip of rewriting module: email.parser [assertion]
early skip of rewriting module: email.feedparser [assertion]
early skip of rewriting module: email.errors [assertion]
early skip of rewriting module: email._policybase [assertion]
early skip of rewriting module: email.header [assertion]
early skip of rewriting module: email.quoprimime [assertion]
early skip of rewriting module: email.base64mime [assertion]
early skip of rewriting module: email.charset [assertion]
early skip of rewriting module: email.encoders [assertion]
early skip of rewriting module: quopri [assertion]
early skip of rewriting module: email.utils [assertion]
early skip of rewriting module: email._parseaddr [assertion]
early skip of rewriting module: calendar [assertion]
early skip of rewriting module: email.message [assertion]
early skip of rewriting module: uu [assertion]
early skip of rewriting module: email._encoded_words [assertion]
early skip of rewriting module: email.iterators [assertion]
pytest_metadata [hook]
metadata: {'Python': '3.9.7', 'Platform': 'Linux-5.14.9-200.fc34.x86_64-x86_64-with-glibc2.33', 'Packages': {'pytest': '6.2.5', 'py': '1.10.0', 'pluggy': '0.13.1'}, 'Plugins': {'metadata': '1.11.0', 'forked': '1.3.0', 'xdist': '2.3.0', 'verbose-parametrize': '1.7.0', 'testinfra': '6.4.0', 'plus': '0.2', 'mock': '3.6.1', 'html': '3.1.1', 'cov': '2.12.1', 'flaky': '3.7.0'}}
finish pytest_metadata --> [] [hook]
pytest_plugin_registered [hook]
plugin: <flaky.flaky_pytest_plugin.FlakyXdist object at 0x7f7ba3c12940>
manager: <_pytest.config.PytestPluginManager object at 0x7f7ba49edc40>
finish pytest_plugin_registered --> [] [hook]
early skip of rewriting module: faulthandler [assertion]
pytest_configure [hook]
config: <_pytest.config.Config object at 0x7f7ba4a9ca30>
finish pytest_configure --> [] [hook]
pytest_plugin_registered [hook]
plugin: <_pytest.faulthandler.FaultHandlerHooks object at 0x7f7ba3b151f0>
manager: <_pytest.config.PytestPluginManager object at 0x7f7ba49edc40>
finish pytest_plugin_registered --> [] [hook]
early skip of rewriting module: pdb [assertion]
early skip of rewriting module: cmd [assertion]
early skip of rewriting module: code [assertion]
early skip of rewriting module: codeop [assertion]
pytest_plugin_registered [hook]
plugin: <_pytest.config.PytestPluginManager object at 0x7f7ba49edc40>
manager: <_pytest.config.PytestPluginManager object at 0x7f7ba49edc40>
finish pytest_plugin_registered --> [] [hook]
pytest_plugin_registered [hook]
plugin: <_pytest.config.Config object at 0x7f7ba4a9ca30>
manager: <_pytest.config.PytestPluginManager object at 0x7f7ba49edc40>
finish pytest_plugin_registered --> [] [hook]
pytest_plugin_registered [hook]
plugin: <module '_pytest.mark' from '/home/rknet/rkau2905/.local/lib/python3.9/site-packages/_pytest/mark/__init__.py'>
manager: <_pytest.config.PytestPluginManager object at 0x7f7ba49edc40>
finish pytest_plugin_registered --> [] [hook]
pytest_plugin_registered [hook]
plugin: <module '_pytest.main' from '/home/rknet/rkau2905/.local/lib/python3.9/site-packages/_pytest/main.py'>
manager: <_pytest.config.PytestPluginManager object at 0x7f7ba49edc40>
finish pytest_plugin_registered --> [] [hook]
pytest_plugin_registered [hook]
plugin: <module '_pytest.runner' from '/home/rknet/rkau2905/.local/lib/python3.9/site-packages/_pytest/runner.py'>
manager: <_pytest.config.PytestPluginManager object at 0x7f7ba49edc40>
finish pytest_plugin_registered --> [] [hook]
pytest_plugin_registered [hook]
plugin: <module '_pytest.fixtures' from '/home/rknet/rkau2905/.local/lib/python3.9/site-packages/_pytest/fixtures.py'>
manager: <_pytest.config.PytestPluginManager object at 0x7f7ba49edc40>
finish pytest_plugin_registered --> [] [hook]
pytest_plugin_registered [hook]
plugin: <module '_pytest.helpconfig' from '/home/rknet/rkau2905/.local/lib/python3.9/site-packages/_pytest/helpconfig.py'>
manager: <_pytest.config.PytestPluginManager object at 0x7f7ba49edc40>
finish pytest_plugin_registered --> [] [hook]
pytest_plugin_registered [hook]
plugin: <module '_pytest.python' from '/home/rknet/rkau2905/.local/lib/python3.9/site-packages/_pytest/python.py'>
manager: <_pytest.config.PytestPluginManager object at 0x7f7ba49edc40>
finish pytest_plugin_registered --> [] [hook]
pytest_plugin_registered [hook]
plugin: <module '_pytest.terminal' from '/home/rknet/rkau2905/.local/lib/python3.9/site-packages/_pytest/terminal.py'>
manager: <_pytest.config.PytestPluginManager object at 0x7f7ba49edc40>
finish pytest_plugin_registered --> [] [hook]
pytest_plugin_registered [hook]
plugin: <module '_pytest.debugging' from '/home/rknet/rkau2905/.local/lib/python3.9/site-packages/_pytest/debugging.py'>
manager: <_pytest.config.PytestPluginManager object at 0x7f7ba49edc40>
finish pytest_plugin_registered --> [] [hook]
pytest_plugin_registered [hook]
plugin: <module '_pytest.unittest' from '/home/rknet/rkau2905/.local/lib/python3.9/site-packages/_pytest/unittest.py'>
manager: <_pytest.config.PytestPluginManager object at 0x7f7ba49edc40>
finish pytest_plugin_registered --> [] [hook]
pytest_plugin_registered [hook]
plugin: <module '_pytest.capture' from '/home/rknet/rkau2905/.local/lib/python3.9/site-packages/_pytest/capture.py'>
manager: <_pytest.config.PytestPluginManager object at 0x7f7ba49edc40>
finish pytest_plugin_registered --> [] [hook]
pytest_plugin_registered [hook]
plugin: <module '_pytest.skipping' from '/home/rknet/rkau2905/.local/lib/python3.9/site-packages/_pytest/skipping.py'>
manager: <_pytest.config.PytestPluginManager object at 0x7f7ba49edc40>
finish pytest_plugin_registered --> [] [hook]
pytest_plugin_registered [hook]
plugin: <module '_pytest.tmpdir' from '/home/rknet/rkau2905/.local/lib/python3.9/site-packages/_pytest/tmpdir.py'>
manager: <_pytest.config.PytestPluginManager object at 0x7f7ba49edc40>
finish pytest_plugin_registered --> [] [hook]
pytest_plugin_registered [hook]
plugin: <module '_pytest.monkeypatch' from '/home/rknet/rkau2905/.local/lib/python3.9/site-packages/_pytest/monkeypatch.py'>
manager: <_pytest.config.PytestPluginManager object at 0x7f7ba49edc40>
finish pytest_plugin_registered --> [] [hook]
pytest_plugin_registered [hook]
plugin: <module '_pytest.recwarn' from '/home/rknet/rkau2905/.local/lib/python3.9/site-packages/_pytest/recwarn.py'>
manager: <_pytest.config.PytestPluginManager object at 0x7f7ba49edc40>
finish pytest_plugin_registered --> [] [hook]
pytest_plugin_registered [hook]
plugin: <module '_pytest.pastebin' from '/home/rknet/rkau2905/.local/lib/python3.9/site-packages/_pytest/pastebin.py'>
manager: <_pytest.config.PytestPluginManager object at 0x7f7ba49edc40>
finish pytest_plugin_registered --> [] [hook]
pytest_plugin_registered [hook]
plugin: <module '_pytest.nose' from '/home/rknet/rkau2905/.local/lib/python3.9/site-packages/_pytest/nose.py'>
manager: <_pytest.config.PytestPluginManager object at 0x7f7ba49edc40>
finish pytest_plugin_registered --> [] [hook]
pytest_plugin_registered [hook]
plugin: <module '_pytest.assertion' from '/home/rknet/rkau2905/.local/lib/python3.9/site-packages/_pytest/assertion/__init__.py'>
manager: <_pytest.config.PytestPluginManager object at 0x7f7ba49edc40>
finish pytest_plugin_registered --> [] [hook]
pytest_plugin_registered [hook]
plugin: <module '_pytest.junitxml' from '/home/rknet/rkau2905/.local/lib/python3.9/site-packages/_pytest/junitxml.py'>
manager: <_pytest.config.PytestPluginManager object at 0x7f7ba49edc40>
finish pytest_plugin_registered --> [] [hook]
pytest_plugin_registered [hook]
plugin: <module '_pytest.doctest' from '/home/rknet/rkau2905/.local/lib/python3.9/site-packages/_pytest/doctest.py'>
manager: <_pytest.config.PytestPluginManager object at 0x7f7ba49edc40>
finish pytest_plugin_registered --> [] [hook]
pytest_plugin_registered [hook]
plugin: <module '_pytest.freeze_support' from '/home/rknet/rkau2905/.local/lib/python3.9/site-packages/_pytest/freeze_support.py'>
manager: <_pytest.config.PytestPluginManager object at 0x7f7ba49edc40>
finish pytest_plugin_registered --> [] [hook]
pytest_plugin_registered [hook]
plugin: <module '_pytest.setuponly' from '/home/rknet/rkau2905/.local/lib/python3.9/site-packages/_pytest/setuponly.py'>
manager: <_pytest.config.PytestPluginManager object at 0x7f7ba49edc40>
finish pytest_plugin_registered --> [] [hook]
pytest_plugin_registered [hook]
plugin: <module '_pytest.setupplan' from '/home/rknet/rkau2905/.local/lib/python3.9/site-packages/_pytest/setupplan.py'>
manager: <_pytest.config.PytestPluginManager object at 0x7f7ba49edc40>
finish pytest_plugin_registered --> [] [hook]
pytest_plugin_registered [hook]
plugin: <module '_pytest.warnings' from '/home/rknet/rkau2905/.local/lib/python3.9/site-packages/_pytest/warnings.py'>
manager: <_pytest.config.PytestPluginManager object at 0x7f7ba49edc40>
finish pytest_plugin_registered --> [] [hook]
pytest_plugin_registered [hook]
plugin: <module '_pytest.logging' from '/home/rknet/rkau2905/.local/lib/python3.9/site-packages/_pytest/logging.py'>
manager: <_pytest.config.PytestPluginManager object at 0x7f7ba49edc40>
finish pytest_plugin_registered --> [] [hook]
pytest_plugin_registered [hook]
plugin: <module '_pytest.reports' from '/home/rknet/rkau2905/.local/lib/python3.9/site-packages/_pytest/reports.py'>
manager: <_pytest.config.PytestPluginManager object at 0x7f7ba49edc40>
finish pytest_plugin_registered --> [] [hook]
pytest_plugin_registered [hook]
plugin: <module '_pytest.unraisableexception' from '/home/rknet/rkau2905/.local/lib/python3.9/site-packages/_pytest/unraisableexception.py'>
manager: <_pytest.config.PytestPluginManager object at 0x7f7ba49edc40>
finish pytest_plugin_registered --> [] [hook]
pytest_plugin_registered [hook]
plugin: <module '_pytest.threadexception' from '/home/rknet/rkau2905/.local/lib/python3.9/site-packages/_pytest/threadexception.py'>
manager: <_pytest.config.PytestPluginManager object at 0x7f7ba49edc40>
finish pytest_plugin_registered --> [] [hook]
pytest_plugin_registered [hook]
plugin: <module '_pytest.faulthandler' from '/home/rknet/rkau2905/.local/lib/python3.9/site-packages/_pytest/faulthandler.py'>
manager: <_pytest.config.PytestPluginManager object at 0x7f7ba49edc40>
finish pytest_plugin_registered --> [] [hook]
pytest_plugin_registered [hook]
plugin: <module 'pytest_metadata.plugin' from '/home/rknet/rkau2905/.local/lib/python3.9/site-packages/pytest_metadata/plugin.py'>
manager: <_pytest.config.PytestPluginManager object at 0x7f7ba49edc40>
finish pytest_plugin_registered --> [] [hook]
pytest_plugin_registered [hook]
plugin: <module 'pytest_forked' from '/home/rknet/rkau2905/.local/lib/python3.9/site-packages/pytest_forked/__init__.py'>
manager: <_pytest.config.PytestPluginManager object at 0x7f7ba49edc40>
finish pytest_plugin_registered --> [] [hook]
pytest_plugin_registered [hook]
plugin: <module 'xdist.plugin' from '/home/rknet/rkau2905/.local/lib/python3.9/site-packages/xdist/plugin.py'>
manager: <_pytest.config.PytestPluginManager object at 0x7f7ba49edc40>
finish pytest_plugin_registered --> [] [hook]
pytest_plugin_registered [hook]
plugin: <module 'xdist.looponfail' from '/home/rknet/rkau2905/.local/lib/python3.9/site-packages/xdist/looponfail.py'>
manager: <_pytest.config.PytestPluginManager object at 0x7f7ba49edc40>
finish pytest_plugin_registered --> [] [hook]
pytest_plugin_registered [hook]
plugin: <module 'pytest_verbose_parametrize' from '/home/rknet/rkau2905/.local/lib/python3.9/site-packages/pytest_verbose_parametrize.py'>
manager: <_pytest.config.PytestPluginManager object at 0x7f7ba49edc40>
finish pytest_plugin_registered --> [] [hook]
pytest_plugin_registered [hook]
plugin: <module 'testinfra.plugin' from '/home/rknet/rkau2905/.local/lib/python3.9/site-packages/testinfra/plugin.py'>
manager: <_pytest.config.PytestPluginManager object at 0x7f7ba49edc40>
finish pytest_plugin_registered --> [] [hook]
pytest_plugin_registered [hook]
plugin: <module 'pytest_plus' from '/home/rknet/rkau2905/.local/lib/python3.9/site-packages/pytest_plus/__init__.py'>
manager: <_pytest.config.PytestPluginManager object at 0x7f7ba49edc40>
finish pytest_plugin_registered --> [] [hook]
pytest_plugin_registered [hook]
plugin: <module 'pytest_mock' from '/home/rknet/rkau2905/.local/lib/python3.9/site-packages/pytest_mock/__init__.py'>
manager: <_pytest.config.PytestPluginManager object at 0x7f7ba49edc40>
finish pytest_plugin_registered --> [] [hook]
pytest_plugin_registered [hook]
plugin: <module 'pytest_html.plugin' from '/home/rknet/rkau2905/.local/lib/python3.9/site-packages/pytest_html/plugin.py'>
manager: <_pytest.config.PytestPluginManager object at 0x7f7ba49edc40>
finish pytest_plugin_registered --> [] [hook]
pytest_plugin_registered [hook]
plugin: <module 'pytest_cov.plugin' from '/home/rknet/rkau2905/.local/lib/python3.9/site-packages/pytest_cov/plugin.py'>
manager: <_pytest.config.PytestPluginManager object at 0x7f7ba49edc40>
finish pytest_plugin_registered --> [] [hook]
pytest_plugin_registered [hook]
plugin: <module 'flaky.flaky_pytest_plugin' from '/home/rknet/rkau2905/.local/lib/python3.9/site-packages/flaky/flaky_pytest_plugin.py'>
manager: <_pytest.config.PytestPluginManager object at 0x7f7ba49edc40>
finish pytest_plugin_registered --> [] [hook]
pytest_plugin_registered [hook]
plugin: <CaptureManager _method='fd' _global_capturing=<MultiCapture out=<FDCapture 1 oldfd=5 _state='suspended' tmpfile=<_io.TextIOWrapper name="<_io.FileIO name=6 mode='rb+' closefd=True>" mode='r+' encoding='utf-8'>> err=<FDCapture 2 oldfd=7 _state='suspended' tmpfile=<_io.TextIOWrapper name="<_io.FileIO name=8 mode='rb+' closefd=True>" mode='r+' encoding='utf-8'>> in_=<FDCapture 0 oldfd=3 _state='started' tmpfile=<_io.TextIOWrapper name='/dev/null' mode='r' encoding='UTF-8'>> _state='suspended' _in_suspended=False> _capture_fixture=None>
manager: <_pytest.config.PytestPluginManager object at 0x7f7ba49edc40>
finish pytest_plugin_registered --> [] [hook]
pytest_plugin_registered [hook]
plugin: <Session molecule exitstatus=<ExitCode.OK: 0> testsfailed=0 testscollected=0>
manager: <_pytest.config.PytestPluginManager object at 0x7f7ba49edc40>
finish pytest_plugin_registered --> [] [hook]
pytest_plugin_registered [hook]
plugin: <flaky.flaky_pytest_plugin.FlakyXdist object at 0x7f7ba3c12940>
manager: <_pytest.config.PytestPluginManager object at 0x7f7ba49edc40>
finish pytest_plugin_registered --> [] [hook]
pytest_plugin_registered [hook]
plugin: <_pytest.faulthandler.FaultHandlerHooks object at 0x7f7ba3b151f0>
manager: <_pytest.config.PytestPluginManager object at 0x7f7ba49edc40>
finish pytest_plugin_registered --> [] [hook]
pytest_plugin_registered [hook]
plugin: <_pytest.terminal.TerminalReporter object at 0x7f7ba3b156a0>
manager: <_pytest.config.PytestPluginManager object at 0x7f7ba49edc40>
finish pytest_plugin_registered --> [] [hook]
pytest_plugin_registered [hook]
plugin: <_pytest.logging.LoggingPlugin object at 0x7f7ba3b42b20>
manager: <_pytest.config.PytestPluginManager object at 0x7f7ba49edc40>
finish pytest_plugin_registered --> [] [hook]
finish pytest_configure --> [] [hook]
pytest_sessionstart [hook]
session: <Session molecule exitstatus=<ExitCode.OK: 0> testsfailed=0 testscollected=0>
pytest_plugin_registered [hook]
plugin: <_pytest.config.PytestPluginManager object at 0x7f7ba49edc40>
manager: <_pytest.config.PytestPluginManager object at 0x7f7ba49edc40>
finish pytest_plugin_registered --> [] [hook]
pytest_plugin_registered [hook]
plugin: <_pytest.config.Config object at 0x7f7ba4a9ca30>
manager: <_pytest.config.PytestPluginManager object at 0x7f7ba49edc40>
finish pytest_plugin_registered --> [] [hook]
pytest_plugin_registered [hook]
plugin: <module '_pytest.mark' from '/home/rknet/rkau2905/.local/lib/python3.9/site-packages/_pytest/mark/__init__.py'>
manager: <_pytest.config.PytestPluginManager object at 0x7f7ba49edc40>
finish pytest_plugin_registered --> [] [hook]
pytest_plugin_registered [hook]
plugin: <module '_pytest.main' from '/home/rknet/rkau2905/.local/lib/python3.9/site-packages/_pytest/main.py'>
manager: <_pytest.config.PytestPluginManager object at 0x7f7ba49edc40>
finish pytest_plugin_registered --> [] [hook]
pytest_plugin_registered [hook]
plugin: <module '_pytest.runner' from '/home/rknet/rkau2905/.local/lib/python3.9/site-packages/_pytest/runner.py'>
manager: <_pytest.config.PytestPluginManager object at 0x7f7ba49edc40>
finish pytest_plugin_registered --> [] [hook]
pytest_plugin_registered [hook]
plugin: <module '_pytest.fixtures' from '/home/rknet/rkau2905/.local/lib/python3.9/site-packages/_pytest/fixtures.py'>
manager: <_pytest.config.PytestPluginManager object at 0x7f7ba49edc40>
finish pytest_plugin_registered --> [] [hook]
pytest_plugin_registered [hook]
plugin: <module '_pytest.helpconfig' from '/home/rknet/rkau2905/.local/lib/python3.9/site-packages/_pytest/helpconfig.py'>
manager: <_pytest.config.PytestPluginManager object at 0x7f7ba49edc40>
finish pytest_plugin_registered --> [] [hook]
pytest_plugin_registered [hook]
plugin: <module '_pytest.python' from '/home/rknet/rkau2905/.local/lib/python3.9/site-packages/_pytest/python.py'>
manager: <_pytest.config.PytestPluginManager object at 0x7f7ba49edc40>
finish pytest_plugin_registered --> [] [hook]
pytest_plugin_registered [hook]
plugin: <module '_pytest.terminal' from '/home/rknet/rkau2905/.local/lib/python3.9/site-packages/_pytest/terminal.py'>
manager: <_pytest.config.PytestPluginManager object at 0x7f7ba49edc40>
finish pytest_plugin_registered --> [] [hook]
pytest_plugin_registered [hook]
plugin: <module '_pytest.debugging' from '/home/rknet/rkau2905/.local/lib/python3.9/site-packages/_pytest/debugging.py'>
manager: <_pytest.config.PytestPluginManager object at 0x7f7ba49edc40>
finish pytest_plugin_registered --> [] [hook]
pytest_plugin_registered [hook]
plugin: <module '_pytest.unittest' from '/home/rknet/rkau2905/.local/lib/python3.9/site-packages/_pytest/unittest.py'>
manager: <_pytest.config.PytestPluginManager object at 0x7f7ba49edc40>
finish pytest_plugin_registered --> [] [hook]
pytest_plugin_registered [hook]
plugin: <module '_pytest.capture' from '/home/rknet/rkau2905/.local/lib/python3.9/site-packages/_pytest/capture.py'>
manager: <_pytest.config.PytestPluginManager object at 0x7f7ba49edc40>
finish pytest_plugin_registered --> [] [hook]
pytest_plugin_registered [hook]
plugin: <module '_pytest.skipping' from '/home/rknet/rkau2905/.local/lib/python3.9/site-packages/_pytest/skipping.py'>
manager: <_pytest.config.PytestPluginManager object at 0x7f7ba49edc40>
finish pytest_plugin_registered --> [] [hook]
pytest_plugin_registered [hook]
plugin: <module '_pytest.tmpdir' from '/home/rknet/rkau2905/.local/lib/python3.9/site-packages/_pytest/tmpdir.py'>
manager: <_pytest.config.PytestPluginManager object at 0x7f7ba49edc40>
finish pytest_plugin_registered --> [] [hook]
pytest_plugin_registered [hook]
plugin: <module '_pytest.monkeypatch' from '/home/rknet/rkau2905/.local/lib/python3.9/site-packages/_pytest/monkeypatch.py'>
manager: <_pytest.config.PytestPluginManager object at 0x7f7ba49edc40>
finish pytest_plugin_registered --> [] [hook]
pytest_plugin_registered [hook]
plugin: <module '_pytest.recwarn' from '/home/rknet/rkau2905/.local/lib/python3.9/site-packages/_pytest/recwarn.py'>
manager: <_pytest.config.PytestPluginManager object at 0x7f7ba49edc40>
finish pytest_plugin_registered --> [] [hook]
pytest_plugin_registered [hook]
plugin: <module '_pytest.pastebin' from '/home/rknet/rkau2905/.local/lib/python3.9/site-packages/_pytest/pastebin.py'>
manager: <_pytest.config.PytestPluginManager object at 0x7f7ba49edc40>
finish pytest_plugin_registered --> [] [hook]
pytest_plugin_registered [hook]
plugin: <module '_pytest.nose' from '/home/rknet/rkau2905/.local/lib/python3.9/site-packages/_pytest/nose.py'>
manager: <_pytest.config.PytestPluginManager object at 0x7f7ba49edc40>
finish pytest_plugin_registered --> [] [hook]
pytest_plugin_registered [hook]
plugin: <module '_pytest.assertion' from '/home/rknet/rkau2905/.local/lib/python3.9/site-packages/_pytest/assertion/__init__.py'>
manager: <_pytest.config.PytestPluginManager object at 0x7f7ba49edc40>
finish pytest_plugin_registered --> [] [hook]
pytest_plugin_registered [hook]
plugin: <module '_pytest.junitxml' from '/home/rknet/rkau2905/.local/lib/python3.9/site-packages/_pytest/junitxml.py'>
manager: <_pytest.config.PytestPluginManager object at 0x7f7ba49edc40>
finish pytest_plugin_registered --> [] [hook]
pytest_plugin_registered [hook]
plugin: <module '_pytest.doctest' from '/home/rknet/rkau2905/.local/lib/python3.9/site-packages/_pytest/doctest.py'>
manager: <_pytest.config.PytestPluginManager object at 0x7f7ba49edc40>
finish pytest_plugin_registered --> [] [hook]
pytest_plugin_registered [hook]
plugin: <module '_pytest.freeze_support' from '/home/rknet/rkau2905/.local/lib/python3.9/site-packages/_pytest/freeze_support.py'>
manager: <_pytest.config.PytestPluginManager object at 0x7f7ba49edc40>
finish pytest_plugin_registered --> [] [hook]
pytest_plugin_registered [hook]
plugin: <module '_pytest.setuponly' from '/home/rknet/rkau2905/.local/lib/python3.9/site-packages/_pytest/setuponly.py'>
manager: <_pytest.config.PytestPluginManager object at 0x7f7ba49edc40>
finish pytest_plugin_registered --> [] [hook]
pytest_plugin_registered [hook]
plugin: <module '_pytest.setupplan' from '/home/rknet/rkau2905/.local/lib/python3.9/site-packages/_pytest/setupplan.py'>
manager: <_pytest.config.PytestPluginManager object at 0x7f7ba49edc40>
finish pytest_plugin_registered --> [] [hook]
pytest_plugin_registered [hook]
plugin: <module '_pytest.warnings' from '/home/rknet/rkau2905/.local/lib/python3.9/site-packages/_pytest/warnings.py'>
manager: <_pytest.config.PytestPluginManager object at 0x7f7ba49edc40>
finish pytest_plugin_registered --> [] [hook]
pytest_plugin_registered [hook]
plugin: <module '_pytest.logging' from '/home/rknet/rkau2905/.local/lib/python3.9/site-packages/_pytest/logging.py'>
manager: <_pytest.config.PytestPluginManager object at 0x7f7ba49edc40>
finish pytest_plugin_registered --> [] [hook]
pytest_plugin_registered [hook]
plugin: <module '_pytest.reports' from '/home/rknet/rkau2905/.local/lib/python3.9/site-packages/_pytest/reports.py'>
manager: <_pytest.config.PytestPluginManager object at 0x7f7ba49edc40>
finish pytest_plugin_registered --> [] [hook]
pytest_plugin_registered [hook]
plugin: <module '_pytest.unraisableexception' from '/home/rknet/rkau2905/.local/lib/python3.9/site-packages/_pytest/unraisableexception.py'>
manager: <_pytest.config.PytestPluginManager object at 0x7f7ba49edc40>
finish pytest_plugin_registered --> [] [hook]
pytest_plugin_registered [hook]
plugin: <module '_pytest.threadexception' from '/home/rknet/rkau2905/.local/lib/python3.9/site-packages/_pytest/threadexception.py'>
manager: <_pytest.config.PytestPluginManager object at 0x7f7ba49edc40>
finish pytest_plugin_registered --> [] [hook]
pytest_plugin_registered [hook]
plugin: <module '_pytest.faulthandler' from '/home/rknet/rkau2905/.local/lib/python3.9/site-packages/_pytest/faulthandler.py'>
manager: <_pytest.config.PytestPluginManager object at 0x7f7ba49edc40>
finish pytest_plugin_registered --> [] [hook]
pytest_plugin_registered [hook]
plugin: <module 'pytest_metadata.plugin' from '/home/rknet/rkau2905/.local/lib/python3.9/site-packages/pytest_metadata/plugin.py'>
manager: <_pytest.config.PytestPluginManager object at 0x7f7ba49edc40>
finish pytest_plugin_registered --> [] [hook]
pytest_plugin_registered [hook]
plugin: <module 'pytest_forked' from '/home/rknet/rkau2905/.local/lib/python3.9/site-packages/pytest_forked/__init__.py'>
manager: <_pytest.config.PytestPluginManager object at 0x7f7ba49edc40>
finish pytest_plugin_registered --> [] [hook]
pytest_plugin_registered [hook]
plugin: <module 'xdist.plugin' from '/home/rknet/rkau2905/.local/lib/python3.9/site-packages/xdist/plugin.py'>
manager: <_pytest.config.PytestPluginManager object at 0x7f7ba49edc40>
finish pytest_plugin_registered --> [] [hook]
pytest_plugin_registered [hook]
plugin: <module 'xdist.looponfail' from '/home/rknet/rkau2905/.local/lib/python3.9/site-packages/xdist/looponfail.py'>
manager: <_pytest.config.PytestPluginManager object at 0x7f7ba49edc40>
finish pytest_plugin_registered --> [] [hook]
pytest_plugin_registered [hook]
plugin: <module 'pytest_verbose_parametrize' from '/home/rknet/rkau2905/.local/lib/python3.9/site-packages/pytest_verbose_parametrize.py'>
manager: <_pytest.config.PytestPluginManager object at 0x7f7ba49edc40>
finish pytest_plugin_registered --> [] [hook]
pytest_plugin_registered [hook]
plugin: <module 'testinfra.plugin' from '/home/rknet/rkau2905/.local/lib/python3.9/site-packages/testinfra/plugin.py'>
manager: <_pytest.config.PytestPluginManager object at 0x7f7ba49edc40>
finish pytest_plugin_registered --> [] [hook]
pytest_plugin_registered [hook]
plugin: <module 'pytest_plus' from '/home/rknet/rkau2905/.local/lib/python3.9/site-packages/pytest_plus/__init__.py'>
manager: <_pytest.config.PytestPluginManager object at 0x7f7ba49edc40>
finish pytest_plugin_registered --> [] [hook]
pytest_plugin_registered [hook]
plugin: <module 'pytest_mock' from '/home/rknet/rkau2905/.local/lib/python3.9/site-packages/pytest_mock/__init__.py'>
manager: <_pytest.config.PytestPluginManager object at 0x7f7ba49edc40>
finish pytest_plugin_registered --> [] [hook]
pytest_plugin_registered [hook]
plugin: <module 'pytest_html.plugin' from '/home/rknet/rkau2905/.local/lib/python3.9/site-packages/pytest_html/plugin.py'>
manager: <_pytest.config.PytestPluginManager object at 0x7f7ba49edc40>
finish pytest_plugin_registered --> [] [hook]
pytest_plugin_registered [hook]
plugin: <module 'pytest_cov.plugin' from '/home/rknet/rkau2905/.local/lib/python3.9/site-packages/pytest_cov/plugin.py'>
manager: <_pytest.config.PytestPluginManager object at 0x7f7ba49edc40>
finish pytest_plugin_registered --> [] [hook]
pytest_plugin_registered [hook]
plugin: <module 'flaky.flaky_pytest_plugin' from '/home/rknet/rkau2905/.local/lib/python3.9/site-packages/flaky/flaky_pytest_plugin.py'>
manager: <_pytest.config.PytestPluginManager object at 0x7f7ba49edc40>
finish pytest_plugin_registered --> [] [hook]
pytest_plugin_registered [hook]
plugin: <CaptureManager _method='fd' _global_capturing=<MultiCapture out=<FDCapture 1 oldfd=5 _state='suspended' tmpfile=<_io.TextIOWrapper name="<_io.FileIO name=6 mode='rb+' closefd=True>" mode='r+' encoding='utf-8'>> err=<FDCapture 2 oldfd=7 _state='suspended' tmpfile=<_io.TextIOWrapper name="<_io.FileIO name=8 mode='rb+' closefd=True>" mode='r+' encoding='utf-8'>> in_=<FDCapture 0 oldfd=3 _state='started' tmpfile=<_io.TextIOWrapper name='/dev/null' mode='r' encoding='UTF-8'>> _state='suspended' _in_suspended=False> _capture_fixture=None>
manager: <_pytest.config.PytestPluginManager object at 0x7f7ba49edc40>
finish pytest_plugin_registered --> [] [hook]
pytest_plugin_registered [hook]
plugin: <Session molecule exitstatus=<ExitCode.OK: 0> testsfailed=0 testscollected=0>
manager: <_pytest.config.PytestPluginManager object at 0x7f7ba49edc40>
finish pytest_plugin_registered --> [] [hook]
pytest_plugin_registered [hook]
plugin: <flaky.flaky_pytest_plugin.FlakyXdist object at 0x7f7ba3c12940>
manager: <_pytest.config.PytestPluginManager object at 0x7f7ba49edc40>
finish pytest_plugin_registered --> [] [hook]
pytest_plugin_registered [hook]
plugin: <_pytest.faulthandler.FaultHandlerHooks object at 0x7f7ba3b151f0>
manager: <_pytest.config.PytestPluginManager object at 0x7f7ba49edc40>
finish pytest_plugin_registered --> [] [hook]
pytest_plugin_registered [hook]
plugin: <_pytest.terminal.TerminalReporter object at 0x7f7ba3b156a0>
manager: <_pytest.config.PytestPluginManager object at 0x7f7ba49edc40>
finish pytest_plugin_registered --> [] [hook]
pytest_plugin_registered [hook]
plugin: <_pytest.logging.LoggingPlugin object at 0x7f7ba3b42b20>
manager: <_pytest.config.PytestPluginManager object at 0x7f7ba49edc40>
finish pytest_plugin_registered --> [] [hook]
pytest_plugin_registered [hook]
plugin: <_pytest.fixtures.FixtureManager object at 0x7f7ba3b8e6d0>
manager: <_pytest.config.PytestPluginManager object at 0x7f7ba49edc40>
finish pytest_plugin_registered --> [] [hook]
pytest_report_header [hook]
config: <_pytest.config.Config object at 0x7f7ba4a9ca30>
startdir: /home/rknet/rkau2905/Devel/private/ansible/roles/xoxys.pam
finish pytest_report_header --> [['rootdir: /home/rknet/rkau2905/Devel/private/ansible/roles/xoxys.pam/molecule, configfile: pytest.ini', 'plugins: metadata-1.11.0, forked-1.3.0, xdist-2.3.0, verbose-parametrize-1.7.0, testinfra-6.4.0, plus-0.2, mock-3.6.1, html-3.1.1, cov-2.12.1, flaky-3.7.0'], "metadata: {'Python': '3.9.7', 'Platform': 'Linux-5.14.9-200.fc34.x86_64-x86_64-with-glibc2.33', 'Packages': {'pytest': '6.2.5', 'py': '1.10.0', 'pluggy': '0.13.1'}, 'Plugins': {'metadata': '1.11.0', 'forked': '1.3.0', 'xdist': '2.3.0', 'verbose-parametrize': '1.7.0', 'testinfra': '6.4.0', 'plus': '0.2', 'mock': '3.6.1', 'html': '3.1.1', 'cov': '2.12.1', 'flaky': '3.7.0'}}", ['using: pytest-6.2.5 pylib-1.10.0', 'setuptools registered plugins:', ' pytest-metadata-1.11.0 at /home/rknet/rkau2905/.local/lib/python3.9/site-packages/pytest_metadata/plugin.py', ' pytest-forked-1.3.0 at /home/rknet/rkau2905/.local/lib/python3.9/site-packages/pytest_forked/__init__.py', ' pytest-xdist-2.3.0 at /home/rknet/rkau2905/.local/lib/python3.9/site-packages/xdist/plugin.py', ' pytest-xdist-2.3.0 at /home/rknet/rkau2905/.local/lib/python3.9/site-packages/xdist/looponfail.py', ' pytest-verbose-parametrize-1.7.0 at /home/rknet/rkau2905/.local/lib/python3.9/site-packages/pytest_verbose_parametrize.py', ' pytest-testinfra-6.4.0 at /home/rknet/rkau2905/.local/lib/python3.9/site-packages/testinfra/plugin.py', ' pytest-plus-0.2 at /home/rknet/rkau2905/.local/lib/python3.9/site-packages/pytest_plus/__init__.py', ' pytest-mock-3.6.1 at /home/rknet/rkau2905/.local/lib/python3.9/site-packages/pytest_mock/__init__.py', ' pytest-html-3.1.1 at /home/rknet/rkau2905/.local/lib/python3.9/site-packages/pytest_html/plugin.py', ' pytest-cov-2.12.1 at /home/rknet/rkau2905/.local/lib/python3.9/site-packages/pytest_cov/plugin.py', ' flaky-3.7.0 at /home/rknet/rkau2905/.local/lib/python3.9/site-packages/flaky/flaky_pytest_plugin.py']] [hook]
finish pytest_sessionstart --> [] [hook]
pytest_collection [hook]
session: <Session molecule exitstatus=<ExitCode.OK: 0> testsfailed=0 testscollected=0>
perform_collect <Session molecule exitstatus=<ExitCode.OK: 0> testsfailed=0 testscollected=0> ['/home/rknet/rkau2905/Devel/private/ansible/roles/xoxys.pam/molecule/rocky8/tests/test_default.py'] [collection]
pytest_collectstart [hook]
collector: <Session molecule exitstatus=<ExitCode.OK: 0> testsfailed=0 testscollected=0>
finish pytest_collectstart --> [] [hook]
pytest_make_collect_report [hook]
collector: <Session molecule exitstatus=<ExitCode.OK: 0> testsfailed=0 testscollected=0>
processing argument (local('/home/rknet/rkau2905/Devel/private/ansible/roles/xoxys.pam/molecule/rocky8/tests/test_default.py'), []) [collection]
pytest_collect_file [hook]
path: /home/rknet/rkau2905/Devel/private/ansible/roles/xoxys.pam/molecule/rocky8/tests/test_default.py
parent: <Session molecule exitstatus=<ExitCode.OK: 0> testsfailed=0 testscollected=0>
pytest_pycollect_makemodule [hook]
path: /home/rknet/rkau2905/Devel/private/ansible/roles/xoxys.pam/molecule/rocky8/tests/test_default.py
parent: <Session molecule exitstatus=<ExitCode.OK: 0> testsfailed=0 testscollected=0>
finish pytest_pycollect_makemodule --> <Module rocky8/tests/test_default.py> [hook]
finish pytest_collect_file --> [<Module rocky8/tests/test_default.py>] [hook]
matchnodes [<Module rocky8/tests/test_default.py>] [] [collection]
matchnodes finished -> 1 nodes [collection]
finish pytest_make_collect_report --> <CollectReport '' lenresult=1 outcome='passed'> [hook]
pytest_collectreport [hook]
report: <CollectReport '' lenresult=1 outcome='passed'>
finish pytest_collectreport --> [] [hook]
genitems <Module rocky8/tests/test_default.py> [collection]
pytest_collectstart [hook]
collector: <Module rocky8/tests/test_default.py>
finish pytest_collectstart --> [] [hook]
pytest_make_collect_report [hook]
collector: <Module rocky8/tests/test_default.py>
find_module called for: test_default [assertion]
matched test file (was specified on cmdline): '/home/rknet/rkau2905/Devel/private/ansible/roles/xoxys.pam/molecule/rocky8/tests/test_default.py' [assertion]
rewriting PosixPath('/home/rknet/rkau2905/Devel/private/ansible/roles/xoxys.pam/molecule/rocky8/tests/test_default.py') [assertion]
matched marked file 'testinfra.utils' (from 'testinfra') [assertion]
find_module called for: testinfra.utils [assertion]
found cached rewritten pyc for /home/rknet/rkau2905/.local/lib/python3.9/site-packages/testinfra/utils/__init__.py [assertion]
matched marked file 'testinfra.utils.ansible_runner' (from 'testinfra') [assertion]
find_module called for: testinfra.utils.ansible_runner [assertion]
found cached rewritten pyc for /home/rknet/rkau2905/.local/lib/python3.9/site-packages/testinfra/utils/ansible_runner.py [assertion]
early skip of rewriting module: ipaddress [assertion]
matched marked file 'testinfra.backend.local' (from 'testinfra') [assertion]
find_module called for: testinfra.backend.local [assertion]
found cached rewritten pyc for /home/rknet/rkau2905/.local/lib/python3.9/site-packages/testinfra/backend/local.py [assertion]
matched marked file 'testinfra.backend.base' (from 'testinfra') [assertion]
find_module called for: testinfra.backend.base [assertion]
found cached rewritten pyc for /home/rknet/rkau2905/.local/lib/python3.9/site-packages/testinfra/backend/base.py [assertion]
pytest_pycollect_makeitem [hook]
collector: <Module rocky8/tests/test_default.py>
name: @py_builtins
obj: <module 'builtins' (built-in)>
finish pytest_pycollect_makeitem --> None [hook]
pytest_pycollect_makeitem [hook]
collector: <Module rocky8/tests/test_default.py>
name: @pytest_ar
obj: <module '_pytest.assertion.rewrite' from '/home/rknet/rkau2905/.local/lib/python3.9/site-packages/_pytest/assertion/rewrite.py'>
finish pytest_pycollect_makeitem --> None [hook]
pytest_pycollect_makeitem [hook]
collector: <Module rocky8/tests/test_default.py>
name: os
obj: <module 'os' from '/usr/lib64/python3.9/os.py'>
finish pytest_pycollect_makeitem --> None [hook]
pytest_pycollect_makeitem [hook]
collector: <Module rocky8/tests/test_default.py>
name: testinfra
obj: <module 'testinfra' from '/home/rknet/rkau2905/.local/lib/python3.9/site-packages/testinfra/__init__.py'>
finish pytest_pycollect_makeitem --> None [hook]
pytest_pycollect_makeitem [hook]
collector: <Module rocky8/tests/test_default.py>
name: testinfra_hosts
obj: ['rocky8-pam']
finish pytest_pycollect_makeitem --> None [hook]
pytest_pycollect_makeitem [hook]
collector: <Module rocky8/tests/test_default.py>
name: test_pam_config
obj: <function test_pam_config at 0x7f7ba3af4550>
pytest_generate_tests [hook]
metafunc: <_pytest.python.Metafunc object at 0x7f7ba3adceb0>
matched marked file 'testinfra.backend.ansible' (from 'testinfra') [assertion]
find_module called for: testinfra.backend.ansible [assertion]
found cached rewritten pyc for /home/rknet/rkau2905/.local/lib/python3.9/site-packages/testinfra/backend/ansible.py [assertion]
early skip of rewriting module: encodings.unicode_escape [assertion]
finish pytest_generate_tests --> [] [hook]
finish pytest_pycollect_makeitem --> [<Function test_pam_config[ansible://rocky8-pam]>] [hook]
finish pytest_make_collect_report --> <CollectReport 'rocky8/tests/test_default.py' lenresult=1 outcome='passed'> [hook]
genitems <Function test_pam_config[ansible://rocky8-pam]> [collection]
pytest_itemcollected [hook]
item: <Function test_pam_config[ansible://rocky8-pam]>
finish pytest_itemcollected --> [] [hook]
pytest_collectreport [hook]
report: <CollectReport 'rocky8/tests/test_default.py' lenresult=1 outcome='passed'>
finish pytest_collectreport --> [] [hook]
pytest_collection_modifyitems [hook]
session: <Session molecule exitstatus=<ExitCode.OK: 0> testsfailed=0 testscollected=0>
config: <_pytest.config.Config object at 0x7f7ba4a9ca30>
items: [<Function test_pam_config[ansible://rocky8-pam]>]
finish pytest_collection_modifyitems --> [] [hook]
pytest_collection_finish [hook]
session: <Session molecule exitstatus=<ExitCode.OK: 0> testsfailed=0 testscollected=0>
pytest_report_collectionfinish [hook]
config: <_pytest.config.Config object at 0x7f7ba4a9ca30>
startdir: /home/rknet/rkau2905/Devel/private/ansible/roles/xoxys.pam
items: [<Function test_pam_config[ansible://rocky8-pam]>]
finish pytest_report_collectionfinish --> [] [hook]
finish pytest_collection_finish --> [] [hook]
finish pytest_collection --> None [hook]
pytest_runtestloop [hook]
session: <Session molecule exitstatus=<ExitCode.OK: 0> testsfailed=0 testscollected=1>
pytest_runtest_protocol [hook]
item: <Function test_pam_config[ansible://rocky8-pam]>
nextitem: None
pytest_runtest_logstart [hook]
nodeid: rocky8/tests/test_default.py::test_pam_config[ansible://rocky8-pam]
location: ('rocky8/tests/test_default.py', 9, 'test_pam_config[ansible://rocky8-pam]')
finish pytest_runtest_logstart --> [] [hook]
pytest_runtest_setup [hook]
item: <Function test_pam_config[ansible://rocky8-pam]>
pytest_fixture_setup [hook]
fixturedef: <FixtureDef argname='_testinfra_host' scope='module' baseid=''>
request: <SubRequest '_testinfra_host' for <Function test_pam_config[ansible://rocky8-pam]>>
finish pytest_fixture_setup --> <testinfra.host.Host ansible://rocky8-pam> [hook]
pytest_fixture_setup [hook]
fixturedef: <FixtureDef argname='host' scope='module' baseid=''>
request: <SubRequest 'host' for <Function test_pam_config[ansible://rocky8-pam]>>
finish pytest_fixture_setup --> <testinfra.host.Host ansible://rocky8-pam> [hook]
finish pytest_runtest_setup --> [] [hook]
pytest_runtest_makereport [hook]
item: <Function test_pam_config[ansible://rocky8-pam]>
call: <CallInfo when='setup' result: []>
finish pytest_runtest_makereport --> <TestReport 'rocky8/tests/test_default.py::test_pam_config[ansible://rocky8-pam]' when='setup' outcome='passed'> [hook]
pytest_runtest_logreport [hook]
report: <TestReport 'rocky8/tests/test_default.py::test_pam_config[ansible://rocky8-pam]' when='setup' outcome='passed'>
pytest_report_teststatus [hook]
report: <TestReport 'rocky8/tests/test_default.py::test_pam_config[ansible://rocky8-pam]' when='setup' outcome='passed'>
config: <_pytest.config.Config object at 0x7f7ba4a9ca30>
finish pytest_report_teststatus --> ('', '', '') [hook]
finish pytest_runtest_logreport --> [] [hook]
pytest_runtest_call [hook]
item: <Function test_pam_config[ansible://rocky8-pam]>
pytest_pyfunc_call [hook]
pyfuncitem: <Function test_pam_config[ansible://rocky8-pam]>
matched marked file 'testinfra.modules.file' (from 'testinfra') [assertion]
find_module called for: testinfra.modules.file [assertion]
found cached rewritten pyc for /home/rknet/rkau2905/.local/lib/python3.9/site-packages/testinfra/modules/file.py [assertion]
matched marked file 'testinfra.modules.base' (from 'testinfra') [assertion]
find_module called for: testinfra.modules.base [assertion]
found cached rewritten pyc for /home/rknet/rkau2905/.local/lib/python3.9/site-packages/testinfra/modules/base.py [assertion]
matched marked file 'testinfra.modules.systeminfo' (from 'testinfra') [assertion]
find_module called for: testinfra.modules.systeminfo [assertion]
found cached rewritten pyc for /home/rknet/rkau2905/.local/lib/python3.9/site-packages/testinfra/modules/systeminfo.py [assertion]
matched marked file 'testinfra.backend.ssh' (from 'testinfra') [assertion]
find_module called for: testinfra.backend.ssh [assertion]
found cached rewritten pyc for /home/rknet/rkau2905/.local/lib/python3.9/site-packages/testinfra/backend/ssh.py [assertion]
finish pytest_pyfunc_call --> True [hook]
finish pytest_runtest_call --> [] [hook]
pytest_runtest_makereport [hook]
item: <Function test_pam_config[ansible://rocky8-pam]>
call: <CallInfo when='call' result: []>
finish pytest_runtest_makereport --> <TestReport 'rocky8/tests/test_default.py::test_pam_config[ansible://rocky8-pam]' when='call' outcome='passed'> [hook]
pytest_runtest_logreport [hook]
report: <TestReport 'rocky8/tests/test_default.py::test_pam_config[ansible://rocky8-pam]' when='call' outcome='passed'>
pytest_report_teststatus [hook]
report: <TestReport 'rocky8/tests/test_default.py::test_pam_config[ansible://rocky8-pam]' when='call' outcome='passed'>
config: <_pytest.config.Config object at 0x7f7ba4a9ca30>
finish pytest_report_teststatus --> ('passed', '.', 'PASSED') [hook]
finish pytest_runtest_logreport --> [] [hook]
pytest_runtest_teardown [hook]
item: <Function test_pam_config[ansible://rocky8-pam]>
nextitem: None
pytest_fixture_post_finalizer [hook]
fixturedef: <FixtureDef argname='host' scope='module' baseid=''>
request: <SubRequest 'host' for <Function test_pam_config[ansible://rocky8-pam]>>
finish pytest_fixture_post_finalizer --> [] [hook]
pytest_fixture_post_finalizer [hook]
fixturedef: <FixtureDef argname='host' scope='module' baseid=''>
request: <SubRequest 'host' for <Function test_pam_config[ansible://rocky8-pam]>>
finish pytest_fixture_post_finalizer --> [] [hook]
pytest_fixture_post_finalizer [hook]
fixturedef: <FixtureDef argname='_testinfra_host' scope='module' baseid=''>
request: <SubRequest '_testinfra_host' for <Function test_pam_config[ansible://rocky8-pam]>>
finish pytest_fixture_post_finalizer --> [] [hook]
finish pytest_runtest_teardown --> [] [hook]
pytest_runtest_makereport [hook]
item: <Function test_pam_config[ansible://rocky8-pam]>
call: <CallInfo when='teardown' result: []>
finish pytest_runtest_makereport --> <TestReport 'rocky8/tests/test_default.py::test_pam_config[ansible://rocky8-pam]' when='teardown' outcome='passed'> [hook]
pytest_runtest_logreport [hook]
report: <TestReport 'rocky8/tests/test_default.py::test_pam_config[ansible://rocky8-pam]' when='teardown' outcome='passed'>
pytest_report_teststatus [hook]
report: <TestReport 'rocky8/tests/test_default.py::test_pam_config[ansible://rocky8-pam]' when='teardown' outcome='passed'>
config: <_pytest.config.Config object at 0x7f7ba4a9ca30>
finish pytest_report_teststatus --> ('', '', '') [hook]
finish pytest_runtest_logreport --> [] [hook]
pytest_runtest_logfinish [hook]
nodeid: rocky8/tests/test_default.py::test_pam_config[ansible://rocky8-pam]
location: ('rocky8/tests/test_default.py', 9, 'test_pam_config[ansible://rocky8-pam]')
finish pytest_runtest_logfinish --> [] [hook]
finish pytest_runtest_protocol --> True [hook]
finish pytest_runtestloop --> True [hook]
pytest_sessionfinish [hook]
session: <Session molecule exitstatus=0 testsfailed=0 testscollected=1>
exitstatus: 0
pytest_terminal_summary [hook]
terminalreporter: <_pytest.terminal.TerminalReporter object at 0x7f7ba3b156a0>
exitstatus: 0
config: <_pytest.config.Config object at 0x7f7ba4a9ca30>
finish pytest_terminal_summary --> [] [hook]
finish pytest_sessionfinish --> [] [hook]
pytest_unconfigure [hook]
config: <_pytest.config.Config object at 0x7f7ba4a9ca30>
finish pytest_unconfigure --> [] [hook]

View File

@ -1,12 +0,0 @@
[flake8]
ignore = D100, D101, D102, D103, D105, D107, E402, W503
max-line-length = 99
inline-quotes = double
exclude = .git,.tox,__pycache__,build,dist,tests,*.pyc,*.egg-info,.cache,.eggs,env*
[yapf]
based_on_style = google
column_limit = 99
dedent_closing_brackets = true
coalesce_brackets = true
split_before_logical_operator = true

View File

@ -1,31 +1,28 @@
---
- block:
- name: Set pam module configuration
pamd:
name: "{{ item.name | default('system-auth') }}"
type: "{{ item.type | default('auth') }}"
module_path: "{{ item.module_path | default('pam_unix.so') }}"
control: "{{ item.control }}"
new_type: "{{ item.new_type | default(omit) }}"
new_module_path: "{{ item.new_module_path | default(omit) }}"
new_control: "{{ item.new_control | default(omit) }}"
state: "{{ item.state | default('args_present') }}"
module_arguments: "{{ item.module_arguments | default(omit) }}"
loop: "{{ pam_settings + pam_settings_extra }}"
loop_control:
label: "{{ item.name | default('system-auth') }}:{{ item.state | default('args_present') }}: {{ item.new_type | default(item.type) | default('auth') }} {{ item.new_control | default(item.control) }} {{ item.new_module_path | default(item.module_path) | default('pam_unix.so') }} {{ item.module_arguments | default([]) | join(' ') }}"
- name: Set pam module configuration
community.general.pamd:
name: "{{ item.name | default('system-auth') }}"
type: "{{ item.type | default('auth') }}"
module_path: "{{ item.module_path | default('pam_unix.so') }}"
control: "{{ item.control }}"
new_type: "{{ item.new_type | default(omit) }}"
new_module_path: "{{ item.new_module_path | default(omit) }}"
new_control: "{{ item.new_control | default(omit) }}"
state: "{{ item.state | default('args_present') }}"
module_arguments: "{{ item.module_arguments | default(omit) }}"
loop: "{{ pam_settings + pam_settings_extra }}"
loop_control:
label: "{{ item.name | default('system-auth') }}:{{ item.state | default('args_present') }}: {{ item.new_type | default(item.type) | default('auth') }} {{ item.new_control | default(item.control) }} {{ item.new_module_path | default(item.module_path) | default('pam_unix.so') }} {{ item.module_arguments | default([]) | join(' ') }}"
- name: Auto-update items with state before/after
pamd:
name: "{{ item.name | default('system-auth') }}"
type: "{{ item.new_type }}"
module_path: "{{ item.new_module_path }}"
control: "{{ item.new_control }}"
state: updated
module_arguments: "{{ item.module_arguments | default(omit) }}"
loop: "{{ pam_settings + pam_settings_extra }}"
loop_control:
label: "{{ item.name | default('system-auth') }}:{{ item.state | default('args_present') }}: {{ item.new_type | default(item.type) | default('auth') }} {{ item.new_control | default(item.control) }} {{ item.new_module_path | default(item.module_path) | default('pam_unix.so') }} {{ item.module_arguments | default([]) | join(' ') }}"
when: item.state | default("args_present") == "before" or item.state | default("args_present") == "after"
become: True
become_user: root
- name: Auto-update items with state before/after
community.general.pamd:
name: "{{ item.name | default('system-auth') }}"
type: "{{ item.new_type }}"
module_path: "{{ item.new_module_path }}"
control: "{{ item.new_control }}"
state: updated
module_arguments: "{{ item.module_arguments | default(omit) }}"
loop: "{{ pam_settings + pam_settings_extra }}"
loop_control:
label: "{{ item.name | default('system-auth') }}:{{ item.state | default('args_present') }}: {{ item.new_type | default(item.type) | default('auth') }} {{ item.new_control | default(item.control) }} {{ item.new_module_path | default(item.module_path) | default('pam_unix.so') }} {{ item.module_arguments | default([]) | join(' ') }}"
when: item.state | default("args_present") == "before" or item.state | default("args_present") == "after"