【Ansible 文檔】【譯文】常見問題

http://docs.ansible.com/ansible/latest/faq.htmlhtml

  • 如何爲一個task或者整個Playbook設置PATH或者任意其餘環境變量?

  經過environment關鍵詞設置環境變量,能夠在task或者play層級使用:node

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

注意:自從2.0.1開始,gather_facts  setup 任務,也會從play中繼承環境指令,你也許須要使用 | 默認過濾器來避免錯誤,若是在play級別設置環境變量python

  • 如何爲不一樣主機設置不一樣的用戶名和密碼、端口等等?

  設置主機清單變量,在清單文檔中是最簡單的方式:web

注意:Ansible已經棄用ansible_ssh_useransible_ssh_host, and ansible_ssh_port 中的「ssh」,成爲 ansible_useransible_host, and ansible_port。shell

若是你正在使用2.0之前的版本,你應該繼續使用老風格的變量名。短變量名會被忽略。數據庫

  舉個例子,假設主機有不一樣的用戶名和端口編程

[webservers]
asdf.example.com  ansible_port=5000   ansible_user=alice
jkl.example.com   ansible_port=5001   ansible_user=bob

  也能夠指定不一樣的鏈接方式:centos

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

  也能夠分文件分組定義變量: host_vars/<hostname>、 group_vars/<groupname>服務器

 

  • 如何讓Ansible重用鏈接,啓用kerberized SSH,或者讓Ansible注意到本地的ssh config文件?

  轉換默認鏈接類型,在配置文件裏面設置爲,’ssh’,或者使用 ‘-c ssh’選項使用OpenSSH鏈接,而不是python的paramiko庫。在 Ansible 1.2.1以後,’ssh’會默認使用。ssh

  paramiko在剛開始的時候是不錯的,可是OpenSSH提供更多的高級選項。若是你正在使用這種鏈接類型的話,你可能會想在一個支持 ControlPersist 的新機器上運行 Ansible。

  你一樣能夠管理老的客戶端。若是你正在用 RHEL6,CentOS6,SLES 10或 SLES 11,OpenSSH的版本仍然有些過期,所以考慮使用Fedora或OpenSUSE客戶端來管理節點,或者使用paramiko。

  咱們默認讓paramiko做爲默認選項,若是你第一次安裝Ansible在一個EL box(rhel/centos)上,它提供了更好的用戶體驗。

 

  • 如何配置跳板機來訪問我沒有直接訪問權限的服務器

  使用Ansible 2,你能夠設置ProxyCommand用ansible_ssh_common_args 主機變量,任何指定的參數值被添加到sftp/scp/ssh命令行。

  舉個例子:

[gatewayed]
foo ansible_host=192.0.2.1
bar ansible_host=192.0.2.2

  能夠建立組變量,group_vars/gatewayed.yml 能夠設置爲下面的內容:

ansible_ssh_common_args: '-o ProxyCommand="ssh -W %h:%p -q user@gateway.example.com"'
  • 如何處理遠端機器沒有Python 2.x在/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 在部署的時候會自動處理。

  • 肯定配置文件位置

  這裏

  • 如何查看全部的ansible_開頭的變量列表

  Ansible 默認收集被管理的機器的 「facts」 。而且這些facts能夠在Playbook和template中訪問。爲了查看某一臺及其能夠訪問的全部facts,能夠運行「setup」模塊:

ansible -m setup hostname

  這回打印一個字典,對於某個特定主機全部能夠獲取的facts。

  • 如何查看個人主機全部已定義的清單變量

  運行下面的命令,你能夠看到你在inventory定義的變量結果。

ansible -m debug -a "var=hostvars['hostname']" localhost
  • 如何遍歷一個組的主機列表,在一個模版中

  一個廣泛的任務是遍歷主機組內的主機列表,多是爲一組服務器填充模版配置文件。能夠按照以下的方式使用:

{% for host in groups['db_servers'] %}
    {{ host }}
{% endfor %}

  若是你須要訪問那些主機的facts,例如,每個主機的ip地址,你須要確保facts已經被填充。

  例如,確保你有一個與db_servers通訊的play:

- hosts:  db_servers
  tasks:
    - debug: msg="doesn't matter what you do, just that they were talked to previously."

  而後,你能夠在template中使用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’ 是一個神奇的變量,由於它告訴你你在主機組循環中當前的主機是誰。

  • 如何訪問組中第一臺主機的變量

  假設若是咱們須要web服務器組中第一臺web服務器的ip地址怎麼作?注意,若是你使用了動態的inventory,第一臺host可能不是肯定的,所以你可能不但願這樣作,除非你的inventory是靜態的或者可預期的。

  ps: 若是你使用Ansible Tower,他會使用數據庫順序,所以這不是一個問題即便你使用的是基於雲的inventory腳本。

  以下:

{{ hostvars[groups['webservers'][0]]['ansible_eth0']['ipv4']['address'] }}

  注意,咱們如何得到 webserver 組內的第一臺機器的主機名。若是你也在在模板中這麼作,你能夠用 Jinja2 「#set」 指令來簡化,或者在一個playbook中,你也能夠set_fact

- set_fact: headnode={{ groups[['webservers'][0]] }}

- debug: msg={{ hostvars[headnode].ansible_eth0.ipv4.address }}
  • 如何遞歸的複製文件到目標主機

  copy模塊有遞歸參數,若是你想更加高效的處理大量的文件,看一下 「synchronize」模塊,封裝了rsync。自行看一些模塊索引獲取一些他們的信息。

  • 如何訪問shell環境變量

  若是你須要訪問存在的變量,使用env lookup 插件。例如:

---
# ...
  vars:
     local_home: "{{ lookup('env','HOME') }}"

  若是你須要設置環境變量,移步Advanced Playbooks部分,關於環境。

  自從Ansible 1.4起,遠程環境變量是可得到的,經過facts中ansible_env的變量:

{{ ansible_env.SOME_VARIABLE }}
  • 如何爲用戶模塊產生加密的密碼

  mkpasswd 工具在大部分Linux下均可以使用,是一個很好的選擇:

mkpasswd --method=sha-512

  若是上述的工具沒有安裝,你仍然可使用Python來產生密碼,可是首相確保 Passlib 的Python庫已安裝。

pip install passlib

  若是庫已經安裝,按照以下方式產生密碼:

python -c "from passlib.hash import sha512_crypt; import getpass; print sha512_crypt.using(rounds=5000).hash(getpass.getpass())"

  使用集成的  Hashing filters 來產生一個hash版本的密碼。你不該該在你的Playbook或者host_vars使用普通的文本密碼,相反, Using Vault in playbooks 來加密敏感數據

  •  何時使用 {{}}。如何插入變量或動態變量名

  一個固定的規則是:「老是使用{{}},除了使用when:的時候」。條件性的老是經過Jinja2運行來解析表達式,所以,when: /fail_when: /changed_when: 老是模版化的,而且避免添加{{}}。

  在大部分其餘狀況下,你應該使用括號,即便你可使用變量而不須要指定(像with_clauses),由於這使得很難區分未定義變量和一個字符串。

  下面這種疊加的方式不起做用:

{{ somevar_{{other_var}} }}

  若是你須要使用動態變量,恰當地使用hostvars或者vars字典:

{{ hostvars[inventory_hostname]['somevar_' + other_var] }}
相關文章
相關標籤/搜索