Ansible: with_ループを構成可能にする

作成日 2015年08月25日  ·  90コメント  ·  ソース: ansible/ansible

問題の種類

機能のアイデア

コンポーネント名

ANSIBLEバージョン

2.1

構成
OS /環境
まとめ
how: 
    forks: 1
    pause: 0
    squash: name
    label: "{{item.name}}"
    end: on_fail
with_items: ...
  • フォーク:アイテムを並行して実行するためのループ内のフォーク、デフォルト1、これには警告が必要です
  • 一時停止:ループ実行の合間に、スロットルされたAPIシナリオで役立ちます_2.2で完了_
  • スカッシュ:すべてのアイテムをリストに結合し、提供されたオプションに渡します。apt、yumなどの現在のハードコードされたオプションのように機能します。デフォルトではNone _abandon_:反対意見、この機能を削除する必要があります
  • 終了:ループを中断するとき、デフォルトは「最後のアイテム」、オプションですか? on_fail、on_success(最初のもの)?
  • ラベル:(#13710)アイテムループを出力するときに何を表示するか_2.2で完了_

現在の状態へのドキュメント:

http://docs.ansible.com/ansible/playbooks_loops.html#loop -control

再現する手順
予想された結果
実績
affects_2.1 affects_2.3 feature core

最も参考になるコメント

+1フォーク

私はopenstackモジュールが100以上のアイテムでwith_ループを繰り返すのを待っています...
image

全てのコメント90件

howとは呼ばないでください。 become: trueよりも読むのはさらに悪いです。 しかし、その下の機能は素晴らしく見えます。

#10695の修正が含まれています

優れた。 バイクシェディングの利益のために、多分それをlooping:と呼んでください。

:+1:

+1

特にホスト並列化内で+1!

:+1:

:+1:
しかし、それを「どのように」とは呼ばないでください

したがって、最初の失敗後にループタスクを中断するための回避策があります

- hosts: localhost
  vars:
    myvar:
        - 1
        - 2
        - 3
        - 4
        - 5
  tasks:
    - name: break loop after 3
      debug: msg={{item}}
      failed_when: item == 3
      register: myresults
      when: not (myresults|default({}))|failed
      with_items: "{{myvar}}"

@bcocaが最後から機能しない(ansible 1.9.3 ubuntu)

タスク:[3の後にループを解除] * * * * * * * * * * * * * * * ** *
ok:[localhost] =>(item = 1)=> {
「失敗」:false、
"failed_when_result":false、
「アイテム」:1、
"msg": "1"
}
ok:[localhost] =>(item = 2)=> {
「失敗」:false、
"failed_when_result":false、
「アイテム」:2、
"msg": "2"
}
failed:[localhost] =>(item = 3)=> {"failed":true、 "failed_when_result":true、 "item":3、 "verbose_always":true}
msg:3
ok:[localhost] =>(item = 4)=> {
「失敗」:false、
"failed_when_result":false、
「アイテム」:4、
"msg": "4"
}
ok:[localhost] =>(item = 5)=> {
「失敗」:false、
"failed_when_result":false、
「アイテム」:5、
"msg": "5"
}

ああ、はい、それは1.9のように2.0でもそのまま動作します。ループが完了するまで登録は行われません。

フォークで+1

+1
おそらく「方法」の代わりに、loop_detailsまたはoptions?

+1

+1、$# localhost wait_forを使用して100個のEC2ホストが起動するのを待つと、私は殺されます...

センデリスタと同様の理由で+1

+1

:+1:

squashforksはどちらも、Ansibleの実行を大幅に高速化する素晴らしい機能です。

また、 howloop_detailsloop_settingsloop_optionsなどに置き換えます。

loop_control 、すでに2.1にあり、 labelの部分が実装されています。

スカッシュをサポートするモジュールにリストを渡すのは簡単なので、スカッシュはなくなる可能性があります。

apt: name={{listofpackages}}

ループを完全に回避します

+1フォーク

+1フォーク

条件付きブレークの新しい構成のユースケースがありましたbreak_when

+1フォークと私はそれが次のように実行するタスクのシーケンスを並列化するためにも機能することを願っています:
- include: service.yml
with_items: "{{services|default([])}}"

それ以外の場合は、すでにasync/async_statusがあります。

+1フォーク

私はopenstackモジュールが100以上のアイテムでwith_ループを繰り返すのを待っています...
image

フォークで+1。 これを使用して、AMIをすべてのAWSリージョンにコピーできます。

フォークで+1。 お願いします! loop_controlの一部にします

フォークで+1

フォークで+1

+1、フォークも必要です:-)

フォークで+1

フォークで+1

フォークは素晴らしいでしょう、+ 1

歓迎されているかどうかをプロジェクト間で判断するのは難しいので、私は常にスパムに貢献したくないと黙って座っていますが、フォーク+1列車が駅を出たようです!

フォークで+1

フォークで+1

フォークで+1

:+1:フォーク上

@bcocaご挨拶! この号を開くために時間を割いていただきありがとうございます。 コミュニティがあなたの問題を効果的に処理するために、私たちはもう少し情報が必要です。

説明で見つからなかったアイテムは次のとおりです。

  • 問題の種類
  • ansibleバージョン
  • コンポーネント名

このテンプレートを使用して、この問題の説明を設定してください。
https://raw.githubusercontent.com/ansible/ansible/devel/.github/ISSUE_TEMPLATE.md

ボットのヘルプについては、ここをクリックしてください

フォークで+1

フォークで+1!

フォークで+1!

フォークで+1!

フォークで+1!

フォークの更新はありますか? いつ準備ができているのですか?
私のユースケースは、 with_sequenceを使用してサーバー上で約20個のコンテナーをインスタンス化することです。 今ではあまりにも多くの年齢がかかります:(
喜んでお手伝いさせていただきますが、手を置く場所についてのヒントが必要です

@bitliner誰もそのPRを作成していません。それがあなたが求めているものである場合、実際には正しく行うのは非常に困難です。

問題については、インベントリでXホストを宣言し、 with_ #$ではなくhosts:をループして、並列に作成します。

在庫:

[containers]
container[000:020]
hosts: containers
gather_facts: false
tasks:
   - container: state=present name={{inventory_hostname}}

つまり、コンテナは「構成された」モジュールです。

@bcocaあなたの解決策は私にはわかりません。 確かに、これはあなたが意味することですか?

ホストファイル

[containers]
192.168.1.100
192.168.1.100
192.168.1.100
192.168.1.100
... and so on based on the degree of parallelism I want to get ...

main.ymlファイル

hosts: containers
gather_facts: false
tasks:
   - container: state=present name={{inventory_hostname}}

実装する必要のあるコンテナモジュールに基づいていますか? この場合、私は同じ名前のすべてのコンテナを持っているでしょう、そしてそれは受け入れられません、正しいですか?

さらに、ループを正しく並列に実装するための課題は何ですか?

私のユースケースでは、このタスクを高速化する必要があります。

- name: "Start clients"
  docker_container:
    name: "mycontainer-{{ item }}"
    image: myimage
    links: 
      - server-{{item}}:server-{{item}}
  with_sequence: count={{ scale }}

特定の方法でコンテナー間でトラフィックをルーティングする必要があるため、docker-compose scaleを使用できません(そのため、 with_sequenceを使用して異なるdockerコンテナー名を生成します)。

コンテナーの宣言を受け取り、スケールパラメーターに基づいて、複数のコンテナーをリモートで並列にインスタンス化するモジュールを構築できます。 それは意味がありますか? myModuleでdocker_containerモジュールを呼び出す/再利用する方法と、Ansibleが何かを並行して実行するために提供するAPIを理解するのに役立つものはありますか?

@bitlinerあなたは私の指示に従わなかった、私はインベントリに一意の名前を持っていた(シーケンスのように機能するために範囲を使用)。 名前はインベントリ内で一意であるため、同じ名前をN回宣言しましたが、ホストは1つです。これにより、1つのホストのみをループするため、コンテナの重複名で2番目の問題が発生することはありません。

いずれにせよ、問題をフォローアップしたい場合は、このチケットのトピックから少し外れるため、MLまたはIRCを使用してください。

@bcoca 20のホストを宣言した場合、どうすれば1つのホストを使用できますか?

[containers]
container[000:020]

container001container002などに接続します。

これは一意の名前を持つために機能しますが、私には明確ではないのは、私がまだ1つのホスト(20ではなく)を持っていると言う理由です。
hosts:containersは、私にとって1つだけでなく20のホストを意味します。 このソリューションでは何を無視していますか?

@bitlinerはこれを引き起こします:

[containers]
192.168.1.100
192.168.1.100
192.168.1.100
192.168.1.100

4つのホストではなく、1つのホストです

また、この時点では、これはほとんどトピックから外れています。これについて引き続きヘルプが必要な場合は、IRCまたはMLにアクセスしてください。

私はを使用して解決しました

[containers]
ip[000:020] ansible_host=192.168.1.100

- name: "Start containers"
  docker_container:
    name: "my-container-{{ inventory_hostname }}"

質問: forkステートメントを追加するためのイメージング、変更は、並列性と非同期性のレベルを管理するためにメソッドrun_loopを書き直すことで構成されますか?

そしてそれは '楽しみ'を取得し始めます...:

  • ループフォークはグローバル--forksに対してカウントされますか、リモートごとにカウントされますか?
  • アイテムが前のアイテム(タスクの実行だけでなく、条件など)に依存している場合、ループをどうするか?
  • 複数のフォークが同じホストで実行される場合の同時実行の問題を処理する方法は? つまり、同じファイルを更新します
  • クリーンアップをどのように処理しますか? 現在、tmp dirsを再利用できますが、実行するたびにそれ自体がクリーンアップされるため、問題が発生する可能性があります。

そして、私が知っている他のいくつかの問題があります..誰かがそれを実装しようとするまで私が気付かないことがたくさんあることを確認してください。 私はいくつかの解決策を持っていますが、それはかなり早く手に負えなくなり始めます。

@bcocaループフォークはデフォルトで有効にしないでください。 デフォルトが1に設定されていることを確認し、パラメーターforksまたはserialとして導入したいのですが、警告を含めます。 いくつかの既存のコードを壊す可能性があります。 そうは言っても、私はこの機能を非常に楽しみにしています(特に、 delegate_toを必要とするタスクの場合)

フォークの場合は+1(デフォルトではfalse)

+1フォーク

+1フォーク

+1フォーク

+1フォーク

+1フォーク

フォークの場合も+1ですが、それまでの間、一般的にパフォーマンスを大幅に向上させる新しいAnsible戦略プラグインとwith_itemsループもあります。 おそらく、パフォーマンス上の理由でフォークが必要な場合は、一見の価値があります。

https://github.com/dw/mitogen
https://mitogen.readthedocs.io/en/latest/ansible.html

これがwith_itemsループを正確にどのように改善するかわかりません。 このプラグイン
接続方法としてsshを使用することによって引き起こされるパフォーマンスの問題を改善します。
特に長距離および潜在的なネットワーク上で、多数の場合
サーバーの。

これは、実行が行われるAWSまたはAzureクラウド機能には役立ちません
ansibleコントローラーで発生し、
そのクラウドシステムであり、ホストにまったく接続していません。
with_itemsが遅いという主な問題。 大規模なセットとは何の関係もありません
マシンまたはレイテンシーまたはsshに関連するものの。 それは単に事実です
with_itemsループでクラウド関数をシリアルで実行し、何も実行しないこと
クラウドプロバイダーが速度を向上させるか、
ansibleによるこれらのクラウド機能の並列実行。

また、記事にwith_itemsについてはまったく触れられていないため、方法がわかりません。
これは、ほんの少しでも役立ちます。 もう少し説明してもらえますか
これはどのように役立ちますか? 足りない場合は何が足りないのか知りたい
ここに何か。

2018年3月10日土曜日21:58に、 NielsHnotifications @ github.comは次のように書いています。

フォークも+1しますが、その間に新しいAnsibleもあります
一般的にパフォーマンスを大幅に向上させる戦略プラグイン、および
with_itemsループの場合。 おそらくパフォーマンスのためにフォークが欲しい人のために
見る価値のある理由:

https://github.com/dw/mitogen
https://mitogen.readthedocs.io/en/latest/ansible.html


コメントしたのでこれを受け取っています。
このメールに直接返信し、GitHubで表示してください
https://github.com/ansible/ansible/issues/12086#issuecomment-372070418
またはスレッドをミュートします
https://github.com/notifications/unsubscribe-auth/AJd59qWI9n_DNmUqpmZYiIOMZAyjJy3uks5tdEyQgaJpZM4Fx8zF

確かに、それはすべての場合に役立つわけではありません。 ただし、with_itemsでフォークを探している理由は、各アイテムを個別に処理するのが遅いためです(パイプライン処理を使用している場合でも)。 host_varsに基づいて多数(数百)のディレクトリを作成したり、数百のファイルをテンプレート化したりする必要がある場合があります。 だから私は主にfiletemplateモジュールをループしています。

私はかつて、with_itemsを介して100個の個別のファイルに100個のファイルをテンプレート化することと、jinjaテンプレート自体の項目をループして1つの大きなファイルにテンプレートをマージすることをテストしました。 1つのファイルにすべてが5秒かかりますが、100個の個別の構成ファイルを作成するには30分かかります。

私が言及したプラグインは、私にとって非常に大きな改善をもたらしました。ここで言及する価値があると思いました。

ループはアイテムごとに同じタスクを実行するだけなので、タスクの実行速度を向上させると、ループが速くなります。 これは「リモートタスク」にのみ影響するため、ローカルの場合はゲインが表示されません。

同意しました。 私はローカルタスクのみを実行するためにansibleを使用しています。 特に、1ダースほどのDockerイメージを作成します。 現時点では、ansibleはそれらをシリアルにビルドするため、多くの時間がかかり、マルチコアCPUを十分に活用していません。 複数のDockerイメージを並行して構築したいと思います。

@gjcarneiroは、それらをデータとして定義せず、ホストとして定義してターゲットにし、次にdelegate_to: localhostを使用してアクションを並行して実行します

ああ、巧妙なトリックに感謝します:)それでも、それが機能したとしても(私はテストしていません)、タスクを並行して実行するかなり複雑な方法です。

繰り返しになりますが、意図したものとはまったく異なる目的でansibleを使用している可能性があるため、ある意味ではそれは私自身の責任です:(

それほど複雑ではありませんが、Ansibleが変数ではなくホストごとに並列化を使用することを意図しているのです。

はい、わかりました。Ansibleのせいではなく、理にかなっています。 しかし、Ansibleはほとんどの点でビルドシステムとして優れているため、(たとえばmakeではなく)ビルドシステムとしてAnsibleを使用しています。 しかし、私の考えでは、ビルドシステムとして考えると、「ホスト」は意味がありません。 「make」のようなビルドシステムは「ホスト」を気にせず、ファイルとタスクだけを気にします。 私はAnsibleをビルドシステムとして使用することを強制しています、そしてそれは少しの認知的不協和を引き起こします、それだけです。

Ansibleはホストとタスクのみを考慮し、構築しているイメージを「ホスト」と見なすと、突然両方のパラダイムに適合します。

Ansibleは、他の多くのもの、ネットワークの構成管理ツールです
実数と仮想の両方のデバイス、次のような大量のクラウドサービス用
データベース、弾性Beanstalk、ラムダなどのWebサービスおよびすべての
IAMセキュリティコンポーネントのようにそれに適用されるコンポーネント、Ansibleは
まだほとんどVM /ホストを実行している場合は、基本的にホストが得意です
2000年代初頭のIT。 ここで誰かを怒らせないことが時々重要です
VMまたはDockerコンテナを実行する理由ですが、それらはすべて
レガシーの理由。 実際、ますます多くのホストが少なくなるでしょう
自動化するもの。 IMO with_itemsと並列にならない場合は、次のようになります。
よく一緒にansibleをスクラップします。

ここで前向きに考えて使ってみると言っていました
一部のクラウドサービスのdelegate_toは、200以上で実行しようとしたことがないことを意味します
この方法で必要なクラウドコンポーネントは、リストをクエリするだけだと思います
ansibleを使用してhosts形式のhostsファイルにダンプしてから試してください
デリゲート:localhostここで結果をフィードバックします。 それがで動作する場合
少なくとも、回避方法に関するドキュメントプルリクエストを実行できます
with_itemループシリアルはこの方法で発行します。 私たちはへのリンクを持っていることを確認することができます
それらはクラウドモジュールセクションとdockerのセクションにあります。

2018年3月12日月曜日18:49、 BrianCocanotifications @ github.comは次のように書いています。

Ansibleはホストとタスクのみを気にします。あなたがいるイメージを考慮してください
「ホスト」を構築すると、突然両方のパラダイムに適合します。


コメントしたのでこれを受け取っています。
このメールに直接返信し、GitHubで表示してください
https://github.com/ansible/ansible/issues/12086#issuecomment-372422169
またはスレッドをミュートします
https://github.com/notifications/unsubscribe-auth/AJd59nhLIM3s3BL_xM_WwbJS6-uROzjSks5tdsNCgaJpZM4Fx8zF

@gjcarneiroは、それらをデータとして定義せず、ホストとして定義してターゲットにし、delegate_to:localhostでアクションを並行して実行します。

これは非常に優れたアプローチですが、 serial=1シミュレーション(#12170)を使用したローリングリスタートの回避策では機能しないようです。 したがって、並列化のオプションを使用すると、柔軟性が大幅に向上します。

間違いありませんが、複雑さが増し、単一のホストで同時アクションを処理する必要がありますhosts:all + lineinfile + delegate_to: localhost

これまでのところ、delegate_toへの小さなテストを作成しました:127.0.0.1 for
これも大規模な問題であるため、削除タスク。

私のプレイブックは次のようになります。

  • ホスト: "{{DeploymentGroup}}"

    タスク:

    • 名前:vmと関連するすべてのリソースを削除します
      azure_rm_virtualmachine:
      resource_group: "{{host_vars [item] ['resource_group']}}"
      名前: "{{inventory_hostname}}"
      状態:不在

    デリゲート_to:127.0.0.1


残念ながら、それでもホストにリストされているマシンに接続しようとします
Azureタスクazure_rm_virtualmachineを実行します。
私はこれを正しく行っていますか? 私は何かが足りないようですが、私はこれを試しました
以前はさまざまな方法でしたので、あなたができることを知りたいだけです
これ。

これは実際に機能しますか? うまくいけば、これは構文の問題にすぎません。

2018年3月12日月曜日午後7時55分、Isaac Egglestone < [email protected]

書きました:

Ansibleは、他の多くの目的のための構成管理ツールです。
大量のクラウド向けの、実在および仮想の両方のネットワークデバイス
データベースなどのサービス、弾性豆の木、ラムダなどのWebサービス
そして、IAMセキュリティコンポーネントのようにそれに適用されるすべてのコンポーネントは、
まだほとんどVM /ホストを実行している場合、Ansibleはホストに適しています
基本的に2000年代初頭のIT。 ここに誰かを怒らせないことが時々あります
VMまたはDockerコンテナを実行する重要な理由ですが、それらはすべて
レガシーの理由に戻ります。 実際、ますます多くのホストが
自動化するものが少なくなります。 IMO並行しない場合
with_itemsは、ansibleをすべて一緒にスクラップすることもできます。

ここで前向きに考えて使ってみると言っていました
一部のクラウドサービスのdelegate_toは、200以上で実行しようとしたことがないことを意味します
この方法で必要なクラウドコンポーネントは、リストをクエリするだけだと思います
ansibleを使用してhosts形式のhostsファイルにダンプしてから試してください
デリゲート:localhostここで結果をフィードバックします。 それがで動作する場合
少なくとも、回避方法に関するドキュメントプルリクエストを実行できます
with_itemループシリアルはこの方法で発行します。 私たちはへのリンクを持っていることを確認することができます
それらはクラウドモジュールセクションとdockerのセクションにあります。

2018年3月12日月曜日18:49、 BrianCocanotifications @ github.comは次のように書いています。

Ansibleはホストとタスクのみを気にします。あなたがいるイメージを考慮してください
「ホスト」を構築すると、突然両方のパラダイムに適合します。


コメントしたのでこれを受け取っています。
このメールに直接返信し、GitHubで表示してください
https://github.com/ansible/ansible/issues/12086#issuecomment-372422169
またはスレッドをミュートします
https://github.com/notifications/unsubscribe-auth/AJd59nhLIM3s3BL_xM_WwbJS6-uROzjSks5tdsNCgaJpZM4Fx8zF

ファクト収集を無効にするとこの問題は修正されますが、
もう1つ、host_varsには、
の標準。

したがって、resource_group: "{{host_vars [item] ['resource_group']}}"はそうではありません
上記で動作し、リソースグループ名にハードコーディングする必要があります。

2018年3月18日午前11時14分、Isaac Egglestone <
[email protected]>は書いた:

これまでのところ、delegate_toへの小さなテストを作成しました:127.0.0.1 for
これも大規模な問題であるため、削除タスク。

私のプレイブックは次のようになります。

  • ホスト: "{{DeploymentGroup}}"

    タスク:

    • 名前:vmと関連するすべてのリソースを削除します
      azure_rm_virtualmachine:
      resource_group: "{{host_vars [item] ['resource_group']}}"
      名前: "{{inventory_hostname}}"
      状態:不在

    デリゲート_to:127.0.0.1


残念ながら、それでもホストにリストされているマシンに接続しようとします
Azureタスクazure_rm_virtualmachineを実行します。
私はこれを正しく行っていますか? 私は何かが足りないようですが、私はこれを試しました
以前はさまざまな方法でしたので、あなたができることを知りたいだけです
これ。

これは実際に機能しますか? うまくいけば、これは構文の問題にすぎません。

2018年3月12日月曜日午後7時55分、Isaac Egglestone <
[email protected]>は書いた:

Ansibleは、他の多くの目的のための構成管理ツールです。
大量のクラウド向けの、実在および仮想の両方のネットワークデバイス
データベースなどのサービス、弾性豆の木、ラムダなどのWebサービス
そして、IAMセキュリティコンポーネントのようにそれに適用されるすべてのコンポーネントは、
まだほとんどVM /ホストを実行している場合、Ansibleはホストに適しています
基本的に2000年代初頭のIT。 ここに誰かを怒らせないことが時々あります
VMまたはDockerコンテナを実行する重要な理由ですが、それらはすべて
レガシーの理由に戻ります。 実際、ますます多くのホストが
自動化するものが少なくなります。 IMO並行しない場合
with_itemsは、ansibleをすべて一緒にスクラップすることもできます。

ここで前向きに考えて使ってみると言っていました
一部のクラウドサービスのdelegate_toは、200以上で実行しようとしたことがないことを意味します
この方法で必要なクラウドコンポーネントは、リストをクエリするだけだと思います
ansibleを使用してhosts形式のhostsファイルにダンプしてから試してください
デリゲート:localhostここで結果をフィードバックします。 それがで動作する場合
少なくとも、回避方法に関するドキュメントプルリクエストを実行できます
with_itemループシリアルはこの方法で発行します。 私たちはへのリンクを持っていることを確認することができます
それらはクラウドモジュールセクションとdockerのセクションにあります。

2018年3月12日月曜日18:49、Brian [email protected]
書きました:

Ansibleはホストとタスクのみを気にします。あなたがいるイメージを考慮してください
「ホスト」を構築すると、突然両方のパラダイムに適合します。


コメントしたのでこれを受け取っています。
このメールに直接返信し、GitHubで表示してください
https://github.com/ansible/ansible/issues/12086#issuecomment-372422169
またはスレッドをミュートします
https://github.com/notifications/unsubscribe-auth/AJd59nhLIM3s3BL_xM_WwbJS6-uROzjSks5tdsNCgaJpZM4Fx8zF

さて、私はいくつかのことを試すために以下のプレイブックを変更しました。

最初にdelegate_factsを設定してみました:これが役に立った場合はTrueですが、もちろん
ドキュメントに基づいていても、それが機能するとは思っていませんでした。
2番目にgather_factsを設定しました:いいえ、事実を減らすためにセットアップを実行してみました
まったく接続しないことを選択することを期待して何にも集まりませんが、
もちろん、予想通り、それでもマシンに接続しようとしました。
3回目の接続の設定を試みました:ローカルホストですが、奇妙なことに、それでも
マシンにリモート接続して、事実を知っていても事実を収集します
ローカルでプレイを実行します。そこでは少し面倒ですが、ロジックは次のようになります。
他にどのようにして、問題のホストの詳細を実行せずに知ることができますか
これ..

おそらく、プレイブックを使用して、最初にマシンの電源を入れてから、
それらにログインして、不要な事実を収集します。 これはそうなるでしょう
host_varsを機能させてから、マシンを削除できます。 知りたい
誰かがここでより良い解決策を持っているなら、それも非常に時間がかかるからです
100台以上のマシンがあり、それらに電力を供給しなければならない場合の努力
それらを削除するだけです。

これまでのところ、with_items並列の代わりにこれをソリューションとして使用しているのを見ています
解決策は可能性を秘めていますが、問題のマシンはまだ
あなたがあなたの間にazure_rm.pyからの何らかの種類の事実が必要な場合は、アップして到達可能です
これを行うと、少なくとも1つの警告があります。 それは誰かが知らない限りです
標準を介して渡されるazureからhost_varsにアクセスする方法
collect_factsの場合:いいえ

実際、これをすべて使用して実行すると、もちろん同じ問題が発生します。
with_itemsリスト、ただし、私が
再びホストを使用します。 回避策は、azure_rm.pyをにダンプすることです。
コマンドラインでjsonファイルを作成し、変数に読み込んで取得します
それらへのアクセス。

ここでの最終目標を楽しみにして、数百または数千を変更する場合
並列のサーバーレスコンポーネントの場合、おそらくこれは私ができる限り大丈夫でしょう
azure_rm_functionapp_factsなどを使用します
http://docs.ansible.com/ansible/latest/azure_rm_functionapp_facts_module.html

それらについての事実を収集し、理論的には劇でそれらを使用しますが、これは
まだテストされていません。

これを適切に実行して作成する方法については、まだ優れたロジックがありません。
メソッドはこれまでのところ大部分が思われるので、それに関するドキュメントプルリクエスト
あなたが何をしているかに依存し、私は私が使用することを提案したいかどうかわかりません
ドキュメントのjsonダンプハック。

たまたまこれを気にかけている人からのフィードバックをお待ちしています
この問題リストは、私の次のステップを決定するためのものです。 その間、私はハックを使って
私の当面の仕事は終わりました。


  • ホスト: "{{DeploymentGroup}}"
    collect_facts:いいえ
    タスク:

    • 設定:

      collect_subset =!all、!min

    • 名前:vmと関連するすべてのリソースを削除します

      azure_rm_virtualmachine:

      resource_group: "{{host_vars [inventory_hostname] ['resource_group']

      }}」

      名前: "{{inventory_hostname}}"

      状態:不在

      デリゲート:localhost

      デリゲートファクト:True


2018年3月18日午後12時4分、Isaac Egglestone <
[email protected]>は書いた:

ファクト収集を無効にするとこの問題は修正されますが、
もう1つ、host_varsには、
の標準。

したがって、resource_group: "{{host_vars [item] ['resource_group']}}"
上記では機能せず、リソースグループにハードコーディングする必要があります
名前。

2018年3月18日午前11時14分、Isaac Egglestone <
[email protected]>は書いた:

これまでのところ、delegate_toへの小さなテストを作成しました:127.0.0.1 for
これも大規模な問題であるため、削除タスク。

私のプレイブックは次のようになります。

  • ホスト: "{{DeploymentGroup}}"

    タスク:

    • 名前:vmと関連するすべてのリソースを削除します
      azure_rm_virtualmachine:
      resource_group: "{{host_vars [item] ['resource_group']}}"
      名前: "{{inventory_hostname}}"
      状態:不在

    デリゲート_to:127.0.0.1


残念ながら、それでもホストにリストされているマシンに接続しようとします
Azureタスクazure_rm_virtualmachineを実行します。
私はこれを正しく行っていますか? 何かが足りないようですが、やってみました
これは以前はさまざまな方法で行われていたので、次のことができることを知りたいだけです
これを行う。

これは実際に機能しますか? うまくいけば、これは構文の問題にすぎません。

2018年3月12日月曜日午後7時55分、Isaac Egglestone <
[email protected]>は書いた:

Ansibleは、他の多くの目的のための構成管理ツールです。
大量のクラウド向けの、実在および仮想の両方のネットワークデバイス
データベースなどのサービス、弾性豆の木、ラムダなどのWebサービス
そして、IAMセキュリティコンポーネントのようにそれに適用されるすべてのコンポーネントは、
まだほとんどVM /ホストを実行している場合、Ansibleはホストに適しています
基本的に2000年代初頭のIT。 ここに誰かを怒らせないことが時々あります
VMまたはDockerコンテナを実行する重要な理由ですが、それらはすべて
レガシーの理由に戻ります。 実際、ますます多くのホストが
自動化するものが少なくなります。 IMO並行しない場合
with_itemsは、ansibleをすべて一緒にスクラップすることもできます。

ここで前向きに考えて使ってみると言っていました
一部のクラウドサービスのdelegate_toは、200以上で実行しようとしたことがないことを意味します
この方法で必要なクラウドコンポーネントは、リストをクエリするだけだと思います
ansibleを使用してhosts形式のhostsファイルにダンプしてから試してください
デリゲート:localhostここで結果をフィードバックします。 それがで動作する場合
少なくとも、回避方法に関するドキュメントプルリクエストを実行できます
with_itemループシリアルはこの方法で発行します。 私たちはへのリンクを持っていることを確認することができます
それらはクラウドモジュールセクションとdockerのセクションにあります。

2018年3月12日月曜日18:49、Brian [email protected]
書きました:

Ansibleはホストとタスクのみを気にします。あなたがいるイメージを考慮してください
「ホスト」を構築すると、突然両方のパラダイムに適合します。


コメントしたのでこれを受け取っています。
このメールに直接返信し、GitHubで表示してください
https://github.com/ansible/ansible/issues/12086#issuecomment-372422169
またはスレッドをミュートします
https://github.com/notifications/unsubscribe-auth/AJd59nhLIM3s3BL_xM_WwbJS6-uROzjSks5tdsNCgaJpZM4Fx8zF

フォークのユースケースもあります。これにより、これがはるかに簡単になります。 プレイブックは、ランダムに選択されたフローティングIPを使用して、テラフォームを介して多数のopenstackインスタンスをデプロイしています。 次に、ipsを繰り返し処理して、作成された各ホストでポート22が開いていることを確認します。 これを行うための現在の方法は、マルチプレイプレイブックを使用することです。

- hosts: localhost
  connection: local
  gather_facts: no
  tasks:
...
  - name: Run terraform
    terraform:
      plan_file: '{{tf_plan | default(omit)}}'
      project_path: '{{terraform_path}}/{{infra}}'
      state: '{{state}}'
      state_file: '{{stat_tfstate.stat.exists | ternary(stat_tfstate.stat.path, omit)}}'
      variables: '{{terraform_vars | default(omit)}}'
    register: tf_output

  - name: Add new hosts
    with_items: '{{tf_output.outputs.ip.value}}' # configued this in terraform to output a list of assigned ips.
    add_host:
      name: '{{item}}'
      groups: new_hosts

- hosts: new_hosts
  gather_facts: no
  connection: local
  tasks:
   - name: Wait for port 22 to become available
     wait_for:
       host: '{{ansible_host}}'
       port: 22
       state: started
       timeout: 60

これは次のコマンドで実行されます: ansible-playbook -i localhost, deploy-test-clients.yml --extra-vars="infra=terraform_os_instances state=present"
もちろん、これは限定的な回避策です。これは、使用するipの適切なインベントリ解析可能なリストが常にあるとは限らないためです。

多くの人がローカルでファイルをテンプレート化するパフォーマンスに苦労しているように見えるので、代わりにこの特定の問題を解決するために特定のtemplate_localモジュールを作成することができます。 少なくともそれは始まりだろう...私は自分で行くだろうが、予見可能な将来のための時間がないだろう。

jinjaを使用して5秒で実行できる100個のファイルをテンプレート化するための30分以上はばかげています。

@sapllaテンプレートは常にローカルで発生します。リモートで発生するのは、テンプレートのコピーと権限の設定だけです。

明確にするために、ファイルをローカルタスクとしてテンプレート化したいユーザーについて話します。たとえば、他のビルドシステムにフィードしたり、私の場合はkubectlを使用してk8sリソースをデプロイしたりします。

私が言いたいのは、単純なラッパーであるモジュールを介して、ループとテンプレートをjinjaにオフロードすることです。 モジュールは、いくつかのコンテキストとループ定義(通常はwith_nestedとその仲間に入れられるもの)を取り、このタスクのために完全にansibleを切り取ることができます(おそらく、ラッパーは、処理が高速化されれば、jinjaを並行して実行できます) 。

次のように呼び出すことができます。

    template_parallel:
      src: "{{ item[0] }}"
      dest: "{{ tempdir }}/{{ item[1] }}-{{ item[0] | basename }}"
      context: "{{ hostvars[inventory_hostname] }}"
      nested:
      - "{{ templates.stdout_lines }}"
      - "{{ namespaces.stdout_lines }}"

上記の例では、ansibleで定義されたすべての変数をコンテキストとして使用していますが、任意のdictを渡すことができます。

私が言っているように、私は今これに取り組む時間がありませんが、アプローチは実行可能に聞こえますか@bcoca

これは、各アイテムが独立していることを前提としています。常にそうであるとは限りません。現在のアイテムの値を前のアイテムや前の反復の結果に依存させることも、単に累積することもできます。

テンプレート作成に費やされる時間のほとんどは、テンプレート自体ではなく、変数に関係しています。これらは一貫している必要があるため、現在の仮定を破る動作を変更する意思がない限り、並列化で多くを得ることができません。

また、テンプレートは、アイテムごとではなく、ホストごとにすでに並列化されています。

考えてくれてありがとう。 実際には、私のユースケースには十分であり、このスレッドの他の人にも当てはまるようです。 私はansibleを使用して、階層構成とテンプレートファイルをローカルにロードしてから、それらをデプロイするバイナリ(kubectl、helmなど)を呼び出しています。 テンプレート作成時間が数分から数秒に短縮されるほどのパフォーマンスがあれば、非常にシンプルで軽量なテンプレートモジュールに満足します。

誰かが私を殴らない限り、それが私たちにとって問題になるとき、私はこれを見ようとします。

私は最初に#10695を提出しましたが、これがまとまるまでに時間がかかることを確認して、シェルスクリプトを使用してこれらのユースケースに対処することになりました(たとえば、単一のホスト上の50 Gitリポジトリで何かを行う必要があると言うだけで、Ansibleを使用します単一のスクリプトを1回実行すると、50回実行されます)。 残念ながら、これは、非常にきめ細かい変更レポートなど、Ansibleで無料で入手できるものの一部を放棄することを意味します。また、すべての「if only if」ロジックを自分で実装し、エラー処理に細心の注意を払う必要がありますが、おそらく2桁高速です。 そのため、将来的に「並列」オプションを取得することになったとしても、カスタムスクリプトほど高速ではない可能性があり、おそらくそれに切り替える必要はありません。

@wincentの並列ループは、Ansibleが「アクションを適用する」だけではないため、シェルスクリプト/専用プログラムよりも常に低速になる可能性があります。

@bcoca :うん、それは私の理解を確認する。

@saplla k8s_rawは、このためのテンプレートを使用するよりも優れています。必要に応じて、インベントリにyamlをインライン化できます:)(このPRの対象ではありません)
これについての現在の状態は何ですか? 2.6 @bcocaで何かを期待できますか?
DBクラスターで何千ものpostgresql特権を管理していますが、25分は非常に遅いです

@nerzhulありがとうございますが、それは私たちにとって良くありません。 魔法が多すぎる。 テンプレートを作成する必要があります。

@sapilaいつでもテンプレートごとにホストターゲットを作成して、テンプレートを可能な限り並列化し、その後の再生または委任を使用して適切な実際のホストに配信できます。

@bcoca少しハッキー:)

まったくそうではありません、それはたくさんのハッキーですが、今日は機能します

このページは役に立ちましたか?
0 / 5 - 0 評価