Ansible Inventory


同時可以在您的基礎設施中對多個系統進行安全解決。 它可以通過選擇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

有兩個默認組: allungrouped 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協議類型是smartsshparamiko默認是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
此設置始終附加到sftpscpssh的默認命令行。 有用於配置特定主機(或組)的ProxyCommand
ansible_sftp_extra_args
此設置始終附加到默認sftp命令行。
ansible_scp_extra_args
此設置始終附加到默認的scp命令行。
ansible_ssh_extra_args
此設置始終附加到默認的ssh命令行。
ansible_ssh_pipelining
確定是否使用SSH流水線。 這可以覆蓋ansible.cfgpipelining設置。
ansible_ssh_executable(在版本2.2中添加)
此設置將覆蓋使用系統ssh的默認行為。 這可以覆蓋ssh_executable中的ssh_executable設置。

特權升級(有關詳細信息,請參閱可選權限升級 ):

ansible_become
相當於ansible_sudoansible_su ,允許強制特權升級
ansible_become_method
允許設置權限升級方法
ansible_become_user
相當於ansible_sudo_useransible_su_user ,允許設置您成為通過特權升級的用戶
ansible_become_pass
相當於ansible_sudo_passansible_su_pass ,您可以設置權限升級密碼(永遠不要以純文本形式存儲此變量;請始終使用保管 ),請參見變量和保管庫

遠程主機環境參數:

ansible_shell_type
目標系統的shell類型。 除非您將ansible_shell_executable設置為非Bourne(sh)兼容shell,否則不應使用此設置。 默認情況下,使用sh -style語法格式化命令。 將此設置為cshfish將導致在目標系統上執行的命令來跟隨這些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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM