2014-03-05 47 views
1

我必須在名爲hc-pg的食譜配方中訪問角色爲pg_client的節點的ip地址。爲了測試目的,我使用了運行列表中同時包含role[pg_client]recipe[hc-pg]的單個節點。 hc-pg有一個配方,它試圖在角色pg_client的節點上搜索。以下是配方代碼:無法搜索節點在廚師食譜配方中的角色

ruby_block "searchnode" do 
    block do 
    pg_client_nodes = search(:node , "chef_environment:#{node.chef_environment} AND role:pg_client") 
    end 
end 

以下是pg_client.json文件

{ 
"name" : "pg_client", 
"description" : "Client which connects to postgres server" 
} 

我使用與流浪者的驅動程序測試廚房,以下是.kitchen.yml

--- 
driver: 
    name: vagrant 

provisioner: 
    name: chef_zero 

platforms: 
    - name: precise64 
    driver: 
    box: precise64-chef 

suites: 
    - name: default 
    roles_path: ../../roles 
    run_list: 
     - role[pg_client] 
     - recipe[hc-pg] 
    attributes: 
    postgresql: 
     config: 
     listen_addresses: "*" 

我已經提到了運行列表中的配方之前的角色。當我第一次收斂節點時,搜索pg_client返回0節點。當同一個節點第二次收斂時,我確實得到了具有pg_client角色的節點。所以我的假設是,在新的運行中,角色不會被應用直到廚師收斂節點。這是一個有效的假設嗎?那麼如何使用角色訪問節點?

+0

角色不應用,直到* *後的第一個廚師運行成功 – sethvargo

+0

我的方法有效嗎?我希望在廚師運行中使用角色。我的用例是獲取角色爲「pg_client」的節點的IP地址。它可以是正在提供的同一個節點。 – Vaibhav

+0

我不知道你的意思。在應用角色之前,您無法搜索應用角色。 – sethvargo

回答

1

通常情況下,節點不會在搜索查詢中返回,直到第一次運行後纔可能出現。

只是可以100%肯定,你也可以嘗試使用關鍵字角色(複數而不是單數),在搜索查詢:

search(:node , "chef_environment:#{node.chef_environment} AND roles:pg_client")