关于Ansible的整体介绍与使用,已经在:《自动化运维工具-Ansible》做过介绍,今天给大家介绍一下Ansible的Inventory。
Inventory 介绍
Ansible 从 Inventory 读取列表或组,可同时并发操作这些受控节点或主机。一旦 inventory 被定义,就可以使用正则匹配主机或者组来指定要运行的主机列表 patterns 。
Inventory 主机清单存放在 /etc/ansible/hosts。
可以在命令行使用 -i <path> 指定特定的 inventory 清单;当然,也可以一次指定多个 inventory 清单;还可以使用 pull inventory 的动态获取或者从云主机获取。
Inventory 文件可以有多种格式,取决于你使用什么插件,最常用的格式是 YAML 和 INI。
INI 文件示例:
mail.example.com 10.0.0.18 [webservers] foo.example.com bar.example.com [dbservers] one.example.com two.example.com three.example.com |
注:括号中的标题是组名,用于对主机进行分类,用于确定什么时间、什么目的、相对哪些主机做什么事情。
对应的YAML文件示例:
all: hosts: mail.example.com: 10.0.0.18: children: webservers: hosts: foo.example.com: bar.example.com: dbservers: hosts: one.example.com: two.example.com: three.example.com: |
可以把一台主机放在多个组中,还可以使用嵌套组来简化此清单中的分组。
示例:
hosts: mail.example.com: children: webservers: hosts: foo.example.com: bar.example.com: dbservers: hosts: one.example.com: two.example.com: three.example.com: east: hosts: foo.example.com: one.example.com: two.example.com: west: hosts: bar.example.com: three.example.com: prod: children: east: test: children: west: |
如果有许多具有相似模式的主机,则可以将它们添加为一个范围,而不必分别列出每个主机名。
INI 示例:
[webservers] www[01:50].example.com [databases] db-[a:f].example.com |
YAML 示例:
webservers: hosts: www[01:50].example.com: |
Inventory 变量
可以直接在 Inventory 清单中定义的 host 或 group 变量。可以直接添加 host 或 group 到 Inventory 文件中。如果数据量太大时,可以将变量和 host group 分离成独立的文件。
给单台主机设置变量示例:
[atlanta] host1 http_port=80 maxRequestsPerChild=808 host2 http_port=303 maxRequestsPerChild=909 |
在 Inventory 中定义别名:
jumper ansible_port=5555 ansible_host=192.0.2.50 |
注:执行 Ansible 对 “”jumper”” 主机执行命令时,会连接 192.0.2.50 的 5555 端口。这种方式仅适用于通过静态 IP 的主机,或者通过隧道连接的主机。
如果组中的所有主机共享一个变量值,则可以一次将该变量应用于整个组。
示例:
[atlanta] host1 host2 [atlanta:vars] ntp_server=ntp.atlanta.example.com proxy=proxy.atlanta.example.com |
组变量是一次将变量同时应用于多个主机的便捷方法。但是,在执行之前,Ansible始终将变量(包括 Inventory 清单变量)展平到主机级别。如果该主机是多个组的成员,则 Ansible 将从所有这些组中读取变量值。如果同一主机在不同的组中被赋予不同的变量值,则 Ansible 会根据内部规则来选择要使用的值。
多个 Inventory
Ansible 可以使用提供多个 Inventory 选项的命令行或者配置 ANSIBLE_INVENTORY 的方式,同时使用多个 Inventory 源 ( 目录, 动态 Inveory 脚本 或者 Inventory 插件提供的文件 )。该功能针对相互独立的环境非常有帮助,比如你想同时对测试环境和生产环境执行某操作。
同时使用两个源的命令执行方式如下:
ansible-playbook get_logs.yml -i staging -i production |
还可以合并组合目录下的多个 Inventory 清单和不同类型的 Inventory 来创建新清单。这对于组合静态和动态主机并将它们作为一个 Inventory 清单进行管理很有用。
以下 Inventory 清单结合了清单插件源,动态清单脚本,和带有静态主机的文件:
inventory/ openstack.yml # 从云上获取 hosts dynamic-inventory.py # 使用动态 inventory 脚本获取hosts static-inventory # 使用静态 hosts 和 group group_vars/ all.yml # 分配所有 hosts 的变量 |
可以像下面这样指定一个 Inventory 清单目录:
ansible-playbook example.yml -i inventory |
Inventory 参数说明
通过设置下面的参数,可以控制 ansible 与远程主机的交互方式,下面是常用参数:
ansible_connection 与主机的连接类型.比如:local, ssh 或者 paramiko. Ansible 1.2 以前默认使用 paramiko.1.2 以后默认使用 'smart','smart' 方式会根据是否支持 ControlPersist, 来判断'ssh' 方式是否可行. |
ansible_ssh_host | # 将要连接的远程主机名.与你想要设定的主机的别名不同的话,可通过此变量设置. |
ansible_ssh_port | # ssh 端口号.如果不是默认的端口号,通过此变量设置. |
ansible_ssh_user | # 默认的 ssh 用户名 |
ansible_ssh_pass | # ssh 密码(这种方式并不安全,我们强烈建议使用 --ask-pass 或 SSH 密钥) |
ansible_ssh_private_key_file | #指定 ssh 私钥。如果没有私钥或者有多个私钥时有用 |
ansible_ssh_common_args | #这个设置通常添加在默认命令行 sftp, scp and ssh 之后。当为一台主机或组配置 ProxyCommand 时有用。 |
ansible_sftp_extra_args | # 此设置始终附加在默认的 sftp 命令行中。 |
ansible_scp_extra_args | # 此设置始终附加在默认的 scp 命令行中。 |
ansible_ssh_extra_args | # 此设置始终附加在默认的 ssh 命令行中。 |
ansible_ssh_pipelining | # 设置是否使用 SSH 管道,可以在 ansible.cfg 设置 |
ansible_ssh_executable (added in version 2.2) | #此设置将覆盖默认行为以使用系统 ssh。这样会覆盖 ansible.cfg 文件中的 ssh_executable 设置 |
ansible_shell_type | # 指定远程主机使用的 Shell。在使用该选项前一定要先将 ansible_shell_executable 设置为 non-Bourne (sh) 。默认命令使用 sh. 设置 csh or fish 将会在远程主机上使用 csh fish,而非默认的 sh |
ansible_python_interpreter | # 目标主机 python 目录。对于一台主机上有多个 Python 环境或者默认路径不是 /usr/bin/python 的 *BSD 环境,或者 where /usr/bin/python 的不是 2.X 系统的 Python 情况有用。我们不使用:command:/usr/bin/env 命令机制,因为这需要设置远程用户的路径,并且假定 python 可执行文件名为 python ,其中可执行文件可能命名为像 python2.6 一样的程序。 |
ansible_*_interpreter | #适用于 ruby or perl 等类型 ansible_python_interpreter 环境。这将替换运行模块在远程主机上的 shabang. |
ansible_shell_executable | #设置远程主机使用何种 shell,默认 /bin/sh,会覆盖 executable in ansible.cfg。如果远程主机没有安装 /bin/sh ,则需要修改下了。( 比如:/bin/sh 在远程主机没有安装或者无法 sudo 运行 ) |