惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Forbes - Security
Forbes - Security
GbyAI
GbyAI
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
S
SegmentFault 最新的问题
Y
Y Combinator Blog
Recorded Future
Recorded Future
博客园 - Franky
I
InfoQ
T
The Blog of Author Tim Ferriss
Recent Announcements
Recent Announcements
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
博客园_首页
阮一峰的网络日志
阮一峰的网络日志
T
Tailwind CSS Blog
Cyberwarzone
Cyberwarzone
The Register - Security
The Register - Security
H
Hackread – Cybersecurity News, Data Breaches, AI and More
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
雷峰网
雷峰网
P
Palo Alto Networks Blog
G
GRAHAM CLULEY
Cloudbric
Cloudbric
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
MongoDB | Blog
MongoDB | Blog
F
Full Disclosure
Google DeepMind News
Google DeepMind News
Recent Commits to openclaw:main
Recent Commits to openclaw:main
C
Check Point Blog
爱范儿
爱范儿
The GitHub Blog
The GitHub Blog
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
W
WeLiveSecurity
T
Threat Research - Cisco Blogs
U
Unit 42
N
Netflix TechBlog - Medium
The Cloudflare Blog
Spread Privacy
Spread Privacy
Microsoft Azure Blog
Microsoft Azure Blog
美团技术团队
T
Troy Hunt's Blog
Engineering at Meta
Engineering at Meta
H
Heimdal Security Blog
TaoSecurity Blog
TaoSecurity Blog
C
Cybersecurity and Infrastructure Security Agency CISA
T
Tenable Blog
B
Blog
S
Securelist
H
Hacker News: Front Page
Google Online Security Blog
Google Online Security Blog
G
Google Developers Blog

Ansible

一个 tui 的 ansible playbook 执行引擎,欢迎使用 - V2EX 分享自己写的一个 ansible role,用来部署 meilisearch 有人同时用 PVE 和 Ansible 吗,用 Ansible 来管理 PVE 上的应用还挺方便 关于《大教堂与集市中》2.12 节的疑问 有时候 bug 出现的目标环境是其他发行版本,用 vagrant 还是 docker 来虚拟环境比较好? - V2EX yum install -y docker-ce-18.09.9-3.el7 还让我确认?怎么规避这个确认 - V2EX ansible sudo su - 不支持 - V2EX ansible-playbook 的剧本和相关的二进制文件怎么存比较好? - V2EX ansbile 怎么把连接的目标 HOST IP 通过变量传递过去 - V2EX ansible 远程自动交互式命令的响应 - V2EX jenkins 和 ansible 在不同服务器,想在 jenkins 配置远程 ansible 来调用对应 playbook 和 hosts 可以吗? - V2EX ansible api 里面的 ad-hoc 和 playbook 怎么做异步 - V2EX ansible 有没有关于 passphrase 的配置的 - V2EX Python 如何将 txt 导入 excel? - V2EX 刚刚在抢 S7 鸟巢的票,想到一个问题,之前大麦网说被 80W 并发量挤爆了 - V2EX Ansible 节点边栏链接错误 - V2EX ansible 中的 check 模式和 diff 模式到底神马意思? - V2EX ansible su 切换用户问题? - V2EX 请假 ansible 里 template 模板是否支持目录呢 - V2EX ansible 如何控制 windows 后台运行 nginx? - V2EX 玩 Ansible 虐到自己了! - V2EX Ansible Container Ansible 使用 Dynamic inventory 的 Script 得到的所有主机信息有办法分类么? - V2EX Ansible 初学问题 - V2EX ansible 怎么关闭 ask sudo password? - V2EX 发个福利给 Ansible 的同学们,本人亲测有效 - V2EX ansible 不支持 windows 做控制端吗?我的 windows10 py3.4 用这个老是出错 - V2EX ansible 有什么优点么? - V2EX Ansible 官网的文档读起来好别扭 - V2EX Ansible 节点这么冷清? 没有人用吗? - V2EX 用 DigitalOcean 一键部署 Cisco IPSec - V2EX 有了解 ansible-playbook 的么 - V2EX
关于 AWX 执行 ansible 的原理不解的地方
firejoke · 2021-11-04 · via Ansible

最近一直在写一个给小白用的运维工具,使用 django+ansible 。
红帽本身有一个这样的项目,收费的是 Tower ,开源的版本叫 AWX 。
既然有现成的,就想看看他是怎么做的。

首先因为 ansible 核心功能 play 是基于文件和 role 目录来执行可复用的任务,而目标机器组( inventory )也是记录在文件内的。
最简单办法,就是文件读取和解析,然后映射到界面上,但这其中还涉及 play 文件内的各种变量和关键词,还有频繁的文件操作,不认为是一个最佳的解决方案。 比较合理的办法,是自行开发 ansible 模块或插件,以实现从你的 web api 获取资源。


inventory 的解决办法比较简单,写一个 inventory 插件,从你的 api 接口获取主机列表,然后组装成 ansible 能识别的数据结构,实际上 AWX 的源码里也是写了这样的插件InventoryModule(BaseInventoryPlugin)
这个插件使用了 awx 写的另一个 module_util:ControllerModule(AnsibleModule),用来从他的 web api 里获取资源。

...
module = ControllerAPIModule(argument_spec={}, direct_params=module_params,        error_callback=handle_error, warn_callback=self.warn_callback)
...
inventory = module.get_endpoint(inventory_url, data={'hostvars': '1', 'towervars': '1', 'all': '1'})['json']

而 play 的执行,awx 则是使用了ansible-runner这个库,这个库可以通过读取一个固定结构的目录直接执行 play ,也提供 python 接口可以传递 play 的必要参数来执行 play 。
awx 是让用户自行提供一个 play 文件,然后保存到固定的目录下,inventory 也是保存到固定位置的文件里,然后调用 ansible-runner 执行。

params = {
    'ident': self.instance.id,
    'private_data_dir': private_data_dir,
    'playbook': self.build_playbook_path_relative_to_cwd(
        self.instance, private_data_dir
        ),
    'inventory': self.build_inventory(self.instance, private_data_dir),
    'passwords': expect_passwords,
    'envvars': env,
    'settings': {
        'job_timeout': self.get_instance_timeout(self.instance),
        'suppress_ansible_output': True,
    },
}
...
if isinstance(self.instance, SystemJob):
    res = ansible_runner.interface.run(
        project_dir=settings.BASE_DIR,
        event_handler=self.event_handler,
        finished_callback=self.finished_callback,
        status_handler=self.status_handler,
        **params,
    )
...

这个 task 的执行是通过 Job 模型保存时的信号来决定,task 的执行是维护在另一个线程内(这里还没摸透,只大致知道是通过信号引发执行)


不解的地方在于:

  1. 既然已经写了一个 Inventory 插件,为什么这里还要把 inventory 保存到文件内呢?
  2. 为什么不把 play 以及 task ,role ,handler ,block 这些 Play 里的功能也设计成模型保存到数据库里呢?而是要用户自己写?