2016-12-07 36 views
0

我有一個劇本,我希望只運行當指定了預期的系統組時。雖然我通過運行Ansible劇本時需要組選項

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

我能夠指定一組(本例中是「分期」)有跡象表明,都會運行,如果-l staging被拆除其他羣體。我意識到我可以爲- hosts: "*"被更改爲相應的組的每個組創建另一個劇本,但其餘所有劇本都是相同的。有沒有辦法做到這一點沒有複製/複製pasta'ing一切?

有關其他方面這裏是我的當前設置路徑結構

. 
├── 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

@KonstantinSuvorov感謝您採取正確的行動方式 - 您是否介意以答案的形式提供示例。我試圖用我當前的設置創建單獨的清單,並按照您提到的方式指定,但是我得到了[警告]:找不到主機文件:staging' - 我在上面添加了額外的上下文重要。 – Marc

+0

你說你想讓劇本只在指定特定組時運行,然後在那之後你說「如果刪除了-l分段,還有其他組都會運行」。這表明如果忽略-l GROUP_NAME,劇本的其他部分將運行。 – Petro026

回答

1

我收到的最佳答案是「我認爲是錯誤的」,並且目前被我們接受的方式是使用多個庫存文件。每個人都有自己的一組類似組。

第一:更改庫存設置來模仿

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

二:更新ansible.cfg文件,以反映新的默認清單文件

[defaults] 
inventory = inventory/default 
... 

三:更新默認hosts文件(../inventory/defaults/hosts)至此

# intentionally empty 

第四:然後進行呼叫指定備用清單文件(而不是一個不同的組)

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

注:嘗試在不指定庫存運行劇本(即:ansible-playbook ./playbooks/setup.yml)將提前結束/突然如期望

注:使用i(替代清單文件),而不是l(SPE cifying group)

0

將stage和prod庫存分成單獨的文件有很多好處,但有一個用例和一個體面的方法來選擇一個組或主機在執行時像你描述的那樣運行。

這樣做的一種方式是將組名稱作爲變量傳遞 - 在與我一起工作的Ansible環境中,我們規定了劇本對變量subset運行,並且我們將其與--extra-vars(shortform: -e)參數在劇本調用。因此,要調用劇本,請運行命令行ansible-playbook -i inventory/staging -e subset=my-group playbook.yml

大多數劇本只想再次運行特定的邏輯主機組,因此要保留該限制,您可以使用Ansible patterns指定兩個組的交集,例如:webservers:&{{ subset }}。這可以讓你避免嘗試在你的Linux主機上安裝IIS,同時保持這種靈活性以選擇在劇本調用時運行什麼......

作爲一個附註,由set_fact模塊won't work here設置的變量。這是因爲當Ansible解釋器計算出哪些主機需要運行整個遊戲時,屬於單個主機的變量不會被解釋。