2016-02-04 35 views
2

我開始使用Ansible來編寫將爲我們的應用程序部署臨時環境的劇本。 我試圖瞭解是否應用對文件進行更改的最佳做法是在控制機器上本地更改它們,然後將它們傳播到遠程服務器,或者是否應在劇本中操作文件。使用lineinfile和blockinfile編輯文件或僅使用模板複製整個文件?

在可讀性和文檔方面,通過操作手冊操作文件似乎更好,並且整個配置過程的整個配置過程保持爲一個工具。另一方面,更改本地服務器上的文件更容易,更快速。

什麼是解決這些問題的最好方法是什麼?

謝謝, Yaron。

回答

2

歡迎Ansible!

我想你應該看看模板。切勿在本地更改文件並部署它們。您的部署不應該在本地更改任何文件!

如果您有一個配置文件,請爲該文件編寫一個模板並在其中渲染一些變量以更改已部署應用程序的配置。模板模塊將直接將文件呈現給您的服務器。

+0

在這種情況下,我試圖改變/ etc/hosts文件,該文件也是一個很好的候選人的模板? 謝謝! –

+0

您是否更改本地或遠程maschine上的主機文件? 在遠程機器上,您應該爲此任務使用'lineinfile'。如果你想替換整個文件,模板是一個很好的解決方案。但我想你想添加內容 –

1

使用lineinfileblockinfile (ansible > 2.0)。它更清潔,便攜,可以從任何控制機器運行。但是當區塊巨大時也有例外。

+0

其實模板原來是最好的工具,IMO。 –

0

模板應該是你去到。他們更簡單的工作,並且你知道主機一旦運行劇本就會有精確的配置。

我發現自己伸手lineinfileblockinfile作爲備用,當我有關於這一點我需要保留許多主機多次更改文件的遺留系統。

儘可能將模板呈現到Linux上的配置目錄。例如。不使用lineinfile/etc/sudoers與帳戶添加管理員賬戶,呈現模板/etc/sudoers.d/administrators

0

至於其他的答案已經告訴你,在copytemplate模塊來處理與Ansible配置文件的首選方式。

它們允許您預先準備整個文件,然後將其移動到您的服務器(它們之間的區別是template模塊允許您使用變量,而copy模塊將文件原樣複製)。

由於您完全控制了文件,因此不會有任何意外。

不過,也有(往往不是),禁止使用這些模塊的情形:

  • 不同的角色操縱相同的文件
  • 與遺留系統
  • 孤男寡女不同版本的文件爲不同的服務器(在某種程度上)

在這種情況下,我喜歡用lineinfile模塊中的防彈方式:

  • 首先刪除指令的所有ocurrences除了要添加
  • 然後,在一個特定的地方

添加行作爲一個例子,拿sshd_config文件中的一個。你可能想確保你的服務器僅偵聽IP地址1.2.3.4

- name: Remove lines with unwanted occurrences of ListenAddress 
    lineinfile: dest=/etc/ssh/sshd_config 
       regexp="^ListenAddress (?!1\.2\.3\.4)" 
       state=absent 

- name: Listen on 1.2.3.4 
    lineinfile: dest=/etc/ssh/sshd_config 
       line="ListenAddress 1.2.3.4" 
       insertafter="^#?AddressFamily" 

的第一個任務刪除的ListenAddress每次發生不指定我們想要的IP(使用名爲negative lookahead正則表達式構造)。

第二個任務然後將正確的指令(ListenAddress 1.2.3.4)直接插入以AddressFamily(註釋與否)開頭的行之後。

這樣,您的任務保持冪等性,您可以確定在您不知道的文件中沒有ListenAddress指令。

如果你需要更多的細節,我寫了an article關於這個話題。如果你正在嘗試部署的應用程序是用Rails編寫的,你可能會對我寫的關於這個主題的書Efficient Rails DevOps感興趣。