分享

Ansible Inventory

 TestOps云层 2021-06-22

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.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 密钥)

# 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 运行 )

微信号 : TestOps

知乎:@TestOps云层

    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多