2013-12-18 118 views
4

我有一個工作木偶配置來幫助在機器上安裝mysql實例。我的環境設置爲在同一臺計算機上運行多個實例(具有不同的configs/ports/etc)。讓木偶有條件地執行多個命令

基本設置我有一個清單看起來像

File{ 
    owner => $owner, 
    group => $group, 
    before => Exec["mysql_install_db-${name}"], 
} 

exec{"mysql_install_db-${name}": 
    creates => "/var/lib/mysql/${name}/mysql", 
    command => "/usr/local/percona/mysql-${version}/usr/bin/mysql_install_db --user=mysql --datadir=/var/lib/mysql/${name} --basedir=/usr/local/percona/mysql-${version}/usr", 
    logoutput => true, 
} 

這工作完全正常,但現在我想修改該安裝程序運行一些後續命令來引導新的一些內部安裝存儲過程以及我們爲新安裝做的其他「準備工作」。

的命令將基本上像

mysql -u user < /path/to/bootstrap1.sql 
mysql -u user < /path/to/bootstrap2.sql 
mysql -u user < /path/to/bootstrap3.sql 

我只希望這些運行一次,mysql_install_db的命令之後,但略低於同一個「創造」後衛。

我發現了一些僅僅將數組傳遞給command參數的引用,但引用的形式並不總是一致地工作。

完成這樣的事情的首選方法是什麼,並確保命令按確定的順序執行並且僅在運行mysql_install_db之後執行?

回答

6

有幾種方法來運行exec只有一次,"mysql_install_db-${name}"後才:

  • 只要改變命令行添加其他所有的命令(cmd1 && cmd2 && cmd3 ...)。
  • 使用unlessonlyif參數,以便在運行命令之前檢查您的存儲過程或任何已存在的參數。這可能很複雜,因此另一種方法是使命令創建一個文件("command && touch /root/blah-${name}")並使用creates參數。
  • refreshonlysubscribe設置爲之前的exec。

儘管所有這些解決方案都可行,但您不會尊重Puppet描述系統最終狀態的精神。對於數據庫,用戶和授權設置,您可以使用puppetlabs-mysql模塊,這可讓您以自然的方式描述它們。存儲資源是另一個問題,可能與應用程序部署過程邏輯上打包在一起(因爲它們必須與應用程序保持同步)。如果這是不可能的,那麼你可以使用條件使你的SQL腳本是冪等的。

+1

用於冪等SQL腳本的+1。我曾經用'create'命令創建一個文件,指示數據庫不應再被觸摸,但最終在我的腳本中解決了「DROP ... IF EXISTS」和「CREATE IF NOT EXISTS」,現在已經有了安心。 – xiankai