Ansible - 多重角色

时间:2017-03-22 09:22:04

标签: ansible ansible-role

我正在尝试使用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"]}'

3 个答案:

答案 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"]}'