2016-12-22 17 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