2017-11-22 1 views
0

나는 비교적 단순한 명령이 실패합니다. 다음은 서비스를 설치합니다. 나는 결과 텍스트를 주장하고 싶다. 올바른 텍스트가 있지만 어설 션이 실패합니다. 어떻게 그렇게 될수 있니?? 여기배열에서 가능한 어설트가 불가능합니까?

- name: Install the tomcat service on the remote machine 
    win_command: "{{ tomcat_install_folder }}{{ tomcat_service_installer }}" 
    register: cmd_result_tomcat_service_install 
- assert: 
    that: 
     - "'has been installed' in cmd_result_tomcat_service_install.stdout_lines" 

명백한 텍스트 stdout_lines에 '설치된'를 포함하는 결과 :

은 어설와 코드입니다. 문제는 결과가 실제로 배열이라고 할 수 있는지 궁금

TASK [tomcat : assert] 
fatal: [v-sax-769-e-a.develop.ebiz.grp]: FAILED! => { 
    "assertion": "'has been installed' in cmd_result_tomcat_service_install.stdout_lines", 
    "changed": false, 
    "evaluated_to": false, 
    "failed": true 

다음은 오류 메시지

"cmd_result_tomcat_service_install": { 

     "stdout": "\r\nC:\\Users\\service_ansible>SET JAVA_HOME=D:\\Products\\CPeRef\\java\\jdk1.8.0_51 \r\n\r\nC:\\Users\\service_ansible>cd /d D:\\Products\\CPeRef\\tomcat\\apache-tomcat-8.0.26\\bin \r\n\r\nD:\\Products\\CPeRef\\tomcat\\apache-tomcat-8.0.26\\bin>service.bat install CPeRef2 \r\nInstalling the service 'CPeRef2' ...\r\nUsing CATALINA_HOME: \"D:\\Products\\CPeRef\\tomcat\\apache-tomcat-8.0.26\"\r\nUsing CATALINA_BASE: \"D:\\Products\\CPeRef\\tomcat\\apache-tomcat-8.0.26\"\r\nUsing JAVA_HOME:  \"D:\\Products\\CPeRef\\java\\jdk1.8.0_51\"\r\nUsing JRE_HOME:   \"D:\\Products\\CPeRef\\java\\jdk1.8.0_51\\jre\"\r\nUsing JVM:    \"D:\\Products\\CPeRef\\java\\jdk1.8.0_51\\jre\\bin\\server\\jvm.dll\"\r\nThe service 'CPeRef2' has been installed.\r\n", 
     "stdout_lines": [ 
      "", 
      "C:\\Users\\service_ansible>SET JAVA_HOME=D:\\Products\\CPeRef\\java\\jdk1.8.0_51 ", 
      "", 
      "C:\\Users\\service_ansible>cd /d D:\\Products\\CPeRef\\tomcat\\apache-tomcat-8.0.26\\bin ", 
      "", 
      "D:\\Products\\CPeRef\\tomcat\\apache-tomcat-8.0.26\\bin>service.bat install CPeRef2 ", 
      "Installing the service 'CPeRef2' ...", 
      "Using CATALINA_HOME: \"D:\\Products\\CPeRef\\tomcat\\apache-tomcat-8.0.26\"", 
      "Using CATALINA_BASE: \"D:\\Products\\CPeRef\\tomcat\\apache-tomcat-8.0.26\"", 
      "Using JAVA_HOME:  \"D:\\Products\\CPeRef\\java\\jdk1.8.0_51\"", 
      "Using JRE_HOME:   \"D:\\Products\\CPeRef\\java\\jdk1.8.0_51\\jre\"", 
      "Using JVM:    \"D:\\Products\\CPeRef\\java\\jdk1.8.0_51\\jre\\bin\\server\\jvm.dll\"", 
      "The service 'CPeRef2' has been installed." 
     ] 
    } 
} 

? (이 경우 stdout_lines) 문자열의 목록 중에서 정확한 리터럴 문자열 has been installed있을 때

답변

1

이 조건

'has been installed' in cmd_result_tomcat_service_install.stdout_lines 

는 사실이다. 문자열 has been installed 하나 개의 긴 문자열 (이 경우 stdout)의 하위 문자열 인 경우

'has been installed' in cmd_result_tomcat_service_install.stdout 

그러나 이것은 사실이다. 독립적 라인을 구문 분석하려면

, 당신은 사용할 수 있습니다 : 필터링 할 수있는 좋은 솔루션입니다

cmd_result_tomcat_service_install.stdout_lines | select('search','has been installed') | list | count > 0 
+0

합니다. 검색 ('xxx')에 대해 더 자세히 읽고 싶지만이 코드를 설명하는 웹 페이지를 찾지 못했습니다. 링크가 있거나 좋은 검색 단어를 찾으십니까? – MBushveld

+1

http://jinja.pocoo.org/docs/2.10/templates/#select 및 http://docs.ansible.com/ansible/latest/playbooks_tests.html#testing-strings –

관련 문제