Ansible 五(inventory文件 主机清单)
Ansible 可同时操作属于一个组的多台主机,组和主机之间的关系通过 inventory 文件配置. 默认的文件路径为 /etc/ansible/hosts
主机和组
/etc/ansible/hosts 文件的格式与windows的ini配置文件类似:
<code>mail.example.com</code>
<code>[webservers]</code>
<code>foo.example.com</code>
<code>bar.example.com</code>
<code>[dbservers]</code>
<code>one.example.com</code>
<code>two.example.com</code>
<code>three.example.com</code>
方括号[]中是组名,用于对系统进行分类,便于对不同系统进行个别的管理.
一个系统可以属于不同的组,比如一台服务器可以同时属于 webserver组 和 dbserver组.这时属于两个组的变量都可以为这台主机所用,至于变量的优先级关系将于以后的章节中讨论.
如果有主机的SSH端口不是标准的22端口,可在主机名之后加上端口号,用冒号分隔.SSH 配置文件中列出的端口号不会在 paramiko 连接中使用,会在 openssh 连接中使用.
端口号不是默认设置时,可明确的表示为:
<code>badwolf.example.com:</code><code>5309</code>
假设你有一些静态IP地址,希望设置一些别名,但不是在系统的 host 文件中设置,又或者你是通过隧道在连接,那么可以设置如下:
<code>jumper ansible_ssh_port</code><code>=</code><code>5555</code> <code>ansible_ssh_host</code><code>=</code><code>192.168</code><code>.</code><code>1.50</code>
在这个例子中,通过 “jumper” 别名,会连接 192.168.1.50:5555.记住,这是通过 inventory 文件的特性功能设置的变量. 一般而言,这不是设置变量(描述你的系统策略的变量)的最好方式.后面会说到这个问题.
一组相似的 hostname , 可简写如下:
<code>www[</code><code>01</code><code>:</code><code>50</code><code>].example.com</code>
数字的简写模式中,01:50 也可写为 1:50,意义相同.
你还可以定义字母范围的简写模式:
<code>[databases]</code>
<code>db</code><code>-</code><code>[a:f].example.com</code>
对于每一个 host,你还可以选择连接类型和连接用户名:
<code>[targets]</code>
<code>localhost ansible_connection</code><code>=</code><code>local</code>
<code>other1.example.com ansible_connection</code><code>=</code><code>ssh ansible_ssh_user</code><code>=</code><code>mpdehaan</code>
<code>other2.example.com ansible_connection</code><code>=</code><code>ssh ansible_ssh_user</code><code>=</code><code>mdehaan</code>
所有以上讨论的对于 inventory 文件的设置是一种速记法,后面我们会讨论如何将这些设置保存为 ‘host_vars’ 目录中的独立的文件.
主机变量
前面已经提到过,分配变量给主机很容易做到,这些变量定义后可在 playbooks 中使用:
<code>[atlanta]</code>
<code>host1 http_port</code><code>=</code><code>80</code> <code>maxRequestsPerChild</code><code>=</code><code>808</code>
<code>host2 http_port</code><code>=</code><code>303</code> <code>maxRequestsPerChild</code><code>=</code><code>909</code>
组的变量
也可以定义属于整个组的变量:
<code>host1</code>
<code>host2</code>
<code>[atlanta:</code><code>vars</code><code>]</code>
<code>ntp_server</code><code>=</code><code>ntp.atlanta.example.com</code>
<code>proxy</code><code>=</code><code>proxy.atlanta.example.com</code>
把一个组作为另一个组的子成员
可以把一个组作为另一个组的子成员,以及分配变量给整个组使用. 这些变量可以给 /usr/bin/ansible-playbook 使用,但不能给 /usr/bin/ansible 使用:
<code>[raleigh]</code>
<code>host3</code>
<code>[southeast:children]</code>
<code>atlanta</code>
<code>raleigh</code>
<code>[southeast:</code><code>vars</code><code>]</code>
<code>some_server</code><code>=</code><code>foo.southeast.example.com</code>
<code>halon_system_timeout</code><code>=</code><code>30</code>
<code>self_destruct_countdown</code><code>=</code><code>60</code>
<code>escape_pods</code><code>=</code><code>2</code>
<code>[usa:children]</code>
<code>southeast</code>
<code>northeast</code>
<code>southwest</code>
<code>northwest</code>
如果你需要存储一个列表或hash值,或者更喜欢把 host 和 group 的变量分开配置,请看下一节的说明.
分文件定义host和group变量
在 inventory 主文件中保存所有的变量并不是最佳的方式.还可以保存在独立的文件中,这些独立文件与 inventory 文件保持关联. 不同于 inventory 文件(INI 格式),这些独立文件的格式为 YAML.详见 YAML 语法http://www.ansible.com.cn/docs/YAMLSyntax.html .
假设 inventory 文件的路径为:/etc/ansible/hosts
假设有一个主机名为 ‘foosball’, 主机同时属于两个组,一个是 ‘raleigh’, 另一个是 ‘webservers’. 那么以下配置文件(YAML 格式)中的变量可以为 ‘foosball’ 主机所用.依次为 ‘raleigh’ 的组变量,’webservers’ 的组变量,’foosball’ 的主机变量:
<code>/</code><code>etc</code><code>/</code><code>ansible</code><code>/</code><code>group_vars</code><code>/</code><code>raleigh</code>
<code>/</code><code>etc</code><code>/</code><code>ansible</code><code>/</code><code>group_vars</code><code>/</code><code>webservers</code>
<code>/</code><code>etc</code><code>/</code><code>ansible</code><code>/</code><code>host_vars</code><code>/</code><code>foosball</code>
举例来说,假设你有一些主机,属于不同的数据中心,并依次进行划分.每一个数据中心使用一些不同的服务器.比如 ntp 服务器, database 服务器等等. 那么 ‘raleigh’ 这个组的组变量定义在文件 ‘/etc/ansible/group_vars/raleigh’ 之中,可能类似这样:
<code>-</code><code>-</code><code>-</code>
<code>ntp_server: acme.example.org</code>
<code>database_server: storage.example.org</code>
这些定义变量的文件不是一定要存在,因为这是可选的特性.
还有更进一步的运用,你可以为一个主机,或一个组,创建一个目录,目录名就是主机名或组名.目录中的可以创建多个文件, 文件中的变量都会被读取为主机或组的变量.如下 ‘raleigh’ 组对应于 /etc/ansible/group_vars/raleigh/ 目录,其下有两个文件 db_settings 和 cluster_settings, 其中分别设置不同的变量:
<code>/</code><code>etc</code><code>/</code><code>ansible</code><code>/</code><code>group_vars</code><code>/</code><code>raleigh</code><code>/</code><code>db_settings</code>
<code>/</code><code>etc</code><code>/</code><code>ansible</code><code>/</code><code>group_vars</code><code>/</code><code>raleigh</code><code>/</code><code>cluster_settings</code>
‘raleigh’ 组下的所有主机,都可以使用 ‘raleigh’ 组的变量.当变量变得太多时,分文件定义变量更方便我们进行管理和组织. 还有一个方式也可参考,详见 Ansible Vault http://www.ansible.com.cn/docs/playbooks_vault.html关于组变量的部分. 注意,分文件定义变量的方式只适用于 Ansible 1.4 及以上版本.
Tip: Ansible 1.2 及以上的版本中,group_vars/ 和 host_vars/ 目录可放在 inventory 目录下,或是 playbook 目录下. 如果两个目录下都存在,那么 playbook 目录下的配置会覆盖 inventory 目录的配置.
Tip: 把你的 inventory 文件 和 变量 放入 git repo 中,以便跟踪他们的更新,这是一种非常推荐的方式.
inventory参数的说明
<code>ansible_ssh_host</code>
<code>将要连接的远程主机名.与你想要设定的主机的别名不同的话,可通过此变量设置.</code>
<code>ansible_ssh_port</code>
<code> </code><code>ssh端口号.如果不是默认的端口号,通过此变量设置.</code>
<code>ansible_ssh_user</code>
<code> </code><code>默认的 ssh 用户名</code>
<code>ansible_ssh_pass</code>
<code> </code><code>ssh 密码(这种方式并不安全,我们强烈建议使用 </code><code>-</code><code>-</code><code>ask</code><code>-</code><code>pass</code> <code>或 SSH 密钥)</code>
<code>ansible_sudo_pass</code>
<code> </code><code>sudo 密码(这种方式并不安全,我们强烈建议使用 </code><code>-</code><code>-</code><code>ask</code><code>-</code><code>sudo</code><code>-</code><code>pass</code><code>)</code>
<code>ansible_sudo_exe (new </code><code>in</code> <code>version </code><code>1.8</code><code>)</code>
<code> </code><code>sudo 命令路径(适用于</code><code>1.8</code><code>及以上版本)</code>
<code>ansible_connection</code>
<code> </code><code>与主机的连接类型.比如:local, ssh 或者 paramiko. Ansible </code><code>1.2</code> <code>以前默认使用 paramiko.</code><code>1.2</code> <code>以后默认使用 </code><code>'smart'</code><code>,</code><code>'smart'</code> <code>方式会根据是否支持 ControlPersist, 来判断</code><code>'ssh'</code> <code>方式是否可行.</code>
<code>ansible_ssh_private_key_file</code>
<code> </code><code>ssh 使用的私钥文件.适用于有多个密钥,而你不想使用 SSH 代理的情况.</code>
<code>ansible_shell_type</code>
<code> </code><code>目标系统的shell类型.默认情况下,命令的执行使用 </code><code>'sh'</code> <code>语法,可设置为 </code><code>'csh'</code> <code>或 </code><code>'fish'</code><code>.</code>
<code>ansible_python_interpreter</code>
<code> </code><code>目标主机的 python 路径.适用于的情况: 系统中有多个 Python, 或者命令路径不是</code><code>"/usr/bin/python"</code><code>,比如 \</code><code>*</code><code>BSD, 或者 </code><code>/</code><code>usr</code><code>/</code><code>bin</code><code>/</code><code>python</code>
<code> </code><code>不是 </code><code>2.X</code> <code>版本的 Python.我们不使用 </code><code>"/usr/bin/env"</code> <code>机制,因为这要求远程用户的路径设置正确,且要求 </code><code>"python"</code> <code>可执行程序名不可为 python以外的名字(实际有可能名为python26).</code>
<code> </code><code>与 ansible_python_interpreter 的工作方式相同,可设定如 ruby 或 perl 的路径....</code>
一个主机文件的例子:
<code>some_host ansible_ssh_port</code><code>=</code><code>2222</code> <code>ansible_ssh_user</code><code>=</code><code>manager</code>
<code>aws_host ansible_ssh_private_key_file</code><code>=</code><code>/</code><code>home</code><code>/</code><code>example</code><code>/</code><code>.ssh</code><code>/</code><code>aws.pem</code>
<code>freebsd_host ansible_python_interpreter</code><code>=</code><code>/</code><code>usr</code><code>/</code><code>local</code><code>/</code><code>bin</code><code>/</code><code>python</code>
<code>ruby_module_host ansible_ruby_interpreter</code><code>=</code><code>/</code><code>usr</code><code>/</code><code>bin</code><code>/</code><code>ruby.</code><code>1.9</code><code>.</code><code>3</code>
<code></code>
本文转自506554897 51CTO博客,原文链接:http://blog.51cto.com/506554897/1954872,如需转载请自行联系原作者