2016-12-22 15 views
1

我試圖代碼,其中一個遠程進程的PID被登記爲變量a劇本,然後我針對PID執行其它殼命令:使用可變登記在劇本

- name: capture remote pid 
    hosts: web.servers 
    tasks: 
      - name: capture PID 
      shell: ps ax | grep eap | cut -d " " -f1 
      register: pid 
      - name: print PID information 
      shell: ps -ef | grep {{ pid.stdout }} 
從這個簡單的劇本

所以我期望打印從遠程PID的進程信息,但什麼都沒有印:

PLAY RECAP ********************************************************************* 
192.3.9.155     : ok=3 changed=2 unreachable=0 failed=0 

任何想法有什麼不對呢?

回答

1

您可以使用pgrep而不是grepping和削減ps ax結果。

您還應該考慮當您有多個匹配進程名稱的PID時會發生什麼。 pid.stdout將包含一個多行輸出。相反,你應該重複pid.stdout_lines

最後,如果你想看到它們,你需要顯示結果。您的任務中的ps -ef | grep {{ pid.stdout }}可能會正確運行並將其輸出重定向到stdout,但Ansible不會在其日誌(屏幕上)中包含輸出。當您在print PID information任務中迭代時,它也將成爲一個列表。

- name: capture remote pid 
    hosts: web.servers 
    tasks: 
    - name: capture PID 
     shell: pgrep eap 
     register: pid 

    - name: print PID information 
     shell: ps -ef | grep {{ item }} 
     with_items: "{{ pid.stdout_lines }}" 
     register: second_pid 

    - name: display the results in Ansible log (on the screen) 
     debug: 
     var: second_pid 
+0

感謝您的詳細回覆。請注意,我必須將最後一行更改爲「debug:var = second_pid」,否則會引發語法錯誤。現在它按我的預期工作。謝謝! – Carla

+0

對不起,我看不到最後一行的語法錯誤,我的Ansible也沒有。你的語法也是正確的,但沒有理由在YAML-one上失敗。 – techraf