Ansible 组件介绍

本章主要通过对 Ansible 经常使用的组件进行讲解,使对 Ansible 有一个更全面的了解,主要包含以下内容:

  1. Ansible Inventory
  2. Ansible Ad-Hoc 命令
  3. Ansible playbook
  4. Ansible facts
  5. Ansible role
  6. Ansible Galaxy

Ansible Inventory

Inventory 组件主要存储在配置管理工作中需要管理的不同业务的不同机器的信息。默认 Ansible 的 Inventory 是静态的 INI 格式的文件/etc/ansible/hosts,可以通过 ANSIBLE_HOSTS 环境变量指定或者运行 ansible 和 ansible-playbook 的时候用 -i 参数临时设置。

定义主机和主机组

首先看下默认 Inventory 文件是如何定义主机和主机组的,默认的 Inventory 文件如下:

# - 主机组由[header]元素分隔
# - 您可以输入主机名或IP地址
# - hostname/ip 可以是多个组的成员 # 未组合的主机,在任何主机组之前指定。
## green.example.com
## blue.example.com
## 192.168.100.1
## 192.168.100.10 # 属于'webservers'组的主机集合
## [webservers]
## alpha.example.org
## beta.example.org
## 192.168.1.100
## 192.168.1.110
# 如果有多个主机遵循模式
## www[001:006].example.com # 'dbservers'组中的数据库服务器集合
## [dbservers]
##
## db01.intranet.mydomain.net
## db02.intranet.mydomain.net
## 10.25.1.56
## 10.25.1.57
## db-[99:101]-node.example.com

多个 Inventory 列表

Ansible 支持多个 Inventory 文件,方便管理维护不同业务或环境中的机器。下面介绍如何使用多个 Inventory 文件。

首先新建一个文件夹用来存放 Inventory 文件

mkdir inventory

并在文件夹内新建文件,webservers 和 hosts。

hosts 文件如下:

10.1.90.59
10.1.90.69

webservers 文件如下:

[webservers]
10.1.90.59
10.1.90.69
[ansible:children]
webservers

然后修改 ansible.cfg 文件中的 inventory 的默认路径

inventory = /root/ansible/inventory/

这样就可以使用 ansible 的list-hosts 参数来进行验证

ansible 10.1.90.59:10.1.90.69 --list-hosts

返回:

  hosts (2):
10.1.90.59
10.1.90.69

动态 Inventory

动态 Inventory 其实可以通过把 ansible.cfg 文件中的 inventory 默认路径改为一个脚本。

脚本需要支持两个参数

  • list或者-l ,这个参数显示所有主机以及主机组的信息(json格式)
  • host或者-H ,参数后面指定一个host,会显示这台主机的所有信息(json格式)

下面是 hosts.py 脚本:

import argparse
import sys
import json
def list():
r={}
h=['10.1.90.'+ str(i) for i in (59,69)]
hosts={'host':h}
r['webservers']=hosts
return json.dumps(r,indent=4) def hosts(name):
r={'ansible_ssh_pass':'123'}
cpis=dict(r.items())
return json.dumps(cpis) if __name__=='__main__':
parser=argparse.ArgumentParser()
parser.add_argument('-l','--list',help='host list',action='store_true')
parser.add_argument('-H','--host',help='hosts vars')
args=vars(parser.parse_args())
if args['list']:
print list()
elif args['host']:
print hosts(args['host'])
else:
parser.print_help()

执行脚本函数 python hosts.py -l,返回如下:

{
"webservers": {
"host": [
"10.1.90.59",
"10.1.90.69"
]
}
}

执行脚本函数 python hosts.py -H 10.1.90.59,返回如下:{"ansible_ssh_pass": "123"}

执行临时指定 hosts.py 脚本,

ansible -i hosts.py 10.1.90.59 -m ping -o,返回结果:

10.1.90.59 | SUCCESS => {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python"}, "changed": false, "ping": "pong"}

如果报错: [WARNING]: * Failed to parse /root/ansible/inventory/hosts.py with script plugin: problem running /root/ansible/inventory/hosts.py

--list ([Errno 13] Permission denied)

需要给予执行权限

chmod +x hosts.py

如果报错:"msg": "to use the 'ssh' connection type with passwords, you must install the sshpass program"

需要安装 sshpass

yum -y install sshpass

Inventory 内置参数

参数 解释 例子
ansible_ssh_host 定义 host ssh 地址 ansible_ssh_host=10.1.90.59
ansible_ssh_port 定义 hosts ssh 端口 ansible_ssh_port=22
ansible_ssh_user 定义 hosts ssh 认证用户 ansible_ssh_user=wupx
ansible_ssh_pass 定义 hosts ssh 认证密码 ansible_ssh_pass=123
ansible_sudo 定义 hosts sudo的用户 ansible_sudo=wupx
ansible_sudo_pass 定义 hosts sudo密码 ansible_sudo_pass=123
ansible_sudo_exe 定义 hosts sudo 路径 ansible_sudo_exe=/usr/bin/sudo
ansible_ssh_private_key_file 定义 hosts 私钥 ansible_ssh_private_key_file=/root/key
ansible_shell_type 定义 hosts shell 类型 ansible_shell_type=bash
ansible_python_interpreter 定义 hosts 任务执行 python 的路径 ansible_python_interpreter=/usr/bin/python2.6
ansible_*_interpreter 定义 hosts 其他语言解析器路径 ansible_ruby_interpreter=/usr/bin/ruby

Ansible Ad-Hoc 命令

Ad-Hoc 其实就是临时命令,Ad-Hoc 是相对于 Ansible-playbook 而言的,Ansible 提供两种完成任务方式:一种是 Ad-Hoc 命令集,即ansible,另一种就是 Ansible-playbook,即命令 Ansible-playbook。前者更注重于解决一些简单的或者平时工作中临时遇到的任务,相当于Linux系统命令行下的Shell命令,后者更适合与解决复杂或需固化下来的任务,相当于Linux系统的Shell Scripts。

执行命令

Ansible 命令都是并发执行的,默认的并发数由 ansible.cfg 中的 forks 值来确定,也可以在执行命令时通过 -f 指定并发数。

使用命令返回 webservers 组所有主机的 hostname,并指定并发数为 5:ansible webservers -m shell -a 'hostname' -f 5 -o

执行结果:

192.168.46.129 | CHANGED | rc=0 | (stdout) web2
192.168.46.128 | CHANGED | rc=0 | (stdout) web1

使用异步执行,-P 0 的情况下会直接返回 job_id,然后针对主机根据 job_id 查询执行结果:ansible webservers -B 120 -P 0 -m shell -a 'sleep 10;hostname' -f 5 -o

执行结果:

192.168.46.128 | CHANGED => {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python"}, "ansible_job_id": "899260515938.13222", "changed": true, "finished": 0, "results_file": "/root/.ansible_async/899260515938.13222", "started": 1}
192.168.46.129 | CHANGED => {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python"}, "ansible_job_id": "245835357736.13147", "changed": true, "finished": 0, "results_file": "/root/.ansible_async/245835357736.13147", "started": 1}

可以根据 job_id 通过 async_status 模块查看异步任务的状态和结果:ansible 192.168.46.128 -m async_status -a 'jid=899260515938.13222'

执行结果:

192.168.46.128 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"ansible_job_id": "899260515938.13222",
"changed": true,
"cmd": "sleep 10;hostname",
"delta": "0:00:10.024378",
"end": "2019-09-22 08:54:35.364400",
"finished": 1,
"rc": 0,
"start": "2019-09-22 08:54:25.340022",
"stderr": "",
"stderr_lines": [],
"stdout": "web1",
"stdout_lines": [
"web1"
]
}

当-P 参数大于 0 时,Ansible 会自动根据 job_id 轮询查询执行结果:ansible webservers -B 120 -P 1 -m shell -a 'sleep 10;hostname' -f 5 -o

执行结果:

192.168.46.128 | CHANGED => {"ansible_job_id": "892179643372.13778", "changed": true, "cmd": "sleep 10;hostname", "delta": "0:00:10.023149", "end": "2019-09-22 09:01:57.625917", "finished": 1, "rc": 0, "start": "2019-09-22 09:01:47.602768", "stderr": "", "stderr_lines": [], "stdout": "web1", "stdout_lines": ["web1"]}
192.168.46.129 | CHANGED => {"ansible_job_id": "506204522875.13683", "changed": true, "cmd": "sleep 10;hostname", "delta": "0:00:10.029853", "end": "2019-09-22 09:01:59.039427", "finished": 1, "rc": 0, "start": "2019-09-22 09:01:49.009574", "stderr": "", "stderr_lines": [], "stdout": "web2", "stdout_lines": ["web2"]}

复制文件

可以使用 copy 模块来批量下发文件,文件的变化是通过 MD5 值来判断的:ansible webservers -m copy -a 'src=hosts dest=/root/hosts owner=root group=root mode=644 backup=yes' -o

返回结果:

192.168.46.129 | CHANGED => {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python"}, "changed": true, "checksum": "83e11aa2eb53ae6ea2476c05a8448696018401db", "dest": "/root/hosts", "gid": 0, "group": "root", "md5sum": "a154d2b2131e6420e51e293c540e4cb5", "mode": "0644", "owner": "root", "secontext": "system_u:object_r:admin_home_t:s0", "size": 1021, "src": "/root/.ansible/tmp/ansible-tmp-1569169777.73-89235977935/source", "state": "file", "uid": 0}
192.168.46.128 | CHANGED => {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python"}, "changed": true, "checksum": "83e11aa2eb53ae6ea2476c05a8448696018401db", "dest": "/root/hosts", "gid": 0, "group": "root", "md5sum": "a154d2b2131e6420e51e293c540e4cb5", "mode": "0644", "owner": "root", "secontext": "system_u:object_r:admin_home_t:s0", "size": 1021, "src": "/root/.ansible/tmp/ansible-tmp-1569169777.73-148086225859296/source", "state": "file", "uid": 0}

验证文件下发功能:ansible webservers -m shell -a 'md5sum /root/hosts' -t 5 -o

返回结果:

192.168.46.128 | CHANGED | rc=0 | (stdout) a154d2b2131e6420e51e293c540e4cb5  /root/hosts
192.168.46.129 | CHANGED | rc=0 | (stdout) a154d2b2131e6420e51e293c540e4cb5 /root/hosts

包和服务管理

可以直接使用 Ad-Hoc 命令来管理包和服务:

ansible webservers -m yum -a 'name=httpd state=latest' -f 5 -o

ansible webservers -m service -a 'name=httpd state=started' -f 5 -o

ansible webservers -m shell -a 'rpm -qa httpd' -f 5 -o

验证服务运行情况:ansible webservers -m shell -a 'netstat -tpln|grep httpd' -f 5

返回结果:

192.168.46.128 | CHANGED | rc=0 >>
tcp6 0 0 :::80 :::* LISTEN 16853/httpd 192.168.46.129 | CHANGED | rc=0 >>
tcp6 0 0 :::80 :::* LISTEN 43184/httpd

用户管理

首先通过 openssl 命令生成密码(因为ansible user 的 password 参数需要接受加密后的值):echo ansible | openssl passwd -1 -stdin

返回结果:$1$RBXBgM3M$WE3mYCc2gIlFIircO3unx.

使用 user 模块批量新建用户:ansible webservers -m user -a 'name=test password="$1$RBXBgM3M$WE3mYCc2gIlFIircO3unx."' -f 5 -o

返回结果:

192.168.46.128 | CHANGED => {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python"}, "changed": true, "comment": "", "create_home": true, "group": 1001, "home": "/home/test", "name": "test", "password": "NOT_LOGGING_PASSWORD", "shell": "/bin/bash", "state": "present", "system": false, "uid": 1001}
192.168.46.129 | CHANGED => {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python"}, "changed": true, "comment": "", "create_home": true, "group": 1001, "home": "/home/test", "name": "test", "password": "NOT_LOGGING_PASSWORD", "shell": "/bin/bash", "state": "present", "system": false, "uid": 1001}

通过 SSH 登录验证新建用户是否成功(密码为 ansible):ssh 192.168.46.128 -l test

Ansible playbook

playbook 是 Ansible 进行配置管理的组件,是来弥补 Ad-Hoc 命令无法支撑复杂环境的配置管理工作的。playbook 是 Ansible 的重要组件之一,因此放在下一篇来对 Ansible 的 playbook 进行详细讲解。

Ansible facts

facts 组件是 Ansible 用于采集被管机器设备信息的功能,可使用 setup 模块查看机器所有 facts 信息,或使用 filter 来查看指定信息(返回的结果是 JSON 格式)。

查看机器的所有 facts 信息:ansible 192.168.46.128 -m setup

查看机器的 ipv4 信息:ansible 192.168.46.128 -m setup -a 'filter=ansible_all_ipv4_addresses'

返回结果:

192.168.46.128 | SUCCESS => {
"ansible_facts": {
"ansible_all_ipv4_addresses": [
"192.168.46.128"
],
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false
}

使用 facter 扩展 facts 信息

Ansible 的 facts 组件会判断被控机器上是否安装 facter 和 ruby-json 包,若存在,Ansible 的 facts 会采集 facter 信息。

查看是否安装 facter 和 ruby-json:ansible 192.168.46.128 -m shell -a 'rpm -qa ruby-json facter'

运行 facter 模块查看 facter 信息:ansible 192.168.46.128 -m facter

使用 ohai 扩展 facts 信息

Ansible 的 facts 组件会判断被控机器上是否安装 ohai 包,若存在,Ansible 的 facts 会采集 ohai 信息。

查看是否安装 ohai:ansible 192.168.46.128 -m shell -a 'gem list|grep ohai'

运行 ohai 模块查看 ohai 信息:ansible 192.168.46.128 -m ohai

直接运行 setup 模块也会采集 facter 和 ohai 信息。

Ansible role

role 只是对我们使用的 playbook 的目录结构进行一些规范。

这是一个 role 的目录结构:

├── roles
├── dbsrvs -------------role1名称
│ ├── files -------------ansible中unarchive、copy等模块会自动来这里找文件,从而我们不必写绝对路径,只需写文件名
│ │ ├── mysql.tar.gz
│ │ └── nginx.tar.gz
│ ├── handlers -----------存放tasks中的notify指定的内容
│ │ └── main.yml
│ ├── meta
│ ├── tasks --------------存放playbook的目录,其中main.yml是主入口文件,在main.yml中导入其他yml文件,要采用import_tasks关键字,include要弃用了
│ │ ├── install.yml
│ │ └── main.yml -------主入口文件
│ ├── templates ----------存放模板文件。template模块会将模板文件中的变量替换为实际值,然后覆盖到客户机指定路径上
│ │ └── nginx.conf.j2
│ └── vars ----------存放变量文件
└── websrvs -------------role2名称
│ ├── files
│ │ ├── mysql.tar.gz
│ │ └── nginx.tar.gz
│ ├── handlers
│ │ └── main.yml
│ ├── meta
│ ├── tasks
│ │ ├── install.yml
│ │ └── main.yml
│ ├── templates
│ │ └── nginx.conf.j2
│ └── vars
└── site.yml -------------role引用的入口文件

执行 role:ansible-playbook -i /etc/ansible/hosts site.yml

Ansible Galaxy

Galaxy 是 Ansible 官方分享 role 的功能平台。可将自己编写的 role 通过 ansible-galaxy 上传到 Galaxy 网站。也可通过 ansible-galaxy 命令实现 role 的分享和安装。使用ansible-galaxy install就可以安装 role,默认安装路径为/etc/ansible/roles/

总结

本章主要介绍一些 Ansible 常用的组件,主要包含 Ansible Inventory、playbook、facts、role、Galaxy 等。下一篇将对 Ansible 中的 playbook 进行详细讲解。

《Ansible自动化运维:技术与最佳实践》第三章读书笔记的更多相关文章

  1. LINUX内核设计与实现第三周读书笔记

    LINUX内核设计与实现第三周读书笔记 第一章 LINUX内核简介 1.1 Unix的历史 1969年的夏天,贝尔实验室的程序员们在一台PDR-7型机上实现了Unix这个全新的操作系统. 1973年, ...

  2. 《Linux内核分析》之第三章读书笔记

    进程管理 进程是处于执行期的程序以及相关的资源的总称,也称作任务.执行线程,简称线程,是在进程中活动的对象. 可以两个或两个以上的进程执行同一个程序 也可以两个或两个以上并存的进程共享许多资源 内核调 ...

  3. 《Linux内核设计与实现》第四周读书笔记——第五章

    <Linux内核设计与实现>第四周读书笔记--第五章 20135301张忻 估算学习时间:共1.5小时 读书:1.0 代码:0 作业:0 博客:0.5 实际学习时间:共2.0小时 读书:1 ...

  4. 《Linux内核设计与实现》Chapter 3 读书笔记

    <Linux内核设计与实现>Chapter 3 读书笔记 进程管理是所有操作系统的心脏所在. 一.进程 1.进程就是处于执行期的程序以及它所包含的资源的总称. 2.线程是在进程中活动的对象 ...

  5. 《Linux内核设计与实现》Chapter 1 读书笔记

    <Linux内核设计与实现>Chapter 1 读书笔记 一.Unix的特点 Unix从Multics中产生,是一个强大.健壮和稳定的操作系统. 特点 1.很简洁 2.在Unix系统中,所 ...

  6. 《Linux内核设计与实现》Chapter 2 读书笔记

    <Linux内核设计与实现>Chapter 2 读书笔记 一.获取内核源码 1.使用Git 我们曾经在以前的学习中使用过Git方法 $ git clone git://git.kernel ...

  7. 《Linux内核设计与实现》Chapter 5 读书笔记

    <Linux内核设计与实现>Chapter 5 读书笔记 在现代操作系统中,内核提供了用户进程与内核进行交互的一组接口,这些接口的作用是: 使应用程序受限地访问硬件设备 提供创建新进程与已 ...

  8. 《Linux内核设计与实现》Chapter 18 读书笔记

    <Linux内核设计与实现>Chapter 18 读书笔记 一.准备开始 一个bug 一个藏匿bug的内核版本 知道这个bug最早出现在哪个内核版本中. 相关内核代码的知识和运气 想要成功 ...

  9. Linux内核设计与实现 第三章

    1. 进程和线程 进程和线程是程序运行时状态,是动态变化的,进程和线程的管理操作都是由内核来实现的. Linux中的进程于Windows相比是很轻量级的,而且不严格区分进程和线程,线程不过是一种特殊的 ...

  10. Linux内核设计与实现第十周读书笔记

    第十七章 设备与模块 关于设备驱动与设备管理,我们讨论四种内核成分. 设备类型 模块 内核对象 sysfs 17.1设备类型 在Linux以及所有Unix系统中,设备被分为以下三种类型: 块设备,块设 ...

随机推荐

  1. Rikka with Game[技巧]----2019 杭电多校第九场:1005

      Rikka with Game Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 524288/524288 K (Java/Othe ...

  2. Java进程故障排查

    故障分析 # 导致系统不可用情况(频率较大): 1)代码中某个位置读取数据量较大,导致系统内存耗尽,进而出现Full GC次数过多,系统缓慢: 2)代码中有比较消耗CPU的操作,导致CPU过高,系统运 ...

  3. java JVM原理讲解和调优和gc

  4. 人员考勤,MySQLl数据库一个表自动生成3表筛选人员迟到早退缺勤

    前言:漂亮的人事小姐姐找我帮忙弄考勤:由于人员考勤和门禁一起,打卡记录太多,打卡机只能导出一个打卡Excel总表,不容易人工筛选. Excel表的格式是这样的:(这里101代替真实人名) 实现目标: ...

  5. 使用Eclipse开发动态Javaweb项目

    使用Eclipse开发动态Javaweb项目 一.Eclipse的使用 1. 把开发选项切换到 JavaEE 2. 可以在 Window -> Show View 中找到 Package Exp ...

  6. SpringBoot第二十四篇:应用监控之Admin

    作者:追梦1819 原文:https://www.cnblogs.com/yanfei1819/p/11457867.html 版权声明:本文为博主原创文章,转载请附上博文链接! 引言   前一章(S ...

  7. Codeforces Round #379 (Div. 2) E. Anton and Tree 缩点 树的直径

    传送门 题意: 这道题说的是在一颗有两种颜色的树上,每操作一个节点,可以改变这个节点颜色和相邻同色节点的颜色.问最少操作次数,使得树上颜色相同. 思路: 先缩点,把相同的颜色的相邻节点缩在一起.再求出 ...

  8. HDU 6346 整数规划 二分图匹配最优解

    整数规划 原来的km+hunger跑法T了, 拿了一个新的板子, 新的写法是将这原来的找新的最小的d放在了上一次的残留图上,从而减小复杂度, 但是个人还不是很理解为什么最小的d下一次出现的位置一定是这 ...

  9. CF980B Marlin 构造 思维 二十四

    Marlin time limit per test 1 second memory limit per test 256 megabytes input standard input output ...

  10. 271.已正确安装证书,但https显示连接不安全(此页面的部分内容不安全)

    1.问题描述 成功安装证书,但是显示连接不安全 此页面的部分内容(例如图像)不安全 如下图 2.问题原因 页面引用(含有)http资源的文件.图片.脚本 如:图片引自其他http资源的网站 我的是引自 ...