常見問題¶
這是一些常見問題和回答
我可以為一個任務(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