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

推荐订阅源

N
News | PayPal Newsroom
U
Unit 42
MongoDB | Blog
MongoDB | Blog
IT之家
IT之家
A
About on SuperTechFans
Blog — PlanetScale
Blog — PlanetScale
P
Privacy & Cybersecurity Law Blog
V
V2EX
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
Know Your Adversary
Know Your Adversary
L
LINUX DO - 热门话题
GbyAI
GbyAI
T
Threat Research - Cisco Blogs
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
P
Palo Alto Networks Blog
Recent Commits to openclaw:main
Recent Commits to openclaw:main
腾讯CDC
WordPress大学
WordPress大学
K
Kaspersky official blog
The GitHub Blog
The GitHub Blog
Spread Privacy
Spread Privacy
Simon Willison's Weblog
Simon Willison's Weblog
D
DataBreaches.Net
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
M
MIT News - Artificial intelligence
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
C
Check Point Blog
阮一峰的网络日志
阮一峰的网络日志
TaoSecurity Blog
TaoSecurity Blog
Latest news
Latest news
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
N
News and Events Feed by Topic
NISL@THU
NISL@THU
博客园 - 【当耐特】
Microsoft Azure Blog
Microsoft Azure Blog
PCI Perspectives
PCI Perspectives
T
Threatpost
C
CXSECURITY Database RSS Feed - CXSecurity.com
Scott Helme
Scott Helme
P
Proofpoint News Feed
C
CERT Recently Published Vulnerability Notes
大猫的无限游戏
大猫的无限游戏
Help Net Security
Help Net Security
C
Cybersecurity and Infrastructure Security Agency CISA
H
Hackread – Cybersecurity News, Data Breaches, AI and More
W
WeLiveSecurity
小众软件
小众软件
S
Secure Thoughts
T
The Exploit Database - CXSecurity.com
F
Full Disclosure

Yee's Blog

腾讯云/轻量云 安装ArchLinux的个人记录 记录我的联想M720Q Arch Sway窗口管理器的安装和配置过程 Jenkins Linux安装 腾讯课堂、钉钉在线网课视频直播回放下载离线播放 Ceph块设备对RBD块设备操作LVM创建PV时报错 Ceph映射RBD块设备 2020年9月26日前端部门Vue考核 2020年9月26日后端部门Python考核 Nginx反向代理下载传输超过1G大文件时断开问题 Windows Server 2019 Datacenter M720q 安装记录 Ceph块设备基础及快照、克隆操作 从Ceph集群中删除OSD节点 Centos8配置 chrony NTP服务端及客户端 搭建Ceph集群 Ceph硬件准备 OSD与Pool池的常见操作及管理 Ceph用户管理 MacOS睡眠管理——让你的Mac睡的更香 初中古诗文必背篇目 Ansible 包含和导入文件 Ansible 学习文档 Ansible 主机模式 Ansible 角色 Ansible 调整连接数 Splunk数据搜索和报表 Ansible 常用模块 Ansible 变量和事实 Ansible 任务控制 Ansible Playbook Ansible 基础概念 42Team-Flask框架-HTTP协议快速了解 42Team-Flask框架-路由和视图 42Team-Flask框架-请求与响应 42Team-Flask框架 42Team-Flask框架-Flask介绍 42Team-Flask框架-使用Pycharm来构建一个全新的Flask项目 How to install RHEL8(Centos) on Dell R710/R610 server Centos8安装Docker报错解决方案 Centos8安装Docker后容器内无法访问网络 Docker或Podman容器内无法解析DNS问题多种解决方案 使用NetworkManager来管理树莓派Ubuntu系统网络以及个人的体验优化 Linux 存储设备的挂载及识别 Firewalld 防火墙常用指令教程-常用规则(禁止Ping | 放行端口) Linux 查找系统中的文件 Linux 守护进程和控制服务 Linux SSH远程访问 42Team小组_Linux基础培训课件 如何在AmazeUI中当改变select标签后触发Vue方法的问题 使用Docker部署安装WordPress博客平台 在Raspberry树莓派中搭建NFS存储服务器 在 树莓派 Linux 中搭建匿名 danted socks5 代理服务器 HTTP与HTTPS区别随笔 Bash/Shell学习笔记
Ansible 技巧之场
本文作者: YeeFire · 2020-06-22 · via Yee's Blog

看到技巧之场,我就想起来被百万氪金王支配的恐惧!

拼接主机与http或其他字符串

有时候我们有一个列表,里面是IP地址。但是有时候我们要将http://拼接在每个IP地址的开头,可以利用Jinja2语法进行操作。

在模版中:

{% set http_hosts=[] %} # 定一个list变量
{% set hosts_list = discovery_seed_hosts | flatten %} # 将列表扁平化,因为这个变量列表里面存在嵌套的情况
{% for host in hosts_list %}
{% set _ = http_hosts.append("http://%s:%s" % (host,9200)) %} #使用Python语法进行操作。
{% endfor %}

在Plybook中(从网上找到的未经过测试,理论可行):

set_fact:
cluster_address: |
[
{% set pxc_hosts = groups.pxc %}
{% for host in pxc_hosts %}
{% set pxc_ip = hostvars[host].inventory_hostname | default(host) %}
{% set pxc_port = group_port %}
"{{ pxc_ip }}:{{ pxc_port }}"
{% endfor -}
]


{{ cluster_address | join(',') }}'

对字符串的操作

得益于Python特性,在Ansible中可以使用Python中处理字符串的语法。

你可以对字符串进行取单个字符等操作: {{ vars[2] }}

也可以切片: {{ vars[3:6]}}

判断某些字符是否在字符串中: when: "'haha' in vars"

使用加号连接两个字符串: {{ var1+var2 }}

使用乘号*连续输出字符串: {{ var1*3 / 'la'*nums }}

使用find函数查找:

when: {{ vars.find('test') == -1 }} # 值为

find函数的语法是find(string,begin,end)

when: {{ vars.find('test',5) == -1 }} # 从第5位开始查找

任务委派

有时候你想让某一个tasks在指定的某一个受控主机上运行而不是要在Play中指定的组或主机中全部运行这个tasks。

这种情况下可以新写一个Play,然后将hosts和tasks进行指定。但是这样要新建一个Play,有点麻烦。

可以使用delegate_to关键字来让某一个tasks指定运行在某一台主机上,任务委派时不会去看目标主机是否在inventory主机清单中。可以指定代码块进行任务委派。

- debug:
msg: "only host"
delegate_to: 192.168.1.196

---

ok: [192.168.1.39 -> 192.168.1.196] => {
"msg": "only host"
}

仅在主机上执行

如果指向让某一个任务在本主机上运行。你可以使用刚刚的任务委派,来指向Ansible控制节点。也可以尝试connection: local关键字。

connection关键字也可以用于代码块和任务。

- block:
- systemd:
name: elasticsearch
state: restarted
connection: local

仅运行一遍任务

在某些情况下,下载资源到本地时,你只需要下载一次就可以。但是任务却执行和主机清单中相同的次数。得益于Ansible模块幂等性,虽然说任务运行很多次,但只有第一次真正进行了下载,对我们的影响不大。但是能否继续减少性能开支呢。

使用run_once: true关键字让任务或代码块只运行一次。

- hosts: all
  gather_facts: no
  tasks:
  - get_url:
      url: "https://github.com/rofl0r/proxychains-ng/archive/v4.14.tar.gz"
      dest: "/tmp"
    connection: local
    run_once: true
 
  - copy:
      src: "/tmp/v4.14.tar.gz"
      dest: "/tmp"

遇到过的错误…

在when关键字中使用了Jinja2语法

[WARNING]: conditional statements should not include jinja2 templating delimiters such as {{ }} or {% %}. Found:XXX

在when关键字中不应该包含Jinja2语法。在使用循环或者变量时不小心就会顺手把花括号加上。此时会发出警告。

错误用法:
when: "'{{item.hosts}}' in group_names"

正确用法:
when: item.hosts in group_names

没有获取事实就要使用hostvars获取变量

在主机没有gether facts事实之前,是无法通过hostvars来获取它的事实变量的。这个错误在生成hosts文件时出现过一次,折腾了好久。难受的是没有指向正确的报错位置,这导致我在错误的方向研究了好久都没有解决。

错误用法:
when: "'{{item.hosts}}' in group_names"

---

正确用法:
when: item.hosts in group_names