http://docs.ansible.com/ansible/latest/faq.htmlhtml
經過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_user
,ansible_ssh_host
, andansible_ssh_port
中的「ssh」,成爲ansible_user
,ansible_host
, andansible_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>服務器
轉換默認鏈接類型,在配置文件裏面設置爲,’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"'
儘管你可使用其餘語言編寫 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 默認收集被管理的機器的 「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。自行看一些模塊索引獲取一些他們的信息。
若是你須要訪問存在的變量,使用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] }}