2017-10-05 6 views
0

문제점 : 패키지 업데이트가 필요한 많은 노드가 있습니다. 일부 노드에는이 패키지가 설치되어 있고 일부는 설치되어 있지 않습니다. 목표는 입니다. 1. yum 모듈을 사용하여 패키지가 설치되어 있는지 확인하십시오. 2. 패키지가 설치되어 있고 업데이트가 가능하면 yum update를 실행하십시오.가능 : 결과 값 yum 모듈을 반복하십시오.

나는 이것이 명령이나 셸로는 쉽게 이루어 지지만 매우 비효율적이라는 것을 알고 있습니다. 목록 위의 결과에서 사용할 설치로 패키지 및 업그레이드를 본다 :

tasks: 
    - name: check if packages are installed 
    yum: list="{{ item }}" 
    with_items: 
     - acpid 
     - c-ares 
     - automake 
    register: packages 


    - debug: 
     var: packages 

내가 할 ansible 원하는 것은 the results

이 얌 경우에만 패키지를 업데이트하는 것입니다 생성합니다.

yum 모듈을 사용할 수 있는지 확실하지 않습니다.

빠르고 쉬운 방법은 바로 명령을 사용하는 것입니다 :

tasks: 
    - name: check if packages are installed 
    command: yum update -y {{ item }} 
    with_items: 
     - acpid 
     - c-ares 
     - automake 

가 설치되어있는 경우 냠 업데이트 패키지는 패키지를 업데이트하기 때문에.

+0

이유는 빠르고 쉬운 방법을 사용하지? – larsks

답변

0

가능성있는 loops 설명서는 section about using register in a loop입니다.

당신의 debug 작업의 출력을 살펴보면, 당신은 당신의 packages 변수가 첫 번째 작업에 with_items 루프의 결과가 포함 results라는 이름의 키를 가지고 있음을 알 수있다. 큰 구조는 다음과 같다 :

{ 
    "packages":{ 
     "changed":false, 
     "msg":"All items completed", 
     "results":[ 
     { 
      "item":"...", 
      "results":[ 

      ] 
     }, 
     { 
      "item":"...", 
      "results":[ 

      ] 
     } 
     ] 
    } 
} 

각각의 결과는 결과의 루프 반복기의 값을 포함하는 키 item 및 의해 반환 된 패키지 목록 (빈 가능)를 포함하는 results 키가 모듈 yum에 대한 list 옵션 그걸 염두에두고

, 그럴 수있어이 같은 결과를 통해 루프 :

- debug: 
    msg: "{{ item.item }}" 
    with_items: "{{ packages.results }}" 
    when: item.results 

when 조건이 list 작업이 비어 있지 않은 결과를 반환하는 결과만을 일치합니다.

는 일치하는 패키지를 업그레이드하려면 :

- yum: 
    name: "{{ item.item }}" 
    state: latest 
    with_items: "{{ packages.results }}" 
    when: item.results