2016-01-14 137 views
2

我想讓廚師交換官方rubygems回購與我自己的本地。它有用,但讓我們說'不總是'。更多關於下面的內容。廚師跑VS廚師系統下 - 不同的寶石回購

bash-4.2$ /opt/chef/embedded/bin/gem sources 
*** CURRENT SOURCES *** 

https://rubygems.org/ 

廚師在systemd的控制下運行。當我在雜誌上檢查什麼廚師迄今所做我得到

Jan 14 07:39:24 myserver.srv chef-client[32274]: [2016-01-14T07:39:24+01:00] INFO: Processing execute[add_my_own_repo] action run (mycookbook::gem line 5) 
Jan 14 07:39:24 myserver.srv chef-client[32274]: [2016-01-14T07:39:24+01:00] INFO: Processing execute[Guard resource] action run (dynamically defined) 
Jan 14 07:39:24 myserver.srv chef-client[32274]: [2016-01-14T07:39:24+01:00] INFO: execute[Guard resource] ran successfully 
Jan 14 07:39:24 myserver.srv chef-client[32274]: [2016-01-14T07:39:24+01:00] INFO: Processing execute[del_official_https_rubygems_repo] action run (mycookbook::gem line 10) 
Jan 14 07:39:24 myserver.srv chef-client[32274]: [2016-01-14T07:39:24+01:00] INFO: Processing execute[Guard resource] action run (dynamically defined) 

我的食譜mycookbook的代碼::寶石如下

execute 'add_my_own_repo' do 
    command '/opt/chef/embedded/bin/gem sources --add http://myrepo' 
    not_if '/opt/chef/embedded/bin/gem sources --list | grep myrepo' 
end.run_action(:run) 

execute 'del_official_https_rubygems_repo' do 
    command '/opt/chef/embedded/bin/gem sources --remove https://rubygems.org/' 
    only_if '/opt/chef/embedded/bin/gem sources --list | grep https://rubygems.org' 
end.run_action(:run) 

如果我再我檢查寶石源列表我會得到

bash-4.2$ /opt/chef/embedded/bin/gem sources 
*** CURRENT SOURCES *** 

https://rubygems.org/ 

不幸的是到目前爲止沒有任何改變。現在,如果我直接從控制檯運行廚師客戶端,我最終會看到廚師正在做我想做的事情。

Recipe: mycookbook::gem 
    * execute[add_my_own_repo] action run 
    - execute /opt/chef/embedded/bin/gem sources --add http://myrepo 
    * execute[del_official_https_rubygems_repo] action run 
    - execute /opt/chef/embedded/bin/gem sources --remove https://rubygems.org/ 

當我打開調試模式下,我注意到廚師聲稱條件不成立

DEBUG: Skipping execute[del_official_https_rubygems_repo] due to only_if command `gem sources --list | /usr/bin/grep https://rubygems.org` 

問心無愧?我做了一些進一步的調查,並在絕望中加入配方

execute 'CHEF_ENV' do 
    command 'env >> /tmp/chef_env' 
    end.run_action(:run) 

    execute 'GEM_SOURCES' do 
    command 'gem sources --list >> /tmp/chef_gem_sources' 
    end.run_action(:run) 

現在,當我檢查我被徹底搞糊塗

cat chef_gem_sources 
*** CURRENT SOURCES *** 

http://myrepo 

最後,在/ tmp/chef_env我發現的/ tmp/chef_gem_sources內容HOME = /。當我自己啓動廚師客戶時顯然是HOME =/root。它有很大的不同,因爲.gemrc有兩個位置,並且在sources部分可能有不同的值。

+0

使用grep的完整路徑,因此您確定它不是父環境PATH中的PATH問題。我很確定'env -i/opt/chef/bin/chef-client'也會失敗。 – Tensibai

+0

我記錄了文件chef-cllient所具有的$ PATH變量的值。一切安好。沒有必要使用grep的完整路徑。 – Zenith

+0

在您的systemd啓動中添加-l調試,以便您在日誌中獲得更多信息。如果grep行爲正常,我看不到任何理由。 – Tensibai

回答

1

兩個問題。首先你要在你的兩個執行資源上放action :nothing,這樣它們不會在編譯和收斂時發生。其次,由於Chef在確定輸出樣式時檢查stdout是否是TTY,輸出會有所不同。如果是TTY,則會得到新的格式化程序輸出,否則您將獲得記錄器輸出。

+0

感謝您的回覆。儘管如此,它仍然沒有幫助。 – Zenith