2016-08-23 6 views
1

私は条件に基づいてネットワークを作成するために、安全なスクリプトを作成しました。そのため、たとえ私が再び可能なスクリプトを実行したとしても、私のopenstack環境で重複したエントリを作成することはありません。openstackを利用したネットワークの自動化

タスク:

name: "create network" 

shell: neutron net-create (openstack details like project username,password, api) network_1 

when: ("neutron net-list -c name| grep network_1| awk '{print$2}'" == "null") 
    the above condition didn't work so, I tried another condition 

when: ("neutron net-list -c name| grep network_1| awk '{print$2}'" == neutron net-list -c name| grep network_2 | awk '{print$2}') 

私は私のプロジェクトでtwonetworksのいずれかを持っていません。私の意図は、両方のステートメントがnull出力を表示し、最初の条件が真になり、ネットワークを実行して作成する必要がありました。 2回目にスクリプトを実行すると、条件が満たされず、条件チェックが偽になり、ネットワークが作成されません。

しかし、両方の条件がスキップされ、条件チェックが失敗したというfalseが返されました。

+0

これらの中性子のコマンドラインは、コピーして貼り付けて標準端末で実行すると機能しますか?あなたは彼らがあなたのcondtionalが期待しているものを返すと確信する必要があります。これらのコマンドにサンプル出力を含めると、非中性子リーダーに役立つかもしれません。がんばろう。 – shellter

+0

ねえ、彼らは何も返しません。彼らはテーブルに存在しないので。条件がnullを返すか、何も実行しないコマンドです。私は別の方法を見つける必要があるように見えます。しかし、それを調べていただきありがとうございます! – NKR

答えて

3

あなたのwhen条件は、あなたが実行方法を知らせていないシェルコマンドだけでなく、Anabilitiesが認識するものである必要があります。あなたはこのような何かを行うことができます。この場合

:あなたは neutron net-list -c name| grep network_1| awk '{print$2}'を実行したときにnetwork_1は(私は、この場合も多いのでわからないOpenStackのを使用していない、それは nullを返す存在しない場合と仮定だ

- name: check for network_1  
    shell: "neutron net-list -c name| grep network_1| awk '{print$2}'"  
    register: network_1 

- name: "create network"  
    shell: neutron net-create (openstack details like project username,password, api) network_1  
    when: network_1.stdout == "null" 

実際には真実です)。

一般的には、もしあなたが絶対に必要なのであれば、あなたは資源の存在をチェックして、あなたのためにカバーするべき冪等性を管理する必要があるので、まともなモジュール。

- os_network: 
    cloud: mycloud 
    state: present 
    name: network_1 
    external: false 

あなたが入れて避けることができるので、それがまた楽しくAnsibleを実行しているホスト上で、このようなOS_USERNAMEなどの環境変数をピックアップします。この場合、あなたはそれがまだ存在しない場合は、ネットワークを作成するためにos_networkを使用することができるはずですあなたの不可解なコードへの資格情報

+0

質問を編集して、ネットワークにネガティブな結果と肯定的な結果があるかどうかを確認するコマンドの出力を追加する必要があります – ydaetskcoR

+0

os_networkモジュールを使用しようとしましたが、オーバーヘッドはインストールする必要がありますあなたが走っているホスト上のシェードモジュール。最初にピップをインストールしてからpipを使用する必要があります。シェードモジュールは、キーストーンノバなどに関連するpythonパッケージをインストールしています。オープンスタックコンポーネントを変更しているパッケージが多少のダメージを与えるかどうかはほとんど気になりません。私はあなたが提案したように質問を変更しようとしました。それを見つけることができませんでした。新しいスタックフロー。 – NKR

0
  • 名:ネットワークリスト

    シェル:名前-c中性子ネットリスト| grepネットワーク| awkの

    を '{$ 2印刷}' レジスタ:中性子ネット-作成ネットワーク

    ::!ネットワークは

    シェル作成:res.stdout = "ネットワーク" を

  • 名前をresは

ここでは、最初の文でネットワーク名がリストに存在するかどうかを確認しています。 2番目のセクションでは、ネットワーク名がネットワークと等しくない場合は、ネットワークを作成します。プレイブックをもう一度実行すると、最初のステートメントでテーブルから名前を取得できるため、この条件はfalseになります。ありがとう。

関連する問題