我正在尝试使用with_items
命令运行多个角色,但是我收到错误:
“ERROR!'item'未定义”
role.yml
:
---
- hosts: '{{ host }}'
become: yes
roles:
- role: "{{item}}"
with_items: "{{ roles }}"
这是我的命令:
ansible-playbook -i ./inventory/Dev ./playbooks/role.yml --extra-vars='{"host": "db", "roles": ["mysql", "apache"]}'
答案 0 :(得分:1)
你不能这样做。 import {NgModule} from '@angular/core';
import {BrowserModule} from '@angular/platform-browser';
import {UIView, UIRouterModule} from 'ui-router-ng2';
import {HttpModule} from '@angular/http';
import {MainComponent} from './main';
import {HeaderComponent} from './header';
import {TitleComponent} from './title';
import {FooterComponent} from './footer';
@NgModule({
imports: [
BrowserModule,
UIRouterModule.forRoot({states: STATES, configClass: MyUIRouterConfig}),
HttpModule
],
declarations: [
MainComponent,
HeaderComponent,
TitleComponent,
FooterComponent
],
bootstrap: [UIView]
})
export class AppModule {}
循环对角色无效。
如果有的话,您需要为with_
指令提供一个角色列表,因此语法与主机组列表roles:
类似。问题是:Ansible不解析角色的变量,因此hosts: '{{ host }}'
不起作用。
但是,您可以使用include_role module来访问变量。
不,include_role模块也不会将roles: '{{ roles }}'
中的{{ item }}
作为with_items
的值。
因此,我能想到的唯一解决方法(假设您不想事先处理JSON)是静态包含角色:
name
无论如何,角色必须存在于控制机器上,因此它们的所有名称都是预定义的。
答案 1 :(得分:0)
您不能在角色指令中使用with_循环。 一个简单的解决方案是使用如下所示的常规Yaml列表:
---
- hosts: '{{ host }}'
become: yes
roles:
- myrole1
- myrole2
另一个示例,您可以在其中声明角色并将相应的变量传递给角色,如下所示:
---
- hosts: '{{ host }}'
become: yes
roles:
- role:
name: myrole1
vars:
host: "db1"
myroles:
- mysql1
- apache1
- role:
name: myrole2
vars:
host: "db2"
myroles:
- mysql2
- apache2
还避免使用ansible关键字作为变量名 最后,运行您的剧本的命令如下:
ansible-playbook -i ./inventory/Dev ./playbooks/role.yml
答案 2 :(得分:-2)
{{item}}
是您尚未定义的变量。您需要使用已经用于' host'的extra-vars参数来定义您可以执行的操作。和'角色'
e.g。
ansible-playbook -i ./inventory/Dev ./playbooks/role.yml --extra-vars='{"item": "something", "host": "db", "roles": ["mysql", "apache"]}'