web-dev-qa-db-ja.com

Ansible Commandモジュールは「|」と言います違法な性格です

Ansibleを使用してプロジェクトを展開し、指定されたパッケージがインストールされているかどうかを確認しようとしていますが、タスクに問題があります。タスクは次のとおりです。

- name: Check if python-apt is installed
  command: dpkg -l | grep python-apt
  register: python_apt_installed
  ignore_errors: True

そして、ここに問題があります:

$ ansible-playbook -i hosts idempotent.yml

PLAY [lxc-Host] *************************************************************** 

GATHERING FACTS *************************************************************** 
ok: [10.0.3.240]

TASK: [idempotent | Check if python-apt is installed] ************************* 
failed: [10.0.3.240] => {"changed": true, "cmd": ["dpkg", "-l", "|", "grep", "python-apt"], "delta": "0:00:00.015524", "end": "2014-07-10 14:41:35.207971", "rc": 2, "start": "2014-07-10 14:41:35.192447"}
stderr: dpkg-query: error: package name in specifier '|' is illegal: must start with an alphanumeric character
...ignoring

PLAY RECAP ******************************************************************** 
10.0.3.240                 : ok=2    changed=1    unreachable=0    failed=0 

この文字'|'が違法である理由。

52
Robert

ドキュメントから:

command-リモートノードでコマンドを実行

コマンドモジュールは、コマンド名の後にスペースで区切られた引数のリストを取ります。指定したコマンドは、選択したすべてのノードで実行されます。シェルを介して処理されないため、$ HOMEなどの変数と「<」、「>」、「|」、「&」などの操作は機能しません(これらの機能が必要な場合はシェルモジュールを使用します)。

Shell-ノードでコマンドを実行

Shellモジュールは、コマンド名の後にスペースで区切られた引数のリストを取ります。コマンドモジュールとほぼ同じですが、リモートノードのシェル(/ bin/sh)を介してコマンドを実行します。

したがって、Shell: dpkg -l | grep python-aptを使用する必要があります。

103
Sylvain Leroux

Ansibleドキュメントのコマンドモジュール について読む:

シェルを介して処理されないため、「。」、「>」、「|」、「&」などの操作は機能しません。

推奨されているように、 シェルモジュール を使用します。

- name: Check if python-apt is installed
  Shell: dpkg -l | grep python-apt
  register: python_apt_installed
  ignore_errors: True

価値があるものについては、 aptコマンド を使用して、debian環境でのインストールを確認/確認できます。

- name: ensure python-apt is installed
  apt: name=python-apt state=present
36
tedder42