2017-09-18 1 views
0

구문 분석 된 인수를 기반으로 libvirt 손님을 생성 할 수있는 가능성있는 플레이 북이 있습니다. 나는 플레시 북을 추가 인수로 확장하려고하는데, 이는 손님 OS를 specidied 가상 네트워크에 연결하고 파일에 작성된 사용자 정의 mac 주소를 할당 할 수있게 해줍니다.조건부 및 레지스터 stdoutput이있는 복잡한 루프 루프

플레이 북은 다음과 같이 호출한다 :

:

ansible-playbook -e "CPU=2 MEMORY=1024 VM_STORAGE=/tmp/zz VM_NAME=desktop5 VM_NETWORK=bridge,Isolated2" vm.yml

마지막 단계의 하나로서 내가 네트워크 카드를 작성하고 다음과 같은 형식의 파일에 정의 된 특정 MAC 주소를 사용했다

#NAT#52:54:00:aa:aa:01#desktop1 
#bridge#52:54:00:aa:bb:01#desktop1 
#Isolated1#52:54:00:aa:cc:01#desktop1 
#Isolated2#52:54:00:aa:dd:01#desktop1 

지정된 추가 인수 인 -e VM_NETWORK을 기반으로 네트워크 인터페이스를 연결하고 mac 주소를 결정하는 기능 만있는 playbook 기능을 사용하는 방법을 설명합니다.

은 지금까지 나는 다음과 함께 :

- name: Setting up network 
    shell: "/bin/grep -e {{ vm_name }} {{ mac_file }} | grep -e {{ item }} | awk -F\"#\" '{print $3}'" 
    register: vm_mac 
    command: "/usr/bin/virsh attach-interface --domain {{ vm_name }} --type bridge --source 'bridge0' --model virtio --mac {{ vm_mac }} --config" 
    when: item == "bridge" 
    with_items: 
    - "{{ VM_NETWORK.split(',') }}" 

을하지만, 문제는 하나의 작업에서 명령 쉘 조치를 가질 수있다? 쉘 스크립트를 호출하여 mac 주소를 가져 와서 명령에서 사용해야합니까?

인터페이스를 연결하거나 분리하기 위해 virsh 명령을 실행하는 bash 스크립트가 있지만 현재 동적 인 방법으로 동적으로 수행하는 방법이 있는지 궁금합니다.

답변

0

당신이 맞다면, 당신은 두 가지 일을해야 할 것입니다. 첫 번째는 MAC을 가져와 vm_mac 변수를 등록하고 두 번째 변수는 변수를 사용하여 변수를 등록합니다. 그것은 가치가 무엇인지, 당신의 shell 작업이 실질적으로 단순화 할 수있다 들어

, 어쩌면 마지막 일처럼 보일 것이다 : 각 네트워크에 대해

- name: Get MAC 
    command: > 
    awk -F# -vvm_name="{{ vm_name }}" -vvm_network="{{ item }}" 
    '$4 == vm_name && $2 == vm_network {print $3}' "{{ mac_file }}" 
    register: vm_macs 
    with_items: "{{ vm_networks.split(',') }}" 

,이 vm_name와 관련된 MAC 주소를 인쇄합니다.

"vm_macs.results": [ 
    { 
     "item": "bridge", 
     "stdout": "52:54:00:aa:bb:01", 
    }, 
    { 
     "item": "Isolated2", 
     "stdout": "52:54:00:aa:dd:01", 
    } 
] 

있다 다음 vm_macs 변수의 내용은 item 키의 네트워크 이름과 stdout 키의 MAC 주소를 포함됩니다 vm_macs.results 키의 결과 목록,이 목록의 각 요소를 포함 할 것이다 거기에 다른 것들도 있습니다. 그러나 이것은 우리가 신경 쓰는 것입니다.

당신은 다음과 같은 후속 작업에 그것을 사용할 수 있습니다

- name: attach interface 
    command: > 
    virsh attach-interface 
    --domain {{ vm_name }} 
    --type bridge 
    --source bridge0 
    --model virtio 
    --mac {{ item.stdout }} 
    --config 
    when: item.item == "bridge" 
    with_items: "{{ vm_macs.results }}" 
0

당신이 로컬 호스트에서 명령 및 검색 mac_file을 실행하면, 당신은 pipe 조회를 사용할 수 있습니다 (more lookups 장 참조)

- name: Setting up network 
    command: > 
      /usr/bin/virsh 
      attach-interface 
      --domain {{ vm_name }} 
      --type bridge 
      --source 'bridge0' 
      --model virtio 
      --mac {{ vm_mac }} 
      --config 
    vars: 
    vm_mac: "{{ lookup('pipe', grep_cmd) }}" 
    grep_cmd: "/bin/grep -e {{ vm_name }} {{ mac_file }} | grep -e {{ item }} | awk -F\"#\" '{print $3}'" 
    when: item == "bridge" 
    with_items: "{{ VM_NETWORK.split(',') }}" 

참고 : 정확한 grep_cmd를 테스트하지 않았습니다.

플러그인은 로컬에서 실행되므로 localhost에 nly를 지정하십시오.