I am trying parse month,day and year from show clock output using regex_search, getting error.
from cli of a router i see this -
sh clock
16:22:12.975 PST Wed Jan 27 2021
- name: Run sh log
cisco.ios.ios_command:
commands:
- sh clock
register: output1
- name: sh clock output
debug:
msg: "{{ output1.stdout_lines | regex_search('(Jan(uary)?|Feb(ruary)?|Mar(ch)?|Apr(il)?|May|Jun(e)?|Jul(y)?|Aug(ust)?|Sep(tember)?|Oct(ober)?|Nov(ember)?|Dec(ember)?)^\s+\d{1,2}\s+\d{4}' }}"
error
The offending line appears to be:
debug:
msg: "{{ output1.stdout_lines | regex_search('(Jan(uary)?|Feb(ruary)?|Mar(ch)?|Apr(il)?|May|Jun(e)?|Jul(y)?|Aug(ust)?|Sep(tember)?|Oct(ober)?|Nov(ember)?|Dec(ember)?)\s+\d{1,2}\s+\d{4}' }}"
^ here
We could be wrong, but this one looks like it might be an issue with
missing quotes. Always quote template expression brackets when they
start a value. For instance:
with_items:
- {{ foo }}
Should be written as:
with_items:
- "{{ foo }}"
desired/wanted debug msg is below ,i don't want time, just need month day and year
Jan 27 2021
Use regex_replace. Put the regex into a separate single-quoted variable. For example, the task below does the job
- name: sh clock output
debug:
msg: "{{ output1.stdout_lines|regex_replace(my_regex, my_replace) }}"
vars:
my_regex: '^(.*)(Jan(uary)?|Feb(ruary)?|Mar(ch)?|Apr(il)?|May|Jun(e)?|Jul(y)?|Aug(ust)?|Sep(tember)?|Oct(ober)?|Nov(ember)?|Dec(ember)?)\s+(\d{1,2})\s+(\d{4})$'
my_replace: '\2 \14 \15'
The splitting is simpler. For example, the task below gives the same result
- debug:
msg: "{{ arr[-3] }} {{ arr[-2] }} {{ arr[-1] }}"
vars:
arr: "{{ output1.stdout_lines.split() }}"
See Handling dates and times
Related
I want to apply filter to the following log file. But I keep missing something
task.yml
- ansible_loop_var: item
changed: false
failed: true
invocation:
module_args:
policy_package: Package1
version: null
wait_for_task: true
wait_for_task_timeout: 30
item: PackageItem1
msg: Task Verify policy operation with task id 01234567-89ab-cdef-a422-xxxxxxxxx
failed. Look at the logs for more details
- ansible_loop_var: item
changed: false
failed: true
invocation:
module_args:
policy_package: Package2
version: null
wait_for_task: true
wait_for_task_timeout: 30
item: PackageItem2
msg: Task Verify policy operation with task id 01234567-89ab-cdef-a6c4-xxxxxxxx
failed. Look at the logs for more details
Here is my playbook
filter.yml
---
- name: sftp-domain
hosts: check_point
connection: httpapi
gather_facts: False
vars_files:
- 'credentials/my_var.yml'
- 'credentials/login.yml'
tasks:
- name: set-details
set_fact:
filter: "{{ lookup('file', 'tmp/task.yml') }}"
- name: create list to loop through
set_fact:
new_list: "{{ filter | map(attribute='msg') | flatten }}"
- name: copy-file-to-log
local_action:
module: copy
content: "{{ new_list | to_nice_yaml }}"
dest: tmp/task2.yml
I get an error message saying
PLAY [sftp-domain] *******************************************************************************************************************************************
TASK [set-details] *******************************************************************************************************************************************
ok: [checkpoint]
TASK [create list to loop through] ***************************************************************************************************************************
fatal: [checkpoint]: FAILED! => {"msg": "The task includes an option with an undefined variable. The error was: 'unicode object' has no attribute 'msg'\n\nThe error appears to be in '/home/tdeveu0/project/fwp_automation/filter.yml': line 15, column 5, but may\nbe elsewhere in the file depending on the exact syntax problem.\n\nThe offending line appears to be:\n\n\n - name: create list to loop through\n ^ here\n"}
Here is actually the result I want after applying filter
- msg: Task Verify policy operation with task id 01234567-89ab-cdef-a6c4-xxxxxxxx
failed. Look at the logs for more details
- msg: Task Verify policy operation with task id 01234567-89ab-cdef-a422-xxxxxxxxx
failed. Look at the logs for more details
I want to get only the list of all the 'msg'
Use the filter from_yaml
- name: set-details
set_fact:
filter: "{{ lookup('file', 'tmp/task.yml')|from_yaml }}"
Let's take a simplified file to show the problem, e.g.
shell> cat task.yml
- a: 1
b: 2
- a: 3
b: 4
When you read the file into the variable the result is AnsibleUnsafeText, not a list
- set_fact:
filter: "{{ lookup('file', 'task.yml') }}"
- debug:
msg: "{{ filter|type_debug }}"
- debug:
var: filter.0
gives
msg: AnsibleUnsafeText
filter.0: '-'
The first item of the text is the dash '-'.
Use filter from_yaml to get the list
- set_fact:
filter: "{{ lookup('file', 'task.yml')|from_yaml }}"
- debug:
msg: "{{ filter|type_debug }}"
- debug:
var: filter.0
gives
msg: list
filter.0:
a: 1
b: 2
I need some help with extracting a specific line from a file and then extracting a column, assign it to a variable and then use that variable in the next task.
I have the file with this format on the confluent broker server
Save the key. It cannot be retrieved later.
+------------+----------------------------------------------+
| Enc Key | omykeyvaluecontinuousstringgoeshereandmakelong= |
+------------+----------------------------------------------+
I am trying to write Ansible task that will read the third line and then extract the key into a variable which I need to export as an environment variable in the task. In the next task I will be executing a confluent command as a shell command.
I tried something like below, but it doesn't work - I get error
vars:
ansible_ssh_extra_args: "-o StrictHostKeyChecking=no"
ansible_host_key_checking: false
contents: "{{ lookup('file', '/etc/kafka/info.txt') }}"
contents2: "{{ lookup('file', '/etc/kafka/info.txt').splitlines() }}"
- name: set fact
set_fact:
extract_key: "{{ contents.split('\n')[2] }}"
- name: Display output
debug: msg="{{ extract_key }}"
And then extract the key value from extract_key variable
How can I achieve this?
Thank you
The task below does the job
- set_fact:
extract_key: "{{ contents.split('\n').2.split('|').2|trim }}"
gives
extract_key: omykeyvaluecontinuousstringgoeshereandmakelong=
You can use this filter if only text lines are fixed:
- name: capturing Key
shell: echo {{ contents }} | head -3 | tail -1 | sed 's/|/\n/g' | sed -n 3p
register: extract_key
- name: Display output
debug: msg="{{ extract_key.stdout }}"
This returns omykeyvaluecontinuousstringgoeshereandmakelong=
I have this snipped of code from our playbook:
- name: Set version
set_fact:
my_version: "My version is {{ my_file.stdout | regex_search('[0-9\.]+') }}"
... where my_file is 'program_1.2.3_install.exe'
It returns that the filter regex_search does not exist.
We are running Ansible 2.0.0.2
Does anybody know how to make this regex work?
Thanks!
Given the variable
my_file: 'program_1.2.3_install.exe'
The task
- set_fact:
my_version: "{{ my_file|regex_replace(myregex, myreplace) }}"
vars:
myregex: '^(.*?)([0-9\.]+)(.*)$'
myreplace: '\2'
- debug:
var: my_version
gives
"my_version": "1.2.3"
It's also possible to use split(). The task below gives the same result
- set_fact:
my_version: "{{ my_file.split('_').1 }}"
- debug:
var: my_version
I am trying to match the "OK" from the following output with regex and store it in a varible:
System 'server.mylabserver.com'
status OK
monitoring status Monitored
monitoring mode active
on reboot start
load average [0.00] [0.01] [0.05]
cpu 0.1%us 0.1%sy 0.0%wa
memory usage 367.9 MB [20.0%]
swap usage 0 B [0.0%]
uptime 2h 10m
boot time Mon, 02 Apr 2018 06:51:01
data collected Mon, 02 Apr 2018 09:01:02
Ansible code with "regex_replace" that I've tried:
- name: Fetch the monit status
shell: "monit status | tail -n +3"
register: monit_status_raw
tags: basic_monitoring
- name: Extract monit variables
set_fact:
vmstatus: "{{ monit_status_raw | regex_replace('^\s\s([a-z]*)\s+', '\\1:')}}"
Error:
The offending line appears to be:
set_fact:
vmstatus: "{{ monit_status_raw | regex_replace('^\s\s([a-z]*)\s+', '\\1')}}"
^ here
We could be wrong, but this one looks like it might be an issue with
missing quotes. Always quote template expression brackets when they
start a value. For instance:
with_items:
- {{ foo }}
Should be written as:
with_items:
- "{{ foo }}"
Ansible code with "regex_search" that I've tried:
- name: Fetch the monit status
shell: "monit status | tail -n +3"
register: monit_status_raw
- name: Extract monit variables
set_fact:
vmstatus: "{{ monit_status_raw | regex_search('^\s\sstatus\s+(.*)$') }}"
Error:
The offending line appears to be:
set_fact:
vmstatus: "{{ monit_status_raw | regex_search('^\s\sstatus\s+(.*)$') }}"
^ here
We could be wrong, but this one looks like it might be an issue with
missing quotes. Always quote template expression brackets when they
start a value. For instance:
with_items:
- {{ foo }}
Should be written as:
with_items:
- "{{ foo }}"
Any idea what it's wrong in the regexes?
Thank you,
Dan
I think if you'd like to use regexp_search - you need to give a string and think about escaping characters, and then you need to use some construction as:
with_items
- "{{ monit_status_raw.stdout_lines }}"
But I think it will be simpler:
- name: Fetch the monit status
shell: 'monit status | tail -n +2 | grep "^\s*status" '
register: monit_status_raw
- set_fact:
vmstatus: "{{ monit_status_raw.stdout.split('status')[1]| replace(' ','')}}"
You will get vmstatus = 'Ok', if you use your sample.
My problem is with ansible and parsing stdout. I need to capture the stdout from an ansible play and parse this output for a specific substring within stdout and save into a var. My specific use case is below
- shell: "vault.sh --keystore EAP_HOME/vault/vault.keystore |
--keystore-password vault22 --alias vault --vault-block |
vb --attribute password --sec-attr 0penS3sam3 --enc-dir |
EAP_HOME/vault/ --iteration 120 --salt 1234abcd"
register: results
become: true
This generates an output with the following line, the goal is to capture the masked key that jboss vault generates and save that in an ansible var so I can use it to configure the standalone.xml template:
vault-option name="KEYSTORE_PASSWORD" value="MASK-5dOaAVafCSd"/>
I need a way parse this string with possibly regex and save the "MASK-5dOaAVafCSd" substring into an ansible var using set_facts module or any other ansible module.
Currently my code looks like this
#example stdout
results: vault-option name=\"KEYSTORE_PASSWORD\" value=\"MASK-5dOaAVafCSd\"/>
- name: JBOSS_VAULT:define keystore password masked value variable
set_fact:
masked_value: |
"{{ results.stdout |
regex_replace('^.+(MASK-.+?)\\.+','\\\1') }}"
This code is defining masked_value as the results.stdout, not the expected capture group.
You are very close. I advice you to use regex101.com to test regular expressions.
Here is my solution:
---
- hosts: localhost
gather_facts: no
tasks:
- shell: echo 'vault-option name="KEYSTORE_PASSWORD" value="MASK-5dOaAVafCSd"'
register: results
- set_fact:
myvalue: "{{ results.stdout | regex_search(regexp,'\\1') }}"
vars:
regexp: 'value=\"([^"]+)'
- debug:
var: myvalue
result:
ok: [localhost] => {
"myvalue": [
"MASK-5dOaAVafCSd"
]
}
Update:
regex_search returns a list of found matches, so to get only first one use:
{{ results.stdout | regex_search(regexp,'\\1') | first }}
The above solution worked for me, however I had to do some extra logic to filter shell command output to get to the line which contains following
<vault-option name="KEYSTORE_PASSWORD" value="MASK-6qcNdkIprlA"/>
because vault command output has many lines in it. Once this line is captured, the solution given by Konstantin works just fine. Below is the whole thing that needs to done in one place.
- name: Creating jboss vault
shell: |
{{ baseDir }}/bin/vault.sh -e {{ vaultDir }} -k {{ keystoreURL }} -p {{ keystorePassword }} \
-s {{ keystoreSalt }} -i {{ iterationCount }} -v {{ keystoreAlias }} -b {{ vaultBlock }} \
-a {{ attributeName }} -x {{ attributeValue }}
register: vaultResult
- set_fact:
jbossKeystorePassword: "{{ item | regex_search('value=\"([^\"]+)','\\1') | first }}"
when: item | trim | match('.*KEYSTORE_PASSWORD.*')
with_items:
- "{{ vaultResult.stdout_lines }}"
- debug:
var: jbossKeystorePassword
Be sure to replace all variables with your values in above vault.sh command.