[英]proper way to declare variable in ansible 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}}"
这将返回以下结果:
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#
我一直在set_fact和“ vars”之间玩耍,但似乎无法解决这个问题。 如您所见,第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
与第17行的“ with_items”行相比,第20行缩进了2个空格
您的剧本在15-22行中有误(特别是缩进和引号),正确的格式为:
lxc_container:
name: {{ item }}
container_command: |
df -h
register: memory_check
with_items: container_list
Run memory command within "running" container
任务中的Run memory command within "running" container
缩进不正确。
with_items
和register
都是Ansible任务的属性,而不是lxc_container
模块的属性,因此应与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
这是更正的代码。 您已经正确定义了变量。 set-fact
用于在剧本中定义全局变量。 仅with_items
的缩进不正确。 现在应该可以了
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}}"
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.