同時可以在您的基礎設施中對多個系統進行安全解決。 它可以通過選擇Ansible的inventory中列出的系統部分,默認保存在/etc/ansible/hosts
。 您可以使用命令行上的-i <path>
選項指定其他inventory文件。
此inventory不僅可以配置,還可以同時使用多個inventory文件,並從動態inventory中描述,從動態或雲源中提取inventory。 在2.4版中引入,Ansible具有inventory插件,使其靈活可定制。
Hosts and Groups
inventory文件可以是許多格式之一,具體取決於您擁有的inventory插件。 對於這個例子, /etc/ansible/hosts
的格式是一個INI(類似於Ansible的默認設置),如下所示:
mail.example.com [webservers] foo.example.com bar.example.com [dbservers] one.example.com two.example.com three.example.com
括號中的標題是組名稱,用於分類系統,並決定您在什么時間控制哪些系統以及用於什么目的。
將系統放在多個組中是可以的,例如服務器可以是一個webserver和一個dbserver。 如果你這樣做,請注意,變量將來自他們所屬的所有組。 可變優先級在后面的章節中有詳細介紹。
如果您擁有運行在非標准SSH端口上的主機,可以將端口號寫在主機名的后邊,用冒號隔開。 您的SSH配置文件中列出的端口不會與paramiko連接一起使用,但將與openssh連接一起使用。
要使事情明確,建議您在缺省端口上運行的情況下進行設置:
badwolf.example.com:5309
假設你只有靜態IP,並想要設置一些存在於你的主機文件中的別名,或者你通過隧道進行連接。 你也可以這樣描述主機:
badwolf.example.com:5309
在上面的示例中,嘗試對主機別名“jumper”(可能甚至不是真正的主機名)可以聯系,將聯系端口5555上的192.0.2.50。請注意,這是使用Inventory文件的功能來定義一些特殊變量。 一般來說,這不是定義描述系統策略的變量的最佳方法,但是稍后我們將分享有關這方面的建議。 我們剛剛開始
添加很多主機? 如果你有很多主機遵循類似的模式,你可以這樣做,而不是列出每個主機名:
[webservers] www[01:50].example.com
對於數字模式,可以根據需要包括或刪除前導零。 范圍是包容性的 您還可以定義字母范圍:
[databases]
db-[a:f].example.com
還可以在每個主機的基礎上選擇連接類型和用戶:
[targets]
localhost ansible_connection=local other1.example.com ansible_connection=ssh ansible_user=mpdehaan other2.example.com ansible_connection=ssh ansible_user=mdehaan
如上所述,在Inventory文件中設置這些只是一個簡寫,我們將在稍后再討論如何將它們存儲在“host_vars”目錄中的各個文件中。
Host Variables
如上所述,很容易將變量分配給稍后將在playbook中使用的主機:
[atlanta]
host1 http_port=80 maxRequestsPerChild=808 host2 http_port=303 maxRequestsPerChild=909
Group Variables
變量也可以一次性應用於整個組:
[atlanta] host1 host2 [atlanta:vars] ntp_server=ntp.atlanta.example.com proxy=proxy.atlanta.example.com
請注意,這只是將變量一次應用於多個主機的便利方式。 即使您可以按組來定位主機,在執行play之前,變量總是被平坦化為主機級別。
Groups of Groups, and Group Variables
也可以使用:children
后綴來創建組組。 如上所述,您可以使用:vars
應用:vars
:
[atlanta] host1 host2 [raleigh] host2 host3 [southeast:children] atlanta raleigh [southeast:vars] some_server=foo.southeast.example.com halon_system_timeout=30 self_destruct_countdown=60 escape_pods=2 [usa:children] southeast northeast southwest northwest
如果需要存儲列表或散列數據,或者希望將主機和組的特定變量與Inventory文件分開,請參閱下一節。 子組有幾個屬性要注意:
- 首先,作為子組成員的任何主機自動是父組的成員。
- 第二,子組的變量將具有較高的優先級(覆蓋)父組的變量。
Default groups
有兩個默認組: all
和ungrouped
。 all
包含每個主機。 ungrouped
包含除所有主機外沒有其他組的所有主機。
Splitting Out Host and Group Specific Data
Ansible中的首選實踐實際上不是在主Inventory文件中存儲變量。
除了將變量直接存儲在INI文件中,主機和組變量可以存儲在相對於Inventory文件的單個文件中。
這些變量文件采用YAML格式。 有效的文件擴展名包括'.yml','.yaml','.json'或沒有文件擴展名。 如果您是YAML的新手,請參閱YAML語法 。
假設庫存文件路徑是:
/etc/ansible/hosts
如果主機被命名為“foosball”,並且在“raleigh”和“webservers”組中,以下位置的YAML文件中的變量將提供給主機:
/etc/ansible/group_vars/raleigh # can optionally end in '.yml', '.yaml', or '.json' /etc/ansible/group_vars/webservers /etc/ansible/host_vars/foosball
例如,假設您擁有按數據中心分組的主機,並且每個數據中心使用一些不同的服務器。 “raleigh”組的組文件“/ etc / ansible / group_vars / raleigh”中的數據可能如下所示:
--- ntp_server: acme.example.org database_server: storage.example.org
這些文件不存在就可以了,因為這是一個可選的功能。
作為一個高級用例,您可以創建以組或主機命名的目錄 ,而Ansible將讀取這些目錄中的所有文件。 “raleigh”組的一個例子:
/etc/ansible/group_vars/raleigh/db_settings /etc/ansible/group_vars/raleigh/cluster_settings
“raleigh”組中的所有主機都將具有這些文件中定義的變量。 當單個文件開始太大時,或者當您想在組變量的一部分使用可安全保管庫時,這可能非常有用。 請注意,這只適用於Ansible 1.4或更高版本。
提示:在Ansible 1.2或更高版本中, group_vars/
和host_vars/
目錄可以存在於playbook目錄或Inventory目錄中。 如果兩個路徑都存在,則playbook目錄中的變量將覆蓋在Inventory目錄中設置的變量。
提示:將Inventory文件和變量保存在git repo(或其他版本控件)中是跟蹤Inventory變量和主機變量的極好方法。
List of Behavioral Inventory Parameters
設置以下變量控制如何可以與遠程主機進行交互。
- ansible_connection
-
連接類型到主機。 這可以是任何ansible的連接插件的名稱。 SSH協議類型是
smart
,ssh
或paramiko
。 默認是smart
。 下一節將介紹基於非SSH的類型。
一般所有連接:
- ansible_host
- 要連接到的主機的名稱,如果與要提供的別名不同。
- ansible_port
- ssh端口號,如果不是22
- ansible_user
- 要使用的默認ssh用戶名。
特定於SSH連接:
- ansible_ssh_pass
- 要使用的ssh密碼(不要以純文本形式存儲此變量;請始終使用保管庫。請參閱變量和保管庫 )
- ansible_ssh_private_key_file
- ssh使用的私鑰文件。 如果使用多個鍵,並且您不想使用SSH代理程序,則很有用。
- ansible_ssh_common_args
-
此設置始終附加到sftp , scp和ssh的默認命令行。 有用於配置特定主機(或組)的
ProxyCommand
。 - ansible_sftp_extra_args
- 此設置始終附加到默認sftp命令行。
- ansible_scp_extra_args
- 此設置始終附加到默認的scp命令行。
- ansible_ssh_extra_args
- 此設置始終附加到默認的ssh命令行。
- ansible_ssh_pipelining
-
確定是否使用SSH流水線。 這可以覆蓋
ansible.cfg
的pipelining
設置。 - ansible_ssh_executable(在版本2.2中添加)
-
此設置將覆蓋使用系統ssh的默認行為。 這可以覆蓋
ssh_executable
中的ssh_executable
設置。
特權升級(有關詳細信息,請參閱可選權限升級 ):
- ansible_become
-
相當於
ansible_sudo
或ansible_su
,允許強制特權升級 - ansible_become_method
- 允許設置權限升級方法
- ansible_become_user
-
相當於
ansible_sudo_user
或ansible_su_user
,允許設置您成為通過特權升級的用戶 - ansible_become_pass
-
相當於
ansible_sudo_pass
或ansible_su_pass
,您可以設置權限升級密碼(永遠不要以純文本形式存儲此變量;請始終使用保管庫 ),請參見變量和保管庫 )
遠程主機環境參數:
- ansible_shell_type
-
目標系統的shell類型。 除非您將
ansible_shell_executable
設置為非Bourne(sh)兼容shell,否則不應使用此設置。 默認情況下,使用sh
-style語法格式化命令。 將此設置為csh
或fish
將導致在目標系統上執行的命令來跟隨這些shell的語法。 - ansible_python_interpreter
- 目標主機python路徑。 這對於具有多個Python或不在/ usr / bin / python (如* BSD)的系統或/ usr / bin / python不是2.X系列Python的系統非常有用。 我們不使用/ usr / bin / env機制,因為這要求遠程用戶的路徑設置正確,並且還假定python可執行文件被命名為python,其中可執行文件可能被命名為python2.6 。
- ansible _ * _解釋
-
適用於任何類似ruby或perl的工作,就像
ansible_python_interpreter
一樣。 這將替代將在該主機上運行的模塊的shebang。
2.1版新功能
- ansible_shell_executable
-
這將設置可控制器將在目標計算機上使用的shell,覆蓋默認為/ bin / sh的
ansible.cfg
中的executable
。 如果不可能使用/ bin / sh (即/ bin / sh未安裝在目標機器上或不能從sudo運行),那么您應該只能改變它。
Ansible-INI主機文件中的示例:
some_host ansible_port = 2222 ansible_user = manager aws_host ansible_ssh_private_key_file = / home / example / .ssh / aws.pem freebsd_host ansible_python_interpreter = / usr / local / bin / python ruby_module_host ansible_ruby_interpreter = / usr / bin / ruby.1.9.3
非SSH連接類型
使用主機特定參數ansible_connection=<connector>
,可以更改連接類型。 以下基於非SSH的連接器可用:
local
該連接器可以用於將該playbook部署到控制機器本身。
docker
該連接器使用本地Docker客戶機將該playbook直接插入Docker容器。 以下參數由此連接器處理:
- ansible_host
- 要連接的Docker容器的名稱。
- ansible_user
- 在容器內操作的用戶名。 用戶必須存在於容器內。
- ansible_become
-
如果設置為
true
,則將使用become_user
在容器內操作。 - ansible_docker_extra_args
- 可以是由Docker理解的任何其他參數的字符串,它們不是特定於命令的。 此參數主要用於配置遠程Docker守護程序以使用。
- 以下是如何立即部署到創建的容器的示例:
-
- name: create jenkins container docker_container: docker_host: myserver.net:4243 name: my_jenkins image: jenkins - name: add container to inventory add_host: name: my_jenkins ansible_connection: docker ansible_docker_extra_args: "--tlsverify --tlscacert=/path/to/ca.pem --tlscert=/path/to/client-cert.pem --tlskey=/path/to/client-key.pem -H=tcp://myserver.net:4243" ansible_user: jenkins changed_when: false - name: create directory for ssh keys delegate_to: my_jenkins file: path: "/var/jenkins_home/.ssh/jupiter" state: directory