2016-09-14 2 views
1

그래서 나는 3 개의 호스트에서 플레이 북을 실행하고 싶습니다. 각 호스트는 3 개의 파일 (모두 같은 이름)이 필요합니다.Iniable에는 with_items와 호스트 변수를 동시에 사용할 수있는 방법이 있습니까?

파일이있을거야

  • lacpbond.100
  • lacpbond.200
  • lacpbond.300

각 파일은 기반으로 들어가는 고유 IP 주소를 가지고 vars/파일.

이 작업은> this-과 같은

- name: configure subinterface bonds 
 
    template: src="ifcfg-lacpbondsub.j2" dest=/etc/sysconfig/network-scripts/ifcfg-lacpbond.{{item.vlan}} 
 
    with_items: 
 
    - { vlan: "100" } 
 
    - { vlan: "200" } 
 
    - { vlan: "300" } 
 
    tags: 
 
    - bonding 
 

는 그래서 바르 온다 현재 이곳에 this->

server01: 
 
    loopbacks: 
 
     ipv4: "10.0.0.100" 
 
    SVIS: 
 
     100: 
 
     ipv4: "192.168.0.1" 
 
     prefix: "28" 
 
     200: 
 
     ipv4: "192.168.1.1" 
 
     prefix: "28" 
 
     300: 
 
     ipv4: "192.168.2.1" 
 
     prefix: "28"

처럼 보인다 문제. with_items와 vars를 동시에 사용하는 방법을 잘 모르겠습니다. 따라서 with_items를 사용하여 어떤 변수를 사용하지 않을지 결정할 수 있습니다.이 방법으로 게임의 복잡성을 크게 줄일 수 있습니다.

여기 템플릿 파일 ->

{% set host = interfaces[ansible_hostname] -%} 
 
{% set VLAN = item.vlan -%} 
 

 
DEVICE=lacpbond.{{item.vlan}} 
 
IPADDR={{host.SVIS.{{item.vlan}}.ipv4}} 
 
ONBOOT=yes 
 
BOOTPROTO=none 
 
VLAN=yes
그래서 사용하지 않는 경우 분명히 위의 작품은 {{}} 또 다른 내에서 {{}}. 그러나 당신은 내가 무엇을 시도하는지 볼 수 있습니다. 나는 item.X를 자체적으로 잘 사용할 수 있으며, vars/fine에서 아무 것도 사용할 수 있습니다. 하지만 host.SVIS [VLAN] .ipv4 ....

과 같은 작업을 수행하는 방법을 모르겠습니다. 그렇지 않으면 내가 3 템플릿과 3 작업이 필요합니다 .... 그리고 만약 내가 더 많은 파일을 필요로하는이 확장되지 않습니다 ....

+1

'{{host.SVIS ...',하지만 당신은 호스트를''인터페이스 [ansible_hostname]' '으로 설정하고 있기 때문에 혼란 스럽습니다. 그래서 그것은 사전이 아닌 문자열입니다. – larsks

+0

나는 그렇게 생각하지 않는다. 예를 들어 내 템플릿의 경우 단지 this-> ' '{{item.vlan}} 는 {{host.SVIS.100.ipv4는}}' 그것은 generate-합니다> '(100), 192.168 내가하려고하면 .0.1' 는하지만 하나가 '{{host.SVIS가 [item.vlan] .ipv4}} 는 {{인터페이스 [ansible_hostname] .SVIS [item.vlan] .ipv4}}' 가 실패 => { "failed": true, "item": { "vlan": "100"}, "with"-> '실패 : [server01] (item = {u'vlan ': u'100'}) msg ":"AnsibleUndefinedVariable : 'dict 객체'에는 속성이 없습니다. ''} onl y는 그 폴더에서 변수와 항목 변수를 결합하면 고장 .../vars에서 항목을 선택 with_items를 사용하려고 노력하고 –

답변

1

귀하의 질문에 조금 불분명하다 (나는 부분적으로 내

다음 줄이 작업을 수행합니다

IPADDR={{host.SVIS[item.vlan].ipv4}} 

말한다 신사 문서의 Variables 섹션을 참조하십시오 : 당신이 요구하는지 이해하는 경우 주석), 그러나, 당신은 단지 같은 것을 할 수있는 같은 것 :

01 2,339,

업데이트

당신은 그 오류 얻고있다 : 당신의 사전에서 키가 정수이기 때문에 ("AnsibleUndefinedVariable '딕셔너리 객체는'어떤 속성 u'100를 '이 없습니다")하지만 vlan의 값 with_items 루프의 키는 문자열입니다. 즉, host.SVIS[100]이 있지만 hosts.SVIS['100']이 존재하지 않습니다.

- hosts: localhost 
    vars: 
    interfaces: 
     server01: 
      loopbacks: 
      ipv4: "10.0.0.100" 
      SVIS: 
      100: 
       ipv4: "192.168.0.1" 
       prefix: "28" 
      200: 
       ipv4: "192.168.1.1" 
       prefix: "28" 
      300: 
       ipv4: "192.168.2.1" 
       prefix: "28" 
    ansible_hostname: server01 
    tasks: 
    - name: configure subinterface bonds 
     template: 
     src: "ifcfg-lacpbondsub.j2" 
     dest: ./ifcfg-lacpbond.{{item.vlan}} 
     with_items: 
     - { vlan: 100 } 
     - { vlan: 200 } 
     - { vlan: 300 } 
     tags: 
     - bonding 

그리고이 템플릿 :이 각본을 감안할 때

{% set host = interfaces[ansible_hostname] -%} 

DEVICE=lacpbond.{{item.vlan}} 
IPADDR={{host.SVIS[item.vlan].ipv4}} 
ONBOOT=yes 
BOOTPROTO=none 
VLAN=yes 
Raw 

나는 세 개의 파일을 얻을 :

$ ls ifcfg-lacpbond.* 
ifcfg-lacpbond.100 ifcfg-lacpbond.200 ifcfg-lacpbond.300 

각각의 내용은 보이는 뭔가 같은 :

DEVICE=lacpbond.100 
IPADDR=192.168.0.1 
ONBOOT=yes 
BOOTPROTO=none 
VLAN=yes 
+0

시도하고 작동하지 않습니다 :(위의 귀하의 의견에 내 코멘트 응답을보세요 –

+0

내 업데이 트를 참조하십시오 이것은 오류의 원인을 설명합니다. – larsks

+0

정말 고마워요. 하위 변수가있는 yml 형식이 있기 때문에 숫자가 문자열이라고 생각합니다. 나는 바보 같아 보입니다. –