Ansible之路——第四章:Host Inventory

摘要:
Ansible可以同时操作属于一个组的多个主机。组和主机之间的关系通过资源清册文件进行配置。默认文件路径为/etc/responsible/hosts。除了默认文件,您还可以同时使用多个库存文件,或从动态源或云提取库存配置信息。这些变量可以用于/usr/bin/sensive playbook,但不能用于/usr/bin-sensitive:[atlanta]host1host2[raleigh]host2host3[south:childres]atlantaraleigh[south:vars]some_server=foo.southwest.example.comhalon_system_timeout=30self_destruct_counter=60escape_Pods=2这里,东南部有两个子成员,atlanta和raleigh,以便子成员可以使用东南组中的变量。

Ansible之路——第四章:Host Inventory第1张

Ansible 可同时操作属于一个组的多台主机,组和主机之间的关系通过 inventory 文件配置. 默认的文件路径为 /etc/ansible/hosts。

除默认文件外,还可以同时使用多个 inventory 文件,也可以从动态源,或云上拉取 inventory 配置信息。

4.1 静态Inventory文件

 静态Inventory指的是在文件/etc/ansible/hosts中指定的主机和组,其格式类似于Windows的ini配置文件。如:

[webservers]
foo.example.com
bar.example.com

[dbservers]
one.example.com
two.example.com
three.example.com
  • 方括号[]中是组名,用于对主机进行分类,便于对不同类别进行分别管理。
  • 一个主机可以属于不同的组。如果有主机的SSH端口不是标准的22端口,可以在主机名之后加上端口号,用冒号分割。如:

   badwolf.example.com:5309

  • 假设你有一些静态IP地址,希望设置一些别名,但不是在系统的 host 文件中设置,又或者你是通过隧道在连接,那么可以设置如下:

  jumper ansible_ssh_port=5555 ansible_ssh_host=192.168.1.50

  • 一组相似的 hostname , 可简写如下:
[webservers]
www[01:50].example.com

或者

[webservers]
10.152.35.[100:110]

  

 4.1.1 主机变量

 分配变量给主机,只需要将变量定义在主机的host之后,就可在 playbooks 中使用。如:

[atlanta]
host1 http_port=80   maxRequestsPerChild=808
host2 http_port=303  maxRequestsPerChild=909

4.1.2 组变量

 也可以定义属于整个组的变量:

[atlanta]
host1
host2

[atlanta:vars]
ntp_server=ntp.atlanta.example.com
proxy=proxy.atlanta.example.com

4.1.3 把一个组作为另一个组的子成员

 可以把一个组作为另一个组的子成员,以及分配变量给整个组使用。这些变量可以给 /usr/bin/ansible-playbook 使用,但不能给 /usr/bin/ansible 使用: 

[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

  

这里,southeast有两个子成员atlanta和raleigh,这样southeast组里面的变量,可以给子成员使用。

4.1.4 分文件定义 Host 和 Group 变量

 在 inventory 主文件中保存所有的变量并不是最佳的方式。还可以保存在独立的文件中,这些独立文件与 inventory 文件保持关联。

假设在inventory文件中有一个主机名为 ‘foosball,主机同时属于两个组,一个是 ‘raleigh’,另一个是 ‘webservers’:

[raleigh]
foosball

[webservers]
foosball

那么以下配置文件(YAML 格式)中的变量可以为 ‘foosball’ 主机所用。依次为 ‘raleigh’ 的组变量,’webservers’ 的组变量,’foosball’ 的主机变量: 

/etc/ansible/group_vars/raleigh
/etc/ansible/group_vars/webservers
/etc/ansible/host_vars/foosball

优先级最高的是host_vars中定义的变量,其次组的变量是根据组的名字排序来进行优先级排序的,组名称靠后的优先级高。

  

4.1.5 Inventory 参数的说明

 通过设置下面的参数,可以控制 ansible 与远程主机的交互方式:

 1)ansible_ssh_host

 将要连接的远程主机名.与你想要设定的主机的别名不同的话,可通过此变量设置。

2)ansible_ssh_port

 ssh端口号.如果不是默认的端口号,通过此变量设置.

3)ansible_ssh_user

 默认的 ssh 用户名

4)ansible_ssh_pass

 ssh 密码(这种方式并不安全,我们强烈建议使用 --ask-pass 或 SSH 密钥)

5)ansible_sudo_pass

 sudo 密码(这种方式并不安全,我们强烈建议使用 --ask-sudo-pass)

6)ansible_sudo_exe (new in version 1.8)

 sudo 命令路径(适用于1.8及以上版本)

7)ansible_connection

 与主机的连接类型.比如:local, ssh 或者 paramiko. Ansible 1.2 以前默认使用 paramiko.1.2 以后默认使用 'smart','smart' 方式会根据是否支持 ControlPersist, 来判断'ssh' 方式是否可行.

8)ansible_ssh_private_key_file

 ssh 使用的私钥文件.适用于有多个密钥,而你不想使用 SSH 代理的情况.

9)ansible_shell_type

 目标系统的shell类型.默认情况下,命令的执行使用 'sh' 语法,可设置为 'csh' 或 'fish'.

10)ansible_python_interpreter

目标主机的 python 路径.适用于的情况: 系统中有多个 Python, 或者命令路径不是"/usr/bin/python",比如/usr/bin/python

不是 2.X 版本的 Python.我们不使用 "/usr/bin/env" 机制,因为这要求远程用户的路径设置正确,且要求 "python" 可执行程序名不可为 python以外的名字(实际有可能名为python26).

与 ansible_python_interpreter 的工作方式相同,可设定如 ruby 或 perl 的路径....

  

4.2 动态inventory

Dynamic Inventory指通过外部脚本获取主机列表,并按照ansible 所要求的格式返回给ansilbe命令的。

这部分一般会结合CMDB资管系统、zabbix 监控系统、crobble安装系统、云计算平台等获取主机信息。由于主机资源一般会动态的进行增减,而这些系统一般会智能更新。我们可以通过这些工具提供的API 或者接入库查询等方式返回主机列表。

4.2.1最简单示例

 由于Ansible在接受脚本动态获取主机信息时支持的是json格式,这里直接通过一段代码打印一个段json格式的主机信息: 

#!/usr/bin/env python
# coding=utf-8

import json

host1ip = ['10.212.52.252', '10.212.52.14']
host2ip = ['10.212.52.16']
group1 = 'test1'
group2 = 'test2'
hostdata = {group1: {"hosts": host1ip},
            group2: {"hosts": host2ip}
            }
print json.dumps(hostdata, indent=4)

  

注:

  • 主机部分必须是列表格式的;
  • hostdata行,其中的"hosts" 部分可以省略,但如果使用时,必须是"hosts" ,不能是其他如‘‘hostlist’’ 等字符串。
  • 脚本中一定要加上解释器,如 #!/usr/bin/python  #!/bin/bash

省略后可以这样写:

hostdata = {group1:host1ip, group2:host2ip}

  

直接执行该段代码结果如下:

 Ansible之路——第四章:Host Inventory第2张

上面定义了两个主机组,test1组内包含主机10.212.52.252、10.212.52.14,test2组内包含主机10.212.52.16 。ansible可以通过如下方法调用:

 Ansible之路——第四章:Host Inventory第3张

4.2.2 复杂示例

 在静态主机配置文件示例中,会有组变量(vars),组之间的包含,如下图:

 Ansible之路——第四章:Host Inventory第4张

 如果以上部分想要通过脚本获取实现,实现后返回的json格式应该如下图:

 Ansible之路——第四章:Host Inventory第5张

像上面这种复杂的返回格式,一般不会用在ad-hoc环境中,多数会用在ansible-playbook 中,应为playbook文件中有时假会涉及到vars 参数的传参。

  

4.2.3其他

  • ansible -i 参数后调用的脚本并非一定是py文件,也可以是其他脚本输出的结果,这里做了个简单的测试:

 Ansible之路——第四章:Host Inventory第6张

  • -i 参数指定的脚本需要有可执行权限 ,不然会报错,如下: 
[root@361way.com yaml]# ansible -i hostjson.py  AA  -a 'uptime'
ERROR: The file hostjson.py looks like it should be an executable inventory script, but is not marked executable. Perhaps you want to correct this with `chmod +x hostjson.py`?

  

 4.2.4 _meta

 如果inventory脚本返回的顶级元素为”_meta”,它可能会返回所有主机的变量,其可以包含一个名为”hostvars”的value,表示每个主机的变量。字典_meta中定义的是主机变量,如:

 Ansible之路——第四章:Host Inventory第7张

 主机变量并不是Inventory文件中所必需的,所以_meta字典也不是必须生成的。当Inventory脚本中生成_meta字典时,Ansible会将_meta信息存放在缓存中,当任务中需要调用这些主机变量时,会直接从缓存中读取,而不是调用一次变量就执行一次Inventory脚本。这就大大提高了运行效率。

免责声明:文章转载自《Ansible之路——第四章:Host Inventory》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇公钥,私钥和数字签名这样最好理解Android学习笔记-Dialog详解下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Python+Apache环境搭建

Python+Apache环境搭建 Python+apache搭建时需要apache拓展mod_wsgi模块,apache启动时自动加载mod_wsgi模块,通过mod_wsgi与python通信,实现python部署在apache上。 安装 1.下载源码包mod_wsgi 2.解压缩mod_wsgi包 tar zxvf mod_wsgi-4.6.8.t...

为github帐号添加SSH keys(Linux和Windows)

【gitee里面又非常详细的官方教程】 文章转自:https://blog.cofface.com/archives/406.html/2 一、Linux增加ssh keys方法: 使用git clone命令从github上同步github上的代码库时,如果使用SSH链接(如我自己的cofface_recovery项目:git@github.com:cof...

[zz]Linux中的/etc/profile文件

【一、让/etc/profile文件修改后立即生效】 方法1:让/etc/profile文件修改后立即生效 ,可以使用如下命令:# .  /etc/profile注意: . 和 /etc/profile 有空格方法2:让/etc/profile文件修改后立即生效 ,可以使用如下命令:# source /etc/profile附:Linux中source命令...

情人节用python写个网站对ta表白吧!小白都可以看懂的教程。

情人节来了,广大男性同胞们都打算送给女朋友什么礼物?口罩?口红?不如用python写个网站对她表白吧!简约的动画+大火的想见你bgm,还有谁能不心动? 先看下效果(视频后半段网速卡了,实际十分丝滑): 情人节表白页面预览 不会python?不会写网站?只要你能看懂print('hello world')再有一台电脑就完全足够了,python+Djang...

C#程序执行Python脚本

方法介绍:      通过调用“Python.exe”程序,执行脚本文件。所以,本方式要求电脑上已经安装了Python,拥有程序Python.exe程序。 现在,有如下py脚本:Add.py import sys def Add(a,b): return a+b if __name__=='__main__': X = int(sys....

python paramiko 模块

1.什么是paramiko? paramiko模块提供了基于ssh连接,进行远程登录服务器执行命令和上传下载文件的功能。这是一个第三方的软件包,使用之前需要安装。 pip homepage: http://www.paramiko.org/ pip github addr: https://github.com/paramiko 官方推荐安装方法: pip...