ansible主机清单

  • inventory主机清单文件
  • 编辑主机清单
  • 定义主机范围
  • 嵌套组写法
  • 查看主机列表(inventory)中的主机信息
  • 主机清单内置参数
  • 主主机组指定密码变量
  • 对主机组设置变量group_vras
  • 操作主机清单
  • 使用yaml主机清单
  • 练习第二章练习:主机清单
  • 开始新章节的环境
  • 编辑主机清单
  • 查看主机清单
  • 指定主机清单文件查看主机清单
  • 动态主机清单文件
  • 动态主机清单示例1
  • 动态主机清单示例2
  • 查看动态主机清单文件的主机列表
  • ansible指定动态主机清单文件
  • 完成练习


inventory主机清单文件

主机清单的路径在/etc/ansible/ansible.cfg文件中的inventory参数定义
不修改,默认主机清单路径是 /etc/ansible/hosts

[student@workstation ~]$ cat /etc/ansible/ansible.cfg

[defaults]

# some basic default values...

#inventory      = /etc/ansible/hosts

ansible连续主机IP主机清单怎么写 ansible 主机列表_python



编辑主机清单

ansible连续主机IP主机清单怎么写 ansible 主机列表_linux_02

vim /etc/ansible/hosts
## 添加主机组
[webservers]
192.168.0.11 ansible_ssh_user=root ansible_ssh_pass=123.com ansible_ssh_port=3333
192.168.0.12 ansible_ssh_user=root ansible_ssh_pass=123.com
## ansible_ssh_user=root  指定主机登陆用户名为root
## ansible_ssh_pass=123.com 指定主机登陆用户的密码为123.com
## ansible_ssh_port=3333  指定ssh的端口

# 保存主机清单并退出
:wq!



定义主机范围

适用于主机数量多和有规律的主机

[usa]
192.168.0.[0:254]
192.168.1.[0:254]
# 高级写法
192.168.[0:1].[0:254]

server[a:z]
server[1:254]



嵌套组写法

[student]  # 红帽294练习环境组
workstation.lab.example.com
server[a:d].lab.exmaple.com
astion.lab.example.com

[test]   # test组
node1
[proxy]		# proxy组
node2
[webserver]		# webserver组
node[3:4]
[database]		# 数据库组	
node5
# 定义嵌套组(主组套子组,子组用:chidren定义)
[cluster:children]		# 集群组
webserver      # webserver组
database		# database组

ansible连续主机IP主机清单怎么写 ansible 主机列表_python_03



查看主机列表(inventory)中的主机信息

ansible -i 可以指定主机清单文件

# ansible -i 主机清单文件 主机组/主机名 --list-all
[student@workstation ~]$ ansible -i inventory all --list-hosts
  hosts (6):
    workstation.lab.example.com
    servera.lab.example.com
    serverb.lab.example.com
    serverc.lab.example.com
    serverd.lab.example.com
    astion.lab.example.com



主机清单内置参数

参考: https://blog.51cto.com/breezey/1757643

ansible连续主机IP主机清单怎么写 ansible 主机列表_centos_04

参数

解释

ansible_ssh_host

用于指定被管理的主机的真实IP

ansible_ssh_port

用于指定连接到被管理主机的ssh端口号,默认是22

ansible_ssh_user

ssh连接时默认使用的用户名

ansible_ssh_pass

ssh连接时的密码

ansible_sudo_pass

使用sudo连接用户时的密码

ansible_sudo_exec

如果sudo命令不在默认路径,需要指定sudo命令路径

ansible_ssh_private_key_file

秘钥文件路径,秘钥文件如果不想使用ssh-agent管理时可以使用此选项

ansible_shell_type

目标系统的shell的类型,默认sh

ansible_connection

SSH 连接的类型: local , ssh , paramiko,在 ansible 1.2 之前默认是 paramiko ,后来智能选择,优先使用基于 ControlPersist 的 ssh (支持的前提)

ansible_python_interpreter

用来指定python解释器的路径,默认为/usr/bin/python 同样可以指定ruby 、perl 的路径

ansible_*_interpreter

其他解释器路径,用法与ansible_python_interpreter类似,这里"*"可以是ruby或才perl等其他语言


主主机组指定密码变量

# 为所有主机组指定密码
[all:vars]
ansible_ssh_pass=rhel
# 
ansible_ssh_pass='rhel'



对主机组设置变量group_vras

# 在主机清单文件的同目录下新建目录group_vras
mkdir group_vras

# 如果要对all组生效变量,就创建一个all文件
touch all

# 将变量写入all文件中
## 例如,将ssh密码写在all文件中
ansible_ssh_pass: redhat



操作主机清单

ansible测试主机是否可达

# 查看所有主机是否可以连通
ansible all -m ping

# 查看webservers主机组的磁盘空间
ansible webservers -m shell -a "df -h"

## 绿色结果是执行成功
# 查看webservers主机组的内存使用情况
ansible webservers -m shell -a "free -h"

ansible连续主机IP主机清单怎么写 ansible 主机列表_清单文件_05

ansible连续主机IP主机清单怎么写 ansible 主机列表_ssh_06



使用yaml主机清单



练习第二章练习:主机清单



开始新章节的环境

[student@workstation ~]$ lab deploy-inventory start

Setting up workstation for lab exercise work:

 · Verify ansible is installed on workstation control node.....  SUCCESS
 · Backup /etc/ansible/hosts inventory.........................  SUCCESS



编辑主机清单

在student的home目录下创建主机清单deploy_inventory

[student@workstation ~]$ touch ~/deploy_inventory

# 编辑主机清单内容
[student@workstation ~]$ vim deploy_inventory

写入的主机清单内容

workstation.lab.example.com
astion.lab.example.com

# 根据服务器角色分组
[webserver]
server[a:d].lab.example.com

# 根据服务器环境分组
[Development]
servera.lab.example.com

[Testing]
serverb.lab.example.com

[Production]
server[c:d].lab.example.com

# 根据地理位置分组
[Raleigh]
server[a:b].lab.example.com

[Mountaion_View]
serverc.lab.example.com

[London]
serverd.lab.example.com



查看主机清单

# 查看所有主机
[student@workstation ~]$ ansible all --list-hosts
  hosts (6):
    workstation.lab.example.com
    astion.lab.example.com
    servera.lab.example.com
    serverb.lab.example.com
    serverc.lab.example.com
    serverd.lab.example.com

# 查看不属于任何组的主机
[student@workstation ~]$ ansible ungrouped --list-hosts
  hosts (2):
    workstation.lab.example.com
    astion.lab.example.com



指定主机清单文件查看主机清单

ansible底层调用的是json格式的主机清单
编写主机清单的时候,必须要确认能解析成json

# 指定主机清单文件查看主机清单
[student@workstation files]$ ansible-inventory -i inventory --list
{
    "_meta": {
        "hostvars": {
            "servera.lab.example.com": {},
            "workstation.lab.example.com": {}
        }
    },
    "all": {
        "children": [
            "ungrouped",
            "webservers",
            "workstations"
        ]
    },
    "webservers": {
        "hosts": [
            "servera.lab.example.com"
        ]
    },
    "workstations": {
        "hosts": [
            "workstation.lab.example.com"
        ]
    }
}



动态主机清单文件

aws,阿里云等云服务器厂商,开放了相关的接口,是可以动态拉取主机清单的。
需要自己写python脚本动态生成主机清单。
厂商一般会提供demo。



动态主机清单示例1

新建python文件inventorya.py

#!/usr/bin/python3

from subprocess import Popen,PIPE
import sys
import json

result = {}
result['webservers'] = {}
result['webservers']['hosts'] = []
result['webservers']['vars'] = {}

pipe = Popen(['getent', 'hosts'], stdout=PIPE, universal_newlines=True)

for line in pipe.stdout.readlines():
   s = line.split()
   if s[1].startswith('servera'):
      result['webservers']['hosts'].append(s[1])

if len(sys.argv) == 2 and sys.argv[1] == '--list':
    print(json.dumps(result))
elif len(sys.argv) == 3 and sys.argv[1] == '--host':
    print(json.dumps({}))
else:
    print("Requires an argument, please use --list or --host <host>")



动态主机清单示例2

新建python文件inventoryw.py

#!/usr/bin/python3

from subprocess import Popen,PIPE
import sys
import json

result = {}
result['all'] = {}

pipe = Popen(['getent', 'hosts'], stdout=PIPE, universal_newlines=True)

result['all']['hosts'] = []
for line in pipe.stdout.readlines():
   s = line.split()
   if s[1].startswith('workstation'):
      result['all']['hosts'].append(s[1])

result['all']['vars'] = {}

if len(sys.argv) == 2 and sys.argv[1] == '--list':
    print(json.dumps(result))
elif len(sys.argv) == 3 and sys.argv[1] == '--host':
    print(json.dumps({}))
else:
    print("Requires an argument, please use --list or --host <host>")



查看动态主机清单文件的主机列表

# 赋予python脚本可执行权限
chmod +x inventory/inventorya.py

# 查看主机清单
[student@workstation ]$ ./inventory/inventorya.py --list
{"webservers": {"hosts": ["servera.lab.example.com"], "vars": {}}}



ansible指定动态主机清单文件

# 赋予python脚本可执行权限
chmod +x inventory/inventorya.py

# 指定动态主机清单文件查看主机列表
ansible -i inventory/inventorya.py webservers --list-host



完成练习

[student@workstation ~]$ lab deploy-inventory finish

Cleanup workstation control node

 · Restore /etc/ansible/hosts..................................  SUCCESS