在Ansible
剧本中,是否有可能与以下等效?
- name: "Example"
command: "./create_user.sh create {{ item.key }} {{ item.value.pwd }}"
args:
chdir: "/usr/local/bin/"
with_dict: "{{ users }}"
when:
- verb == 'create'
- profile in item.value['env']
当前Ansible
出现错误,令人窒息:
失败! => {“ msg”:“条件检查'item.value ['env']中的配置文件失败。错误是:评估条件时出错(item.value ['env']中的配置文件):无法查找名称或访问模板字符串中的属性({%如果item.value ['env']中的配置文件为%,则为True {%else%},否则为{%endif%})。\ n请确保您的变量名不包含无效字符像'-':类型'StrictUndefined'的参数不可迭代\ n \ n错误似乎出在...
答案 0 :(得分:0)
您可以使用循环,并使用loop_control委托给包含的任务。例如:
main.yml
- name: "Example"
include_tasks: create-user.yml
loop: "{{ users }}"
loop_control:
loop_var: user
create-user.yml(这里 item 被别名为变量user
(如果需要,您甚至可以循环另一个变量)。
- name: create user
command: "./create_user.sh create {{ user.key }} {{ user.value.pwd }}"
args:
chdir: "/usr/local/bin/"
when:
- verb == 'create'
- profile in user.value['env']
我从来没有将这个结构与字典一起使用,但是它应该可以工作(也许稍作调整)。
答案 1 :(得分:0)
看来您的剧本中有一个简单的语法错误。您所指的是名为profile
的变量,但它不存在。如果要检查item.value['env']
中是否包含文字字符串“ profile”,则应这样编写:
- name: "Example"
command: "./create_user.sh create {{ item.key }} {{ item.value.pwd }}"
args:
chdir: "/usr/local/bin/"
with_dict: "{{ users }}"
when:
- verb == 'create'
- "'profile' in item.value['env']"
如果您尝试使用名为profile
的变量,则只需要确保先定义即可。例如,这本剧本正是您所遇到的问题,可以正确运行:
- hosts: localhost
gather_facts: false
vars:
users:
alice:
pwd: /home/alice
env: ""
verb: create
profile: ""
tasks:
- name: "Example"
command: "./create_user.sh create {{ item.key }} {{ item.value.pwd }}"
args:
chdir: "/usr/local/bin/"
with_dict: "{{ users }}"
when:
- verb == 'create'
- profile in item.value['env']