I have the following playbook:
1 ---
2 - hosts: lxc_hosts
3 name: install software on lxc container
4 tasks:
5 - name: get list of containers on lxc host {{inventory_hostname}}
6 shell: >
7 lxc-ls | more | tr '\n' ',' | sed 's/,$//'
8 register: containers
9 - set_fact:
10 container_list: "{{ containers.stdout.split(',')|select('match', 'server*')|list }}"
11 - debug: msg="{{item}}"
12 with_items:
13 - "{{container_list}}"
14 - name: Run memory command within "running" container
15 lxc_container:
16 name: "{{item}}"
17 with_items:
18 - "{{container_list}}"
19 container_command: |
20 df -h
21 register: memory_check
22 - debug: msg="{{memory_check.stdout}}"
This returns the following results:
PLAY [install software on lxc container]
****************************************
TASK [setup]
*******************************************************************
ok: [10.1.1.1]
TASK [get list of containers on lxc host 10.1.1.1]
*************************
changed: [10.1.1.1]
TASK [set_fact]
****************************************************************
ok: [10.1.1.1]
TASK [debug]
*******************************************************************
ok: [10.1.1.1] => (item=server1-container) => {
"item": "server1-container",
"msg": "server1-container" }
ok: [10.1.1.1] => (item=server2-container) => {
"item": "server2-container",
"msg": "server2-container" }
ok: [10.1.1.1] => (item=server3-container) => {
"item": "server3-container",
"msg": "server3-container" }
TASK [Run memory command within "running" container]
***************************
fatal: [10.1.1.1]: FAILED! => {"failed": true, "msg": "'item' is undefined"}
NO MORE HOSTS LEFT
*************************************************************
to retry, use: --limit @playbooks/inventory_get_containers_on_lxc.retry
PLAY RECAP
*********************************************************************
10.1.1.1 : ok=4 changed=1 unreachable=0 failed=1
mymachine:/etc/ansible#
I've been playing around between set_fact and "vars" but I can't seem to get this going. As you can see, the debug statement on line 11 results in the list you see below... which seems to be work... and which seems to prove that I set the variable correctly. I'm not sure what else to try.
Thanks.
EDIT 1
This is what my code looks like for that specific section:
14 - name: Run memory command within "running" container
15 lxc_container:
16 name: "{{item}}"
17 with_items:
18 # - "{{ containers.stdout.split(',')|select('match', 'server*')|list }}"
19 - "{{container_list}}"
20 container_command: |
21 df -h
22 register: memory_check
23 - debug: msg="{{memory_check.stdout}}"
When I run it, i get the following error message:
ERROR! Syntax Error while loading YAML.
The error appears to have been in '/etc/ansible/playbooks/lxc_container_test.yml': line 20, column 7, but may be elsewhere in the file depending on the exact syntax problem.
The offending line appears to be:
- "{{container_list}}"
container_command: |
^ here
Line 20 is indented 2 spaces compared to the "with_items" line on line 17
Your playbook is incorrect in line 15-22 (specifically the indentation and the quotes), the correct form is:
lxc_container:
name: {{ item }}
container_command: |
df -h
register: memory_check
with_items: container_list
The Run memory command within "running" container
task has incorrect indentation.
with_items
and register
are both properties of the Ansible task, not properties of the lxc_container
module, so they should be indented inline with the Ansible task properties.
Original:
14 - name: Run memory command within "running" container
15 lxc_container:
16 name: "{{item}}"
# with_items is a Ansible Task property, so it shouldn't be here
17 with_items:
18 - "{{container_list}}"
19 container_command: |
20 df -h
# register is an Ansible Task property, so it shouldn't be here
21 register: memory_check
Corrected:
# Ansible task properties are intented at this level
14 - name: Run memory command within "running" container
17 with_items: "{{container_list}}"
15 lxc_container:
# lxc_container properties are indented at this level
16 name: "{{item}}"
19 container_command: |
20 df -h
21 register: memory_check
Here is the corrected code. You have define the variable correctly. set-fact
is used to define a global variable within the play. Only the indentation of with_items
was not correct. Now it should work
15 lxc_container:
16 name: "{{item}}"
17 with_items:
18 - "{{container_list}}"
19 container_command: |
20 df -h
21 register: memory_check
22 - debug: msg="{{memory_check.stdout}}"
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.