2016-12-07 11 views
0

実行したいプレイブックがあります。対象のシステムグループが指定されています。私はAniableプレイブックを実行するときにグループオプションが必要

ansible-playbook ./playbooks/setup.yml -l staging 

を経由して(この例では、それは「ステージング」だ)グループを指定することができていますが-l stagingが削除された場合は、すべて実行します他のグループがあります。私は- hosts: "*"がそれぞれのグループに変更されたグループごとに別のプレイブックを作ることができることを理解していますが、残りのプレイブックはすべて同じです。すべてを複製/コピー - パスタなしでこれを行う方法はありますか?ここで追加のコンテキストについては

は私の現在の設定パス構造

. 
├── ansible.cfg 
├── inventory 
│   ├── group_vars 
│   ├── host_vars 
│   └── hosts 
├── playbooks 
│   └── setup.yml 
└── roles 
    ├── common 
    │   ├── README.md 
    │   ├── defaults 
    │   │   └── main.yml 
    │   ├── meta 
    │   │   └── main.yml 
    │   ├── tasks 
    │   │   ├── main.yml 
    │   │   └── redhat.yml 
    │   └── templates 
    ├── ... 
    │   
    └── ... 

であり、これはsetup.yml内容

--- 
- hosts: "*" 
    vars_prompt: 
    - name: ... 
     prompt: "..." 
     default: false 
     private: no 
    - name: "bar_a" 
     prompt: "..." 
     default: false 
     private: no 
    ... 
    roles: 
    - { role: foobar, foo: 'bar', foo_a: bar_a} 

の大まかな概要であり、ここで私のansible.cfgファイル

の内容です
[defaults] 
inventory = inventory 
roles_path = roles:$PROJECT_HOME/roles 
forks = 10 
timeout = 15 
host_key_checking = False 
#log_path=./log/ansible.log 
retry_files_enabled = False 
callback_whitelist = profile_tasks 
transport = smart 
gathering = smart 
fact_caching = jsonfile 
fact_caching_connection = ./.factcache 
fact_caching_timeout = 86400 

[ssh_connection] 
ssh_args = -C -o ControlMaster=auto -o ControlPersist=60s -o ForwardAgent=yes 
pipelining = true 
+0

このケースでは、異なるインベントリを持ち、 '-i staging'でプレーブックを実行することになっています。 –

+0

@ ConstantinSuvorov正しい行動様式に感謝します。回答の形で例を挙げてください。私は現在の設定で別のインベントリを作成し、あなたが言及したように指定しようとしましたが、 '[警告]:ホストファイルが見つかりません:ステージング' - 私は、重要。 – Marc

+0

あなたは、特定のグループが指定されているときにのみ、プレイブックを実行させ、その後に「-lステージングが削除された場合には、他のグループが実行されます。これは、-l GROUP_NAMEが省略された場合、プレイブックの他の部分が実行されることを示唆しています。 – Petro026

答えて

1

私が受け取った最良の現在の回答私が「間違っている」ということです。現在受け入れていることは、複数のインベントリファイルを使用することです。それぞれには同じようなグループの独自のセットがあります。

まず:変更インベントリの設定は模倣する

. 
├── ansible.cfg 
├── inventory 
│   ├── default 
│   │   ├── ... 
│   │   └── hosts 
│   └── staging 
│    ├── ... 
│    └── hosts 
: 

第二:更新新しいデフォルトのインベントリファイル

[defaults] 
inventory = inventory/default 
... 

第三に反映するansible.cfgファイル:更新デフォルトのhostsファイルを(../inventory/defaults/hosts)〜this

# intentionally empty 

第四:その後、(代わりに、別のグループの)代替インベントリファイルを指定するコール

ansible-playbook ./playbooks/setup.yml -i inventory/staging 

NOTEますインベントリー(すなわち:ansible-playbook ./playbooks/setup.yml)を指定せずに脚本を実行しようとする試みを意志i(代替インベントリファイル)を使用していないl(SPE:早期/突然希望

NOTEとして終了

0

ステージとプロードのインベントリを別々のファイルに分割することには多くの利点がありますが、実行時に実行するグ​​ループやホストを選択するためのユースケースと適切な方法があります。

変数としてグループ名を渡すことができます - 私が扱う危険な環境では、変数subsetに対してプレイブックを実行し、--extra-vars(ショートフォーム: -e)引数を使用します。プレイブックを呼び出すには、コマンドラインansible-playbook -i inventory/staging -e subset=my-group playbook.ymlを実行します。

ほとんどのプレイブックは特定の論理ホストグループだけを再実行したいので、その制限を維持するためにAnsible patternsを使用して2つのグループの共通部分を指定することができます(例:webservers:&{{ subset }})。これにより、あなたのLinuxホストにIISをインストールしようとするのを避けることができます。その間に、プレイブックの呼び出し時に実行するものを選択する柔軟性を保ちます...

set_factモジュールによって設定される変数won't work here。これは、個々のホストに属している変数が、どのホストが全体の対戦を行うかを考えているときに、Aniableインタプリタによって解釈されないためです。

関連する問題