常見問題

這是一些常見問題和回答

我可以為一個任務(task)或劇本(playbook)設定 PATH 或者其它環境變數嗎?

可以通過 environment 關鍵字設定環境變數,可以用在 task 或者 play 上

environment:
PATH: “{{ ansible_env.PATH }}:/thingy/bin” SOME: value

如何處理需要不同賬戶與埠登入的不同機器?

設定清單(inventory)檔案是最簡單的方式

例如,假設這些主機有不同的使用者名稱和埠

[webservers] asdf.example.com ansible_ssh_port=5000 ansible_ssh_user=alice jkl.example.com ansible_ssh_port=5001 ansible_ssh_user=bob

你也可以指定什麼類型的連線。

[testcluster] localhost ansible_connection=local /path/to/chroot1 ansible_connection=chroot foo.example.com bar.example.com

你可能想儲存這些組變數,或者一些變數檔案。 看剩餘的文件獲取更多有關如何組織變數的資訊

如何讓 ansible 重用連線,啟用 Kerberized SSH,或者讓Ansible 注意本地的 SSH config 檔案。

轉換預設連線類型,在配置檔案裡面設定為,’ssh’,或者使用 ‘-c ssh’選項使用OpenSSH連線,而不是python的paramiko庫。在 Ansible 1.2.1之後,’ssh’會預設使用。

paramiko在剛開始的時候是不錯的,但是OpenSSH提供更多的高階選項。如果你正在使用這種連線類型的話,你可能會想在一個支援 ControlPersist 的新機器上執行 Ansible。你同樣可以管理老的客戶端。如果你正在用 RHEL6,CentOS6,SLES 10或 SLES 11,OpenSSH的版本仍然有些過時,因此考慮使用Fedora或OpenSUSE客戶端來管理節點,或者使用paramiko。

我們預設讓paramiko作為預設選項,如果你第一次安裝Ansible在一個EL box上,它提供了更好的使用者體驗。

如何在EC2內加速管理?

不要試著用你的膝上型電腦管理一群 EC2 機器。連線到EC2內的管理節點然後在裡面執行Ansible

如何處理遠端機器上沒有 /usr/bin/python 路徑?

儘管你可以使用其他語言編寫 Ansible 模組,但大部分 Ansible 模組是用 Python 寫的 ,而且一些事非常重要的核心模組

預設情況下, Ansible 假定它可以在遠端機器上找到 2.x版本以上的 /usr/bin/python ,指定為2.4或者更高的版本。

設定 inventory 變數 ‘ansible_python_interpreter’ ,允許 Ansible自動替換掉預設的 python直譯器。因此你可以指向任何版本的 python ,儘管/usr/bin/python不存在

一些 Linux 作業系統,例如 Arch 可能預設安裝的是 Python 3. 這會讓你在執行模組的時候出現語法錯誤資訊。 Python 3和 Python 2 在本質上還是有些區別的。Ansible 當前需要支援哪些更老版本的 Python 使用者,因此還沒有支援 Python 3.0。這不是一個問題,只需要安裝 Python2 就可以解決問題。

當 Ansible 或 Python3.0 後來變得更加主流的時候,會支援Python 3.0

不要替換 python 模組的 shebang 行,Ansible 在部署的時候會自動處理。

讓內容重用和重新分發的最好方式是什麼?

如果你還沒有做好, 請閱讀 playbooks 文件的 “Roles” 部分。 這會讓你更好的理解 playbook 的內容。(This helps you make playbook content self-contained, and works well with things like git submodules for sharing content with others.)

如果你對這些外掛很陌生,檢視 API 文件獲取更多的有關擴充套件 Ansible 的細節資訊 .. _configuration_file:

配置檔案在那個地方,我如何配置它?

Ansible的配置檔案.

如何禁止 cowsay?

如果你確定你想執行在沒有cowsay的環境下,你可以解除安裝 cowsay,或者設定環境變數

export ANSIBLE_NOCOWS=1

How do I see a list of all of the ansible_ variables? 如何檢視所有的 ansible_variables? ++++++++++++++++++++++++++++++++++++++++++++++++++++++

預設情況下,Ansible 收集 有關機器的 “facts” ,這些 facts 可以被Playbook或templates訪問。想要檢視相關機器的所有的facts,執行 “setup” 模組。

ansible -m setup hostname

這會列印指定主機上的所有的字典形式的facts。

如何遍歷某一組內的所有主機,在模板中?

一個通用的做法是遍歷組內的所有主機,你可以訪問 “$groups” 字典在模板中,就像這樣

{% for host in groups[‘db_servers’] %}
{{ host }}

{% endfor %}

如果你需要訪問有關這些主機的 facts ,例如每個主機的IP地址,你需要確保 facts 已經被 populated 了。例如

  • hosts: db_servers tasks:

    • # doesn’t matter what you do, just that they were talked to previously.

然後你可以使用 facts 在模板裡面,就像這樣

{% for host in groups[‘db_servers’] %}
{{ hostvars[host][‘ansible_eth0’][‘ipv4’][‘address’] }}

{% endfor %}

如何以程式設計方式訪問變數名

可能出現這種情況,我們需要一個任意的ipv4地址介面,同時這個介面是通過角色提供參數或其他輸入提供的。變數名可以通過組合字元串來構建,就像這樣:

{{ hostvars[inventory_hostname]['ansible_' + which_interface]['ipv4']['address'] }}

這個遍歷主機變數的技巧是必要的,因為它是一變數名稱扣減的字典。’inventory_hostname’ 是一個神奇的變數,因為它告訴你你在主機組迴圈中當前的主機是誰。

如何訪問組內第一個主機的變數?

如果我們想要在 webservers 組內的第一個 webserver 的 ip 地址怎麼辦?我們可以這麼做。注意如果再使用動態 inventory , ‘first’ 的主機可能不會一致 ,因此你不希望這樣,除非你耳朵 inventory 是靜態。(如果你在用 Ansible Tower,它會使用資料庫指令,因此這不是個問題儘管你正在使用基於雲環境的 inventory 指令碼)

這裡是技巧:

{{ hostvars[groups[‘webservers’][0]][‘ansible_eth0’][‘ipv4’][‘address’] }}

注意我們如何獲得 webserver 組內的第一臺機器的主機名的。如果你也在在模板中這麼做,你可以用 Jinja2 “#set” 指令來簡化這,或者在一個基本中,你也可以設定 fact

  • set_fact: headnode={{ groups[[‘webservers’][0]] }}
  • debug: msg={{ hostvars[headnode].ansible_eth0.ipv4.address }}

注意我們如何交換花括號的語法點(Notice how we interchanged the bracket syntax for dots)。

如何遞迴的寶貝檔案到目標主機上?

“copy” 模組有遞迴的參數,如果你想更加高徐璈的處理大量的檔案,看一下 “synchronize”模組,封裝了rsync。自行看一些模組索引獲取一些他們的資訊。

如何檢視 shell 環境變數?

如果是隻是想看看,使用 env 檢視。例如,如果想檢視在管理機器上 HOME 環境變數的值。

— # ...

vars:
local_home: “{{ lookup(‘env’,’HOME’) }}”

如果你是想設定環境變數,檢視高階的有關環境的 Playbook 部分。

Ansible 1.4 will also make remote environment variables available via facts in the ‘ansible_env’ variable:: Ansible1.4也會讓遠端的環境變數可用通過 facts 在 ‘ansible_env’ 變數。

{{ ansible_env.SOME_VARIABLE }}

如何為使用者模組生成加密密碼?

mkpasswd工具在大多數linux系統上都可以使用,是一個不錯的選項

mkpasswd –method=SHA-512

如果這個工具在你係統上面沒安裝,你可以簡單的通過 Python 生成密碼。首先確保 Passlib 密碼哈西庫已經安裝了。

pip install passlib

一旦庫準備好了,SHA512密碼值可以被生成通過下面命令生成。

python -c “from passlib.hash import sha512_crypt; import getpass; print sha512_crypt.encrypt(getpass.getpass())”

如何獲得Ansible培訓到商業支援?

Yes! 看我們的 services page 獲得更多的資訊關於我們的服務和培訓服務。支援也包含在 Ansible Tower 。發郵件到`info@ansible.com <mailto:info@ansible.com>`_ 獲取更深的細節。

我們也會提供免費的培訓課程在基礎上。 看 webinar page 獲得更多資訊在下面的研討會上。

有網路介面 / REST API / etc?

Yes!Ansible 做了很好的產品讓 Ansible 更加的強大容器使用,看 Ansible Tower

如何提交文件改變資訊?

不錯的問題! Ansible 文件儲存在主項目git 源下面,指導貢獻可以在 docs README `viewable on GitHub <https://github.com/ansible/ansible/blob/devel/docsite/README.md>`_找到。謝謝!

如何加密我的劇本資料?

如果你想加密資料,仍然想要在源碼控制上分享給大家。看 Vault.

在 Ansible 1.8後,如果你有一個任務,你不想顯示結果,或者給了命令 -v 選項,下面的例子很有用

  • name: secret task shell: /usr/bin/do_something –value={{ secret_value }} no_log: True

這個對保持詳細的輸出,但是從其他人那裡隱藏了敏感的資訊。

no_log屬性也可以應用在整個 play 裡面。

  • hosts: all no_log: True

儘管這回讓play很難偵錯。推薦使用這個應用到單一任務上。

在這裡我沒看到我的問題

請看下面的部分連結到 IRC 和 Google Group,你可以在那裡提問你的問題。

See also

Ansible 文件
The documentation index
Playbooks
An introduction to playbooks
最佳實踐
Best practices advice
User Mailing List
Have a question? Stop by the google group!
irc.freenode.net
#ansible IRC chat channel