2016-06-09 2 views
0

나는 가능성있는 플레이 북을 만들고 있는데 아직 설치되지 않은 경우에만 루비 보석 (jekyll)을 설치해야합니다. 나를 위해이 작업 대상 호스트의 명령 줄에서 실행 (우분투 14.04는) : 보석이 이미 설치되어있을 경우Ansible에서 복잡한 셸 표현식을 실행하는 방법?

입니다
gem list | grep "jekyll " > /dev/null || gem install jekyll 
(gem list | grep "jekyll " > /dev/null) || gem install jekyll 

, 그것은 다시 설치되지 않습니다. 그러나이 명령을 Aniable 게임 판에 넣으면 보석은 항상 설치됩니다.

- name: Install Jekyll only if not yet installed 
    shell: (gem list | grep "jekyll " > /dev/null) || gem install jekyll 

이 기능을 사용하려면 어떻게해야합니까? 어떤 종류의 탈출이 필요한가요?

+1

[gem] (http://docs.ansible.com/ansible/gem_module.html) 모듈을 사용하지 않는 이유가 있습니까? – Theo

+0

글쎄 지금은 정말 바보 같아요, 보석 모듈이 있다는 것을 잊어 버렸습니다 ... 그러나, 나는 아직도 표현이 효과가 없었던 이유를 알고 싶습니다. –

+1

내 추측은 도망 치기 쉬우 며 'continue if false'('||') 일 수 있습니다. 그러나 쉘 스크립트에 명령을 입력하고 쉘 스크립트를 전송하여 해당 이론을 테스트 할 수 있습니다. 또 다른 옵션은 수표를 제거하고'shell : gem install jekyll'을'creates :'인자와 함께 사용하여 보석이 라이브러리에 존재하는지 확인하는 것입니다. – Theo

답변

0

환경 문제라고 생각합니다. 나는 gem 모듈을 사용하여 호의를하는 동안

bash -lc "gem install ..." 
+1

스택 오버플로에 오신 것을 환영합니다. SO는 토론 게시판이 아니라 대신 프로그래밍 문제 및 솔루션의 요리 책과 같은 온라인 참조 서입니다. 그러한 질문과 대답이 백과 사전이나 프로그래밍 서적에있는 것처럼 질문이나 답변에 인사말, 평가 또는 서명을 사용하는 것은 불필요하며 바람직하지 않습니다. –

+0

이것은 나에게 효과가 없었지만 제안 해 주셔서 감사합니다. 이것은 나를위한 야크 면도 모험이되었습니다. 저는 이미 Anipal Github 사이트 (https://github.com/ansible/ansible-modules-core/issues/3903)에 문제를 게시했으나 지금은 계속 움직여야합니다. . 감사... –

1

를 사용해보십시오, 스크립트는 두 개의 작업으로 분할 할 수있다.

보석 목록을 가져오고 (버전을 제거한) 보석을 확인하기 전에 추가 작업을 추가 한 다음 보석이없는 경우에만 조건부를 실행하십시오.

- name: Get Gem List 
    shell: gem list | awk '{print $1}' 
    register: gem_list 

    - name: Install jekyll jekyll 
    shell: gem install jekyll 
    when: "'jekyll' not in gem_list.stdout_lines" 
+0

첫 번째 작업에서 부울 값으로 변환 할 수 있습니까? 쉘 명령에서 캐릭터 라인의 유무를 'jekyll_present'라는 이름의 부울로 변환 할 수 있습니까? 그리고'gem list | grep'보다는 stdout? –

+0

아마'보석 목록 | grep "jekyll"== "jekyll"'? –

+0

죄송합니다. 방금 'stdout'도 사용하고 있다는 것을 깨달았습니다. 또한,'=='접근 방식을 시도하고 구문 분석 오류가 발생합니다. –

관련 문제