ansible task inside role not getting skipped [travis] - ansible

So I have my directory structure roughly like this
$ tree
.
├── ansible.cfg
├── play.yml
├── roles
│   ├── create_new_user
│   │   ├── defaults
│   │   │   └── main.yml
│   │   └── tasks
│   │   └── main.yml
│   ├── update
│   │   └── tasks
│   │   └── main.yml
└── tests
├── inventory
└── test.yml
Inside my .travis.yml file
---
sudo: required
dist: trusty
language: python
python: "2.7"
# Doc: https://docs.travis-ci.com/user/customizing-the-build#Build-Matrix
env:
- ANSIBLE_VERSION=2.0.0.0
- ANSIBLE_VERSION=1.9.6
- USER=tasdik
install:
- if [ "$ANSIBLE_VERSION" = "latest" ]; then pip install ansible; else pip install ansible==$ANSIBLE_VERSION; fi
- if [ "$ANSIBLE_VERSION" = "latest" ]; then pip install ansible-lint; fi
script:
- ansible-playbook -i tests/inventory tests/test.yml --syntax-check
- ansible-playbook -i tests/inventory tests/test.yml -vvvv --skip-tags "update, copy_host_ssh_id"
# check is the user is created or not
- id -u $USER | grep -q "no" && (echo "user not found" && exit 1) || (echo "user found" && exit 0)
I am trying to skip a task inside the role which is inside roles/create_new_user/tasks/main.yml
But the task is not getting skipped. The role in question
---
- name: Copy .ssh/id_rsa from host box to the remote box for user {{ username }}
become: true
copy:
src: ~/.ssh/id_rsa.pub
dest: /home/{{ username }}/.ssh/authorized_keys
mode: 0600
owner: "{{ username }}"
group: "{{ username }}"
tags:
- copy_host_ssh_id
Contents of tests/test.yml
---
- hosts: localhost
connection: local
become: true
roles:
- {role: ../roles/update}
- {role: ../roles/create_new_user}
Travis build
https://travis-ci.org/prodicus/ansible-bootstrap-server/
DOCS:
http://docs.ansible.com/ansible/playbooks_tags.html#tags

Remove space in tags enumeration string (quotes also unnecessary because you have no spaces) :
--skip-tags update,copy_host_ssh_id

Related

Ansible copy module inside a role

I have an Ansible role that will provision an ubuntu server in Azure. The VM provisioning is working fine for me but I need to copy few files from my localhost to this VM how can I do this?
├── defaults
│   └── main.yml
├── files
│   ├── cloud-init.yaml
│   └── files.txt
├── handlers
│   └── main.yml
├── meta
│   └── main.yml
├── tasks
│   ├── copyfile.yaml
│   ├── main.yml
│   ├── apachenic.yaml
│   └── apachevm.yaml
└── vars
└── main.yml
Here I have kept the file files.txt (the file I want to copy) in file folder and created a new task file (copyfile.yaml) for copying. Adding content of copy tasks below.
- name: copy certs
become: true
become_user: admin
ansible_sudo_password: pass123
copy:
src: files.txt
dest: /home/admin/
owner: admin
group: admin
I have tried multiple times re-arranging and creating a new task file getting the below error message.
ERROR! conflicting action statements: copy, ansible_sudo_password
for me looks like your YAML is malformed.
try this: (top level play, lets say, its copyFilesTXT.yml )
- hosts: all
become: true
become_user: admin
become_method: sudo
tasks:
- name: copy files.txt file to remote machine
copy:
src: files.txt
dest: /home/admin/
owner: admin
group: admin
mode: 0644
this task can be started by this console invocation
/bin/ansible-playbook --ask-become-pass -i hosts.ini copyFilesTXT.yml -vv
it will ask for sudo password from STDIN, so you can provide it.
Also, you can omit --ask-become-pass and add this variable in vars/main.yml
ansible_become_pass: pass123
so, sudo password will be loaded from vars/main.yml

How to change "parse_cli_textfsm" to reference template folder in role folder in Ansible?

GOAL
I want to create a portable role folder that utilizes textfsm templates in role directory.
Directory structure
$ tree
.
├── ansible.cfg
├── hosts.ini
├── out_pb1
├── pb1.yml
├── roles
│   ├── command_facts
│   │   ├── tasks
│   │   │   └── main.yml
│   │   ├── templates
│   │   │   └── textfsm // I want this
│   │   └── vars
└── templates
   └── textfsm // created for testing
PROBLEM
parse_cli_textfsm is referencing to templates/textfsm instead of roles/command_facts/templates/textfsm
The goal is portability so specifying full path is not considered.
ATTEMPTS TO FIX (FAIL)
Executes pb1.yml
Error shown as below if I deleted templates/textfsm in the pb1.yml directory.
$ ansible-playbook pb1.yml -u username -k
(omitted)
TASK [command_facts : set_fact]
fatal: [target]: FAILED! => {"msg": "unable to locate parse_cli_textfsm template: /templates/textfsm"}
I tried to utilize system variable role_path that is {{ raw_output.stdout | parse_cli_textfsm('{{ role_path }}/templates/textfsm') }} but it is not working. {{ role_path }} turns into a normal string.
$ ansible-playbook pb1.yml -u username -k
(omitted)
TASK [ixrs_facts : set_fact]
fatal: [target]: FAILED! => {"msg": "unable to locate parse_cli_textfsm template: {{ role_path }}/templates/textfsm"}
FILES
roles/command_facts/task/main.yml
---
- name: show protocols all
raw: "show protocols all"
register: raw_output
- set_fact:
output: {{ raw_output.stdout | parse_cli_textfsm("/templates/textfsm") }}
- debug: var=output[::]
pb1.yml
---
- name: testing
hosts: target
gather_facts: false
roles:
- { role: command_facts }
REFERENCE
https://docs.ansible.com/ansible/latest/user_guide/playbooks_filters.html#network-cli-filters
{{ output.stdout[0] | parse_cli_textfsm('path/to/fsm') }}
parse_cli_textfsm('{{ role_path +“/templates/textfsm“) }}
Works for me...
Hth

ansible-playbook: Unable to find subdir in expected paths with fileglob

I try to copy files from roles/common/files with fileglob, but ansible-playbook searchs them in roles/common/tasks/files
Using Roles documentation says:
Any copy, script, template or include tasks (in the role) can
reference files in roles/x/{files,templates,tasks}/ (dir depends on
task) without having to path them relatively or absolutely.
Playbook:
# ./ansible/roles/common/tasks/main.yml
- hosts: localhost
connection: local
gather_facts: no
tasks:
- name: setup bashrc
import_tasks: bashrc.yml
Task:
# ./ansible/roles/common/tasks/bashrc.yml
- name: try to find bashrc libs in roles/common/files/bashrc
copy:
src: "{{ item }}"
dest: /tmp
with_fileglob:
- bashrc/*.lib.sh
# Causes the same error:
# loop: "{{ lookup('fileglob', 'bashrc/*', wantlist=True) }}"
Files tree:
.
├── ansible
│   └── roles
│   └── common
│   ├── files
│   │   └── bashrc
│   │   ├── shell-aliases.lib.sh
│   │   ├── shell-functions.lib.sh
│   │   └── shell-settings.lib.sh
│   └── tasks
│   ├── bashrc.yml
│   ├── main.retry
│   └── main.yml
Run playbook:
$ ansible-playbook -vvvvv ./ansible/roles/common/tasks/main.yml
...
TASK [try to find bashrc libs in roles/common/files/bashrc] *******...
task path: /home/<user>/git/homedirsync/ansible/roles/common/tasks/bashrc.yml:1
looking for "bashrc" at "/home/<user>/git/homedirsync/ansible/roles/common/tasks/files/bashrc"
looking for "bashrc" at "/home/<user>/git/homedirsync/ansible/roles/common/tasks/bashrc"
looking for "bashrc" at "/home/<user>/git/homedirsync/ansible/roles/common/tasks/files/bashrc"
looking for "bashrc" at "/home/<user>/git/homedirsync/ansible/roles/common/tasks/bashrc"
[WARNING]: Unable to find 'bashrc' in expected paths
...
Ansible version:
ansible 2.6.1
config file = /home/<user>/.ansible.cfg
configured module search path = [u'/var/ansible/library']
ansible python module location = /usr/local/lib/python2.7/dist-packages/ansible
executable location = /usr/local/bin/ansible
python version = 2.7.6 (default, Nov 13 2018, 12:45:42) [GCC 4.8.4]
I saw a lot of examples where it works and issues where it doesn't, but I can't localize the root of problem in my case. Community, please help.
Q: "Unable to find subdir in expected paths with fileglob"
A: Quoting from fileglob's NOTES
"Matching is against local system files on the Ansible controller. "
Role's feature "Any copy, script, template or include tasks can reference files in roles/x/{files,templates,tasks} ..." does not apply to fileglob.
Instead, it's possible to use special variables. For example
with_fileglob:
- '{{ role_path }}/files/bashrc/*.lib.sh'

Ansible Custom Role (with custom command module)

I am trying to implement a custom network command module as an Ansible role. This module will run commands on remote devices.
Ansible connection type is network_cli
Created the role by using below command
ansible-galaxy init --type=network test-command-mod
which gave me below default directory structure
roles
└── test-command-mod
├── cliconf_plugins
│   ├── myos.py (my file)
├── defaults
│   └── main.yml
├── files
├── library
│   ├── __init__.py
│   └── myos_command.py (my file - the command module)
├── meta
│   └── main.yml
├── module_utils
│   └── myos.py (my file)
├── README.md
├── tasks
│   ├── execute-commands.yml ( a test task to run commands )
│   └── main.yml
├── templates
├── terminal_plugins
│   ├── myos.py (my file - emulating the myos terminal)
├── tests
│   ├── inventory
│   └── test.yml
└── vars
└── main.yml
Below it is how used in an Ansible playbook
- hosts: my_os_cli
gather_facts: False
roles:
- role: test-command-mod
tasks:
- name: run some commands on the device
myos_command:
commands:
- command: 'show version'
- command: 'show ntp status'
vars:
ansible_connection: network_cli
ansible_network_os: myos
When using from a role, it fails with below message
The full traceback is:
Traceback (most recent call last):
File "/ansible/bin/ansible-connection", line 102, in start
self.connection._connect()
File "/ansible/lib/ansible/plugins/connection/network_cli.py", line 338, in _connect
raise AnsibleConnectionFailure('network os %s is not supported' % self._network_os)
AnsibleConnectionFailure: network os myos is not supported
When running Ansible in debug mode, saw below in the log
unable to load cliconf for network_os myos
Moreover, it is trying to look for plugins/cliconf/myos.py under default Ansible location instead of the my Ansible role (test-command-mod).
I expect it to look in roles/test-command-mod/cliconf_plugins/myos.py
Is this a bug or by design?
Also, role works if
ansible.cfg is updated with
cliconf_plugins = ./roles/test-command-mod/cliconf_plugins
terminal_plugins = ./roles/test-command-mod/terminal_plugins
OR set the below environment variables
export ANSIBLE_TERMINAL_PLUGINS=./roles/test-command-mod/terminal_plugins
export ANSIBLE_CLICONF_PLUGINS=./roles/test-command-mod/cliconf_plugins
OR if copy files (my file); to their respective directories in ansible installation.
Thoughts please?
EDIT: ansible.cfg as follows
[defaults]
# after suggestion
#cliconf_plugins = cliconf_plugins:./roles/test-command-mod/cliconf_plugins
#terminal_plugins = terminal_plugins:../roles/test-command-mod/terminal_plugins
# before suggestion
cliconf_plugins = ./roles/test-command-mod/cliconf_plugins
terminal_plugins = ./roles/test-command-mod/terminal_plugins
[paramiko_connection]
look_for_keys = False
We have the exact same issue and we have been investigating for a week.
We tried the same things as you did with the same results.
The solution we came up with is to use the install.yml in the tasks directory in order to add the terminal and cliconf into their respectives system install directories.
---
- block:
- name: Create terminal target directory
file:
path: /usr/share/ansible/plugins/terminal/
state: directory
mode: 0755
connection: local
- name: install terminal plugin
copy:
src: terminal_plugins/myos.py
dest: /usr/share/ansible/plugins/terminal/myos.py
connection: local
- name: Create cliconf target directory
file:
path: /usr/share/ansible/plugins/cliconf/
state: directory
mode: 0755
connection: local
- name: install cliconf plugin
copy:
src: cliconf_plugins/myos.py
dest: /usr/share/ansible/plugins/cliconf/myos.py
connection: local
run_once: true
You may then add a call to install.yml in main.yml so that it executes the copy when you use the role:
---
- name: install/update driver
include: install.yml
Regards,
Stopostit

Including sub-roles in ansible playbook?

I have a ansible role that requires other roles, but is not loading correctly from my playbook. My role is here, Jenkins Role, it has dependencies on two other geerlingguy roles, which are listed here
meta/main.yml
galaxy_info:
author: Jd Daniel
description: Jenkins installer
company: GE Health
min_ansible_version: 2.2
role_name: jenkins
license: GPLv3
platforms:
- name: EL
versions:
- 7
galaxy_tags:
- jenkins
- deployment
- continuous-deployment
- cd
dependencies:
- { role: geerlingguy.repo-epel }
- { role: geerlingguy.jenkins, jenkins_plugins: [] }
My roles ansible.cfg in this role also points to the roles/ directory
[defaults]
# without this, the connection to a new instance is interactive
host_key_checking = False
roles_path = roles/
and the roles are downloaded into the roles/ folder
┌─[10:25:24]─[ehime#GC02WW38KHTD6E]─[~/Repositories/Infra/Ansible/ansible-role-jenkins]
└──> tree -L 2
.
├── [ehime 34K] LICENSE
├── [ehime 1.3K] README.md
├── [ehime 128] ansible.cfg
├── [ehime 96] defaults
│   └── [ehime 32] main.yml
├── [ehime 96] files
│   └── [ehime 633] job.xml
├── [ehime 96] handlers
│   └── [ehime 33] main.yml
├── [ehime 96] meta
│   └── [ehime 417] main.yml
├── [ehime 160] roles
│   ├── [ehime 384] geerlingguy.java
│   ├── [ehime 416] geerlingguy.jenkins
│   └── [ehime 320] geerlingguy.repo-epel
├── [ehime 96] tasks
│   └── [ehime 737] main.yml
├── [ehime 352] tests
│   ├── [ehime 669] README.md
│   ├── [ehime 276] Vagrantfile
│   ├── [ehime 121] ansible.cfg
│   ├── [ehime 203] inventory
│   ├── [ehime 221] requirements.yml
│   ├── [ehime 96] roles
│   ├── [ehime 10] test_7_default.retry
│   └── [ehime 182] test_7_default.yml
└── [ehime 96] vars
└── [ehime 91] main.yml
My tasks should be pulling these in then? right?
tasks/main.yml
---
- name: Install required roles
include_role:
name: "{{ roles }}"
vars:
roles:
- geerlingguy.epel-repo
- geerlingguy.jenkins
.... other tasks ....
When running my playbook though...
jenkins.yml
#
# Ansible to provision Jenkins on remote host
#
- name: Install Jenkins and its plugins
hosts: all
become: yes
become_method: sudo
gather_facts: yes
vars:
jenkins_hostname: localhost
jenkins_http_port: 8080
roles:
- ehime.jenkins
pre_tasks:
- name: CA-Certificates update command line execution
command: /bin/update-ca-trust
tasks:
- name: Set up pipeline
jenkins_job:
config: "{{ lookup('file', 'files/job.xml') }}"
name: test-auto
user: "{{ jenkins_admin_username }}"
password: "{{ jenkins_admin_password }}"
When trying to run the following playbook though
#
# Ansible to provision Jenkins on remote host
#
- name: Install Jenkins and its plugins
hosts: all
become: yes
become_method: sudo
gather_facts: yes
vars:
jenkins_hostname: localhost
jenkins_http_port: 8080
roles:
- ehime.jenkins
pre_tasks:
- name: CA-Certificates update command line execution
command: /bin/update-ca-trust
tasks:
- name: Set up pipeline
jenkins_job:
config: "{{ lookup('file', 'files/job.xml') }}"
name: test-auto
user: "{{ jenkins_admin_username }}"
password: "{{ jenkins_admin_password }}"
With my playbooks config...
ansible.cfg
[defaults]
# without this, the connection to a new instance is interactive
host_key_checking = False
roles_path = roles/
remote_user = ec2-user
private_key_file = ../_keys/test-jenkins
I get the following error....
error
TASK [include_role : {{ roles }}] ************************************************************************************************************************************************************************************************************
ERROR! Invalid role definition: [u'geerlingguy.epel-repo', u'geerlingguy.jenkins']
It's evidently NOT seeing the roles in roles/ehime.jenkins/roles but I'm not sure how to get those working. It also seem like it ignores my meta/main.yml for a galaxy install? Should these be in the requirements.yml?
Like an idiot, I had my dependencies tabbed in too far...
galaxy_info:
author: Jd Daniel
description: Jenkins installer
company: GE Health
min_ansible_version: 2.2
role_name: jenkins
license: GPLv3
platforms:
- name: EL
versions:
- 7
galaxy_tags:
- jenkins
- deployment
- continuous-deployment
- cd
# Issue is here....
dependencies:
- { role: geerlingguy.repo-epel }
- { role: geerlingguy.jenkins, jenkins_plugins: [] }
should have been
galaxy_info:
author: Jd Daniel
description: Jenkins installer
company: GE Health
min_ansible_version: 2.2
role_name: jenkins
license: GPLv3
platforms:
- name: EL
versions:
- 7
galaxy_tags:
- jenkins
- deployment
- continuous-deployment
- cd
# Issue is here....
dependencies:
- { role: geerlingguy.repo-epel }
- { role: geerlingguy.jenkins, jenkins_plugins: [] }

Resources