简体   繁体   中英

proper way to declare variable in ansible playbook

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM