Ansible Inventory
Ansible是一个开源配置管理工具,可以使用它来自动化任务,部署应用程序实现IT基础架构。比如,服务器的初始化配置、安全基线配置、更新和打补丁系统,安装软件包等。作为一个架构简单但是功能强大的自动化IT工具,我们可以使用它来帮我们完成自动化测试测试环境搭建工作。
关于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.com10.0.0.18[webservers]foo.example.combar.example.com[dbservers]one.example.comtwo.example.comthree.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.comYAML 示例:webservers:hosts:www[01:50].example.com:Inventory 变量可以直接在 Inventory 清单中定义的 host 或 group 变量。可以直接添加 host 或 group 到 Inventory 文件中。如果数据量太大时,可以将变量和 host group 分离成独立的文件。给单台主机设置变量示例:[atlanta]host1 http_port=80 maxRequestsPerChild=808host2 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]host1host2[atlanta:vars]ntp_server=ntp.atlanta.example.comproxy=proxy.atlanta.example.com组变量是一次将变量同时应用于多个主机的便捷方法。但是,在执行之前,Ansible始终将变量(包括 Inventory 清单变量)展平到主机级别。如果该主机是多个组的成员,则 Ansible 将从所有这些组中读取变量值。如果同一主机在不同的组中被赋予不同的变量值,则 Ansible 会根据内部规则来选择要使用的值。多个 InventoryAnsible 可以使用提供多个 Inventory 选项的命令行或者配置 ANSIBLE_INVENTORY 的方式,同时使用多个 Inventory 源 ( 目录, 动态 Inveory 脚本 或者 Inventory 插件提供的文件 )。该功能针对相互独立的环境非常有帮助,比如你想同时对测试环境和生产环境执行某操作。同时使用两个源的命令执行方式如下:ansible-playbook get_logs.yml -i staging -i production还可以合并组合目录下的多个 Inventory 清单和不同类型的 Inventory 来创建新清单。这对于组合静态和动态主机并将它们作为一个 Inventory 清单进行管理很有用。以下 Inventory 清单结合了清单插件源,动态清单脚本,和带有静态主机的文件:inventory/openstack.yml # 从云上获取 hostsdynamic-inventory.py # 使用动态 inventory 脚本获取hostsstatic-inventory # 使用静态 hosts 和 groupgroup_vars/all.yml # 分配所有 hosts 的变量可以像下面这样指定一个 Inventory 清单目录:ansible-playbook example.yml -i inventoryInventory 参数说明通过设置下面的参数,可以控制 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 密钥)# 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,而非默认的 shansible_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 运行 )微信号 : TestOps知乎:@TestOps云层