ansible剧本中声明变量的正确方法

ansible剧本中声明变量的正确方法,ansible,ansible-playbook,ansible-2.x,Ansible,Ansible Playbook,Ansible 2.x,我有以下剧本: 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

我有以下剧本:

  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}}"
这将返回以下结果:

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#
我一直在“实战”和“变形金刚”之间游手好闲,但我似乎没法继续下去。如您所见,第11行的debug语句将产生下面的列表。。。这似乎是工作。。。这似乎证明了我设置的变量是正确的。 我不知道还能尝试什么

谢谢

编辑1

这就是我的代码在该特定部分的外观:

 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}}"
当我运行它时,会收到以下错误消息:

错误!加载YAML时出现语法错误

错误似乎出现在“/etc/ansible/playbooks/lxc_container_test.yml”中:第20行第7列,但可能是 根据确切的语法问题,在文件中的其他位置

令人不快的一行似乎是:

    - "{{container_list}}"
  container_command: |
  ^ here

第20行与第17行的“带项目”行相比缩进了2个空格,这是更正的代码。您已正确定义变量。
set fact
用于定义游戏中的全局变量。只有带有_项的
缩进不正确。现在应该可以了

 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}}"

第15-22行中的剧本不正确(特别是缩进和引号),正确的形式是:

lxc_container:
  name: {{ item }}
  container_command: |
    df -h
  register: memory_check
  with_items: container_list

“running”容器中的
runmemory命令
任务的缩进不正确

with_items
register
都是Ansible任务的属性,而不是
lxc_容器
模块的属性,因此它们应该与Ansible任务属性内联缩进

原件:

 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

更正:

        # 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

你好我试过你的建议,但我遇到了语法错误。请参见编辑1有关更正的语法,请参见此处的答案:
注册
带项目
需要取消两个空格的缩进,以便将它们与
lxc\u容器
对齐。我试着编辑这篇文章,但是stackoverflow不允许4字符的空白编辑…而且{{item}}需要引号来防止它成为YAML字典,例如:name:“{{item}”