一千萬個為什麽

搜索

如何在Ansible中定義常量?



如果在Python中寫一個常量,那麽一個使用大寫

SOME_CONSTANT = "helloworld"

現在我想知道如何在Ansible中定義常量。我的第一印象是使用與Python中相同的約定,因為Ansible是用python編寫的,但當檢查變量信息頁面那麽這似乎不是最佳實踐。

當前方法

https://github.com/030/ansible-firefox/斑點/主/瓦爾/ main.yml

---
firefox_download: /tmp/firefox-{{ firefox_version }}.tar.bz2
firefox_bin: "{{ firefox_home }}/firefox/firefox"

https://github.com/030/ansible-firefox/ BLOB /主/任務/ main.yml

- name: Download.
  get_url:
    url: https://ftp.mozilla.org/pub/firefox/releases/{{ firefox_version }}/linux-x86_64/en-US/firefox-{{ firefox_version }}.tar.bz2
    dest: /tmp/firefox-{{ firefox_version }}.tar.bz2
checksum: "{{ firefox_checksum }}"

討論</強>

我正在考慮定義 https://ftp.mozilla.org/pub/firefox/releases/ {{firefox_version}}/linux-x86_64/en-US/firefox - {{firefox_version}}。tar.bz2 作為 vars/main.yml 中的常量,但我沒有看到任何定義常量的其他ansible角色:

FIREFOX_DOWNLOAD_URL: https://ftp.mozilla.org/pub/firefox/releases/{{ firefox_version }}/linux-x86_64/en-US/firefox-{{ firefox_version }}.tar.bz2

雖然這是有效的python和寫常量的約定。

有人可能會爭辯說,Ansible常量可以在 default/main.yml 中定義,但另一方面,由於CONSTANT是不可變的,因此不應該覆蓋它並且應該駐留在乏/ main.yml </代碼>。

轉載註明原文: 如何在Ansible中定義常量?

一共有 2 個回答:

正如在另一條評論中指出的那樣,python中沒有常量。這只是一個約定,但在大寫字母中定義一個變量,並不意味著你不能重新賦值。

有許多方法可以在ansible中傳遞/定義變量(命令行,在playbook中的 vars ,在角色中包含 yamlvars dir, defaults dir等)但是,沒有辦法定義常量

最接近於設置常量的方法是將變量設置為默認值(即角色結構中的 defaults/main.yml )。角色的默認值是具有最低優先級的變量類型,並且被您可以定義var的任何其他方式覆蓋,但是是一個放置變量的好地方,這個變量不太可能改變並且不會使您的“重要”變得混亂“角色大戰。

關於你定義它們的方式 - 我會說這取決於你。堅持下去。我沒有看到任何人使用大寫字母,我可能會將變量小寫,但是,因為ansible提供了巨大的靈活性和自由度來按照自己喜歡的方式做你想做的事情,這真的取決於你。

Note that SOME_CONSTANT = "helloworld" is just following a PEP8 convention, one can always follow that statement with SOME_CONSTANT = "something_else". Python doesn't really have constants, see How do I create a constant in Python?

我使用小寫(即遵循Python變量命名約定),以防止混淆:

  • 與ansible文檔一致
  • 當(其中一些)內部更改為小寫時,沒有任何意外,例如當地事實(Facts.d)

註意</強>

     

key = value對中的關鍵部分將轉換為小寫   在ansible_local變量中。使用上面的例子,如果是ini   文件在 [general] 部分中包含 XYZ = 3 ,那麽你應該   期望以下列方式訪問它: {{ansible_local.preferences.general.xyz}}   而不是 {{ansible_local.preferences.general.XYZ}} 。這是因為   Ansible使用Python的 ConfigParser ,它傳遞所有選項名稱   通過 optionxform 方法和此方法的默認值   實現將選項名稱轉換為小寫。