「Front End」- 使用 XPath 查询(学习笔记)

XPath,是在 XSLT 标准中的主要元素,用于在 XML 文档中选择元素,我们可以理解为元素选择器(功能上与 CSS Selectors 类似)。
我们感觉 XPath 比 CSS Selector 好用,也可能是我们不熟悉 CSS 选择器,也可能是我们的场景使然。
学习路线(Learning Roadmap)
按照 w3school.com 章节顺序进行学习即可: 1)形成 XPath 基本认识:XPath Tutorial 2)理解基本概念,比如 Parent、Children、Ancestors 等等:XPath Nodes 3)学习 XPath 语法:XPath Syntax 4)相对于当前节点定位其他节点:XPath Axes 5)使用操作符进行判断:XPath Operators 6)学习示例:XPath Examples
调试 XPath 查询(验证 XPath 查询是否正确)
方法一、通过浏览器直接获取
我们可以使用 Chrome / Firefox 快速获取元素的 XPath 地址。下面是 Chrome 的方法:
Inspect => Right click on the node => Copy => Copy XPath
方法二、使用 Console 调试
在 Chrome / Firefox 的 Console 中,使用 $x(‘your-xpath-query’) 函数,
比如:通过 $x(“//img”) 选择所有图片
常用 XPath 查询(在我们工作中比较常用)
获取在兄弟元素中的元素
html – XPath:: Get following Sibling – Stack Overflow
获取在 div 的后续所有兄弟(sibling)元素中的 input 元素:

//div/following-sibling::input

获取某个元素的父级元素
XPath Axes
获取 <input id=”commitBtn” /> 的父级元素:

//parent::input[@id=’commitBtn’]

根据属性值的内容定位属性
XPath with regex match on an attribute value – Stack Overflow How to use not contains() in xpath? – Stack Overflow
定位 href 属性包含 doubles 字符串的 a 标签:

//a[contains(@href, ‘ doubles ‘)]

定位 hre[……]

READ MORE

「YAML」- YAML Ain’t Markup Language(学习笔记)

语法基础知识
注释行
使用井号(#)注释行;支持单行注释,不支持多行注释。
文档开始符

数组

– elementl
– element2
– element3

字典、复杂字典

# 简单字典
key: value

# 复杂字典
martin:
name: Martin Developer
job: Developer
skill: Elite

数组与字典嵌套

– martin:
name: Martin D’ vloper
job: Developer
skills:
– python
– perl
– pascal
– tabitha:
name: Tabitha Bitumen
job: Developer
skills:
– lisp
– fortran
– erlang

注意事项
1)如果在值中包含冒号(:),需要使用引号:foo: “bar: example” 2)如果值以花括号({)开始,需要使用引号:foo: “{barexample}”
参考文献
YAML – Wikipedia YAML快速入门 YAML Ain’t Markup Language (YAML™) Version 1.2 3rd Edition, Patched at 2009-10-01 JS-YAML在线示例:http://nodeca.github.io/js-yaml How do you do block comments in YAML?[……]

READ MORE

「gPRC」- 高性能 RPC 框架

gRPC(Google Remote Procedure Call, Google 远程过程调用) 是 Google 发布的基于 HTTP 2.0 传输层协议承载的高性能开源软件框架,提供了支持多种编程语言的、 对网络设备进行配置和管理的方法。
gRPC由google开发,是一款语言中立、平台中立、开源的远程过程调用(RPC)系统。通信双方(网管和设备)基于gRPC框架进行二次开发,聚焦业务对接,缩短产品对接适配的开发周期。
gRPC支持的语言包括:C++,Node.js,Python,Ruby,Objective-C,PHP和C#,java,Go等。
gRPC基于HTTP/2标准设计,能使用HTTP/2的特性,包括:双向流、流控、头部压缩、多路复用等。相对于HTTP/1,表现更好。

参考文献
gRPC – A high performance, open source universal RPC framework

章节列表
「gRPC」- 概念术语 「gRPC」- 学习笔记 「gRPC」- 调试工具 「gRPC」- 4.Packages and Build Tools 「gRPC」- 常用代码[……]

READ MORE

「gRPC」- 概念术语

协议栈
具有如下五层: TCP传输层:TCP提供面向连接的、可靠的数据链路。 TLS(Transport Layer Security,传输层安全)传输层:该层是可选的,设备和采集器可以基于TLS协议实现安全通信。 HTTP 2.0应用层:gRPC承载在HTTP 2.0协议上,利用了该协议的头部压缩、多路复用、流量控制等增强特性。 gRPC层:定义了RPC的协议交互格式。公共RPC方法定义在公共proto文件中,例如huawei-gRPC-dialout.proto。 数据模型层:用于承载编码后的业务数据。业务数据的编码格式包括:GPB,XML,JSON等。

服务模式
gRPC支持的四种服务(通过stream区分)
简单模式:一问一答的简单交互 例如:rpc Cancel(CancelArgs) returns(CancelReply) {};
服务端流模式:客户端发送一个请求,服务端不断返回数据给客户端 例如:rpc Subscribe(SubsArgs) returns(stream SubsReply) {};
客户端流模式:客户端不断向服务端推送数据,并等待服务端返回应答 例如:rpc LotsOfGreetings(stream HelloRequest) returns (HelloResponse) {};
双向流模式:客户端和服务端都可以发送一系列消息 例如:rpc dataPublish(stream serviceArgs) returns(stream serviceArgs) {};
GPB,Google Protocol Buffers
GPB编码提供了一种灵活、高效、自动序列化结构数据的机制。GPB与XML、JSON编码类似,不同之处在于GPB是一种二进制编码,性能更高。
因为Protocol Buffers是以二进制的形式进行传输的,字节数较少,传输效率相比XML、JSON有天然的优势,而数据采集效率是Telemetry考虑的重点之一。 更多学习请参考 https://developers.google.com/protocol-buffers/?hl=zh-CN
GPB编码解析前

{
1:”HUAWEI”
2:”s4″
3:”huawei-ifm:ifm/interfaces/interface”
4:46
5:1515727243419
6:1515727243514
7{
1[{
1: 1515727243419
2 {
5{
1[{
5:1
16:2
25:”Eth-Trunk1″
}]
}
}
}]
}
}[……]

READ MORE

「gRPC」- 学习笔记

问题描述
我们认为是从 DevOps 盛行之后,运维也开始写代码(应该说比以前写的更多),诞生运维开发岗位(应该说越来越多)。比如说,开发 Prometheus Exporter 成为运维的工作(其实以前都是现有的,工作都是别人做好的,基本不用开发,或者简单配置即可实现)。
现在,我们需要为我们自己的应用开发 Prometheus Exporter,但是应用提供 gRPC 接口,所以运维就要看学习如何使用 gRPC 框架。
该笔记将记录:gRPC 的快速入门方法、学习笔记,以及相关问题处理(该笔记是我们对 gRPC 的学习笔记,因此仅记录基础入门相关的内容)。
解决方案
我们通过学习 gRPC 的使用流程,来理解它是如何工作的: 1)编写 .proto 文件:该文件包含 RPC 方法、数据结构等等信息 2)生成桩代码:使用命令 protoc 生成桩代码(能够生成多种语言,比如 Go C++ Java Python C# 等等)。“桩代码”类似于“类库”。 3)编写服务端:在程序中,使用这些类库,编写服务端,实现 RPC 方法。然后,运行该服务端,监听 TCP 端口,等待请求; 4)编写客户端:在程序中,使用这些类库,编写客户端,该客户端连接服务端,并调用这些 RPC 方法,接收服务端返回结果;
在调用时,各个部分之间的关系,可以使用下图解释:

我们使用 Python 语言,因此重点使用 Python 示例。但是,使用其他语言也是可以的,并且只要使用 gRPC 框架,鉴于 gRPC 也是网络通信,所以多个语言之间是互通的。
学习路线图
官方文档已经提供详细的示例,是最好的教程。跟着官方文档,一边学习,一边练习,已经足够。
对于 Python 使用 gRPC 框架,如果需要快速入门,建议按照以下顺序阅读文档: 1)针对 gRPC 介绍:Introduction to gRPC | gRPC 2)使用 gRPC 框架的入门示例(Python):Quick start | Python | gRPC 3)使用 gRPC 框架的完整示例(Python):Basics tutorial | Python | gRPC
常用文档(Python): 1)Welcome to gRPC Python’s documentation! — gRPC Python 1.36.1 documentation 2)Language Guide  |  Protocol Buffers  |  Google Developers 3)关于 gRPC 概念及术语:Core concepts, architecture and lifecycle | gRPC[……]

READ MORE

「gRPC」- 调试工具

问题描述
该笔记将记录:与 gRPC 有关的调试工具,比如 gRPC Web UI、gRPCurl 等等。
解决方案
gRPC Web UI
下载地址:Releases · fullstorydev/grpcui
运行 Web UI 服务:

grpcui -plaintext -import-path “protos/” \
-proto “protos/controller.proto” \
“<ip address>:<port number>”

gRPCurl
下载地址:fullstorydev/grpcurl: Like cURL, but for gRPC: Command-line tool for interacting with gRPC servers
使用 gRPCurl 工具:

wget -P /tmp https://github.com/fullstorydev/grpcurl/releases/download/v1.8.0/grpcurl_1.8.0_linux_x86_64.tar.gz

grpcurl -plaintext \
-import-path ./protos/ \
-proto ./protos/controller.proto \
-d ‘{“flag”: false}’ \
“<ip address>:<port number>” controller.RPCService/GetBlockNumber[……]

READ MORE

「gRPC」- 常用代码

获取 gRPC 版本
grpc version in Python · Issue #17572 · grpc/grpc

>>> from grpc import _grpcio_metadata
>>> _grpcio_metadata.__version__
‘1.17.1’[……]

READ MORE

「Configuration Management」- 配置管理

问题描述
该分类下保存了「配置管理」相关的内容。主要是涉及「配置分发」、「运维自动化」等等内容。
虽然这些工具还有其他的用途,但是在这里(我的工作)这些工作主要用途还是用作「配置管理」和「运维自动化」方面的内容。
既然是配置管理,这里肯定会包含一些「配置管理」的方法。
解决方案
在早期时(原始时期)
我们会借助 Shell 脚本来完成批量主机管理:

#!/bin/sh

IP_ADDRESSES=(10.10.50.172 10.10.50.171 10.10.50.170)
NEW_IP_ADDRESSES=(10.10.50.217 10.10.50.218 10.10.50.219)
HOSTNAME_LIST=(esclus-01 esclus-02 esclus-03)

for i in “${!IP_ADDRESSES[@]}”
do
echo “############################# ${IP_ADDRESSES[$i]}”

# 复制公钥
sshpass -p “your-password” ssh-copy-id root@”${IP_ADDRESSES[$i]}”

# 修改主机名
ssh root@”${IP_ADDRESSES[$i]}” hostnamectl set-hostname “${HOSTNAME_LIST[$i]}”
ssh root@”${IP_ADDRESSES[$i]}” “echo >> /etc/hosts; echo 127.0.0.1 ${HOSTNAME_LIST[$i]} >> /etc/hosts”

ssh root@”${IP_ADDRESSES[$i]}” \
nmcli connection add connection.id ens33 \
connection.type 802-3-ethernet ipv4.addresses “${NEW_IP_ADDRESSES[$i]}/24” \
ipv4.dns “‘10.10.50.7 10.10.50.6′” ipv4.gateway “10.10.50.1” \
ipv4.method manual \
ifname ens33
ssh -oServerAliveInterval=2 -oServerAliveCountMax=2 root@”${IP_ADDRESSES[$i]}” nmcli connection up ens33
done

Chef[……]

READ MORE

「AWX」- Ansible WorX

AWX提供基于Web的用户界面、REST API、构建在Ansible之上的任务引擎。它是Ansible Tower的上游项目,Ansible Tower是AWX的商业衍生品。
项目名 AWX 代表什么?
Ansible AWX – What AWX stands for? – Stack Overflow What does ‘AWX’ stand for? Correct some things in the README · ansible/awx@5c6895e · GitHub
Ansible-Commander => AnsibleWorks => AWX

章节列表
「AWX」- 安装与升级 「AWX」- 常见问题处理[……]

READ MORE

「AWX」- 安装与升级

通过 Docker Compose 运行,如何停止?
How to stop the awx docker containers? Please add it to the readme. · Issue #58 · ansible/awx · GitHub

docker-compose -f ~/.awx/awxcompose/docker-compose.yml stop

CentOS
ORACLE-BASE – AWX Installation on Oracle Linux 7 (OL7) Using the Docker-Compose Method awx/INSTALL.md at devel · ansible/awx · GitHub
安装(Docker)
没什么可写的…… 项目下已经说的很清楚了,按照手册运行一下就行了,这里做个简单记录,实际以为「INSTALL.md」主;
#1 环境要求
部署 AWX 的主机上需要安装 Docker、docker-py 这些东西;
部署需要用到 Ansible 来运行 Playbook,所以要安装 Ansible 包;
#2 检出 AWX 源码
git clone …
#3 修改 installer/inventory 文件
修改源码目录下的 installer/inventory 文件: 1)修改 PostgreSQL 的信息:需要使用 PostgreSQL 数据库。要么使用 Docker 镜像,要么使用外部的 PostgreSQL 数据库。我使用了 Docker 镜像打包的 PostgreSQL 数据库,所以要修改postgres_data_dir变量(指定要挂载到镜像中,用于存储数据的目录)。如果使用外部数据库,那就需要安装 PostgreSQL 数据库,然后设置 pg_hostname 变量,参考手册; 2)设置 AWX 的帐号密码:帐号密码信息需要修改admin_user和admin_password变量;
修改之后保存接口;
#4 执行 Playbook 来安装 AWX 服务
# cd installer
# ansible-playbook -i inventory install.yml
#5 访问 AWX 服务
http://ipaddress/
参考文献
awx/installer/inventory awx/INSTALL.md[……]

READ MORE

「AWX」- 常见问题处理

相关链接
How to add a new inventory, create a Host and Credential in AWX Ansible Tower – YallaLabs[……]

READ MORE

「Ansible」- 自动化工具

问题描述
该笔记将记录:与 Ansible 有关的内容。基于《Ansible快速入门:技术原理与实战》一书的内容,并结合官方文档,进行一系列的扩展。
Ansible ?
通过SSH服务,批量管理远程主机。包括,复制文件、安装软件、管理服务等等。
解决的问题
批量操作远程主机:批量部署、批量启动、批量修改、批量重启……
系统架构
系统架构

管理节点 -> SSH协议 -> 远程主机(node0)
|-> 远程主机(node1)
|-> 远程主机(node2)
|-> ……

管理节点:安装「Ansible」「SSH客户端」的主机。 远程主机:运行「SSH」服务的主机。
可以同时管理各个系列的Linux发行版及Windows,主要是因为通过SSH访问管理远程主机,所以和远程主机系统的类型并无太大的关系。
Ansible Tower
面向企业用户的收费软件。解决了如下问题:

维护工作量大:每台主机都要配置SSH连接。如果每个管理员运行了自己的Ansible,那每个管理员都要配置到每台服务器的SSH连接。而且每增加一台主机,所有管理员都需要手动添加一次SSH连接信息。
安全隐患大:在安全方面,为了连接服务器,那每个管理员都有了远程主机的连接信息。
协同性弱:每个管理员都可能有自己的脚本库,有的脚本可能是为了解决同一个问题,但管理员之间没有一个通用的协作共享脚本的机制。
可视性差:基本一般通过Shell终端运行,执行结果的可视化与持久化相对较差。

使用Ansible Tower通过网页界面来操作Ansible、执行命令、Playbook等等:

/ – – – Node 5
Ansible Administrator – – -\ / – – – Node 3
\ / – – – Node 1
Ansible Administrator – – – — – Ansible Tower – – – – – – – Node 0
/ \ – – – Node 2
Ansible Administrator – – -/ \ – — – Node 4
\ – — – Node 6

相关链接
Ansible Documentation
Ansible Documentation[……]

READ MORE

「Ansible」- 基本概念及术语

2.1 安装

#!/bin/bash

################################################################################
# 远程主机
################################################################################
# 远程主机无需做过多的配置,只需启动SSH服务,并且具有Python 2.4以上的环境。

################################################################################
# 管理节点
################################################################################
# 安装Ansible
yum install -y epel-release.noarch
yum install -y ansible

# 配置「管理节点」到「远程主机」的连接
# 即SSH连接(这里配置的是密钥连接,而不是密码连接。在Ansible中,这两种都是可以的。)
ssh-keygen
ssh-copy-id username@hostname
ssh-keyscan hostname >> ~/.ssh/known_hosts

# 测试SSH连接
ssh username@hostname

2.2 设置要管理的主机
接下来,需要指定要被Ansible管理的主机:“主机目录(Host Inventory)”,一个配置文件,/etc/ansible/hosts,指定了被管理的主机,内容如下:

# 被管理的主机列表
a.example.com
b.example.com
c.example.com

# “[dbserver]”,定义名为dbserver的主机组,指定“dbserver”等价于指定了dbserver部分下的所有主机
[dbserver]
db0.example.com
db1.example.com
db2.example.com

# 同“[dbserver]”,定义主机组。
[webserver]
web0.example.com
web1.example.com
web2.example.com

2.3 使用命令管理主机
Ansible提供了命令行工具,称为“Ad-Hoc Commands”。
命令通常是ansible <host-pattern> [options]格式。下面是几个命令示例:

# 检查所有的远程主机,是[……]

READ MORE

「Ansible」- 安装(Linux)

CentOS 7.4 and Ansible 2.8.4
# 10/17/2019

#!/bin/sh

yum search ansible

yum list ansible –showduplicates

yum install -y ansible-2.8.5-1.el7

相关链接
Installation Guide Ansible Porting Guides
参考文献
Ansible Docs/Installation Guide YUM – Install Specific Version of Package[……]

READ MORE

「Ansible」- 配置与管理

章节列表
「Ansible」- 使用 ansible.cfg 配置 「Ansible」- 使用 主机清单 管理主机 「Ansible」- 使用 Playbook 脚本 「Ansible」- 使用模块 「Ansible」- copy 「Ansible」- shell 「Ansible」- yum / yum_repository[……]

READ MORE

「Ansible」- 使用 主机清单 管理主机

主机清单,Host Inventory,是配置文件,用于记录 Ansbile 管理主机,可对主机分组。
配置文件位置
默认为 /etc/ansible/hosts 文件,可以在 /etc/ansible/ansible.cfg 中设置 inventory 参数来修改 主机清单 的位置。
可以在命令行中使用选项来指定“主机清单”的位置:

ansible-playbook -i hosts site.yml

ansible-playbook –inventory-file hosts site.yml

# Excluding a host from a playbook run
# https://coderwall.com/p/mnnjkg/excluding-a-host-from-a-playbook-run
ansible-playbook –limit ‘all:!bad_host’ playbook.yml

编写主机清单文件
第一步、注释
使用 # 注释行,添加清单文件说明
第二步、定义目标主机
可以直接定义:

mail.example.com
ntpd.example.com

可以将主机分组:

[dbservers]
one.example.com
two.example.com
three.example.com

[webservers]
www[01:50].example.com

[databases]
db-[a:f].example.com

方法三、分组嵌套:

# 定义第一个主机分组
[group-atlanta]
hostl.example.com
host2.example.com

# 定义第二个主机分组
[group-raleigh]
host2.example.com
host3.example.com

# 第一个嵌套分组
[sourceeast:children]
atlanta
raleigh

# 第二个嵌套分组
[usa:children]
southeast
northeast
southwest
northwest

第三步、指定连接方法
所有可用参数参考 Connecting to hosts: behavioral inventory parameters 手册
在主机后面指定参数:

[targets]
localhost ansible_connection=local

other0.example.com ansible_connection=ssh ansible_user=mpdehaan
otherl.exampl[……]

READ MORE

「Ansible」- 使用 Playbook 脚本

如何在远程主机中执行多个任务?
很显然,我们可以将众多 ansible 命令放在 Shell 脚本中执行,以实现批量部署操作。比如:

#!/bin/sh

ansible host-01 -m ping
ansbile host-01 -m copy -a “src=/etc/hosts dest=/tmp/hosts”
ansible host-01 -m shell -a “/sbin/reboot”

但是,如果我们的需求更加复杂呢?比如需要根据远程主机的环境、当前状态、发行版版本等等结果来执行不同的命令呢?很显然在 Shell 脚本中使用 ansible 命令不是最佳方案。那我们应该怎么办呢?
Ansible 提供了脚本化的功能,将任务编写到脚本中,运行该脚本以执行多个任务,这种脚本被称为 Playbook。使用 Playbook 描述 Ansible 要执行的系列操作,脚本为YAML文件,以yml或yaml为后缀。它替代在Shell脚本中挨个命令执行的方式。
使用 Playbook 脚本(快速开始)
第一步、编写 Playbook 脚本


– hosts: web
vars:
http_port: 80
max_clients: 200
remote_user: root

# 任务列表
tasks:
– name: ensure apache is at the latest version
yum: pkg=httpd state=latest
– name: Write the configuration file
template: src=templates/httpd.conf.j2 dest=/etc/httpd/conf/httpd.conf
notify:
– restart apache
– name: Write the default index.html file
template: src=templates/index.html.j2 dest=/var/www/html/index.html
– name: ensure a pache is running
service: name=httpd state=started

# 回调处理
handlers:
– name: restart apache
service: name=httpd state=restarted

第二步、执行 Playbook 脚本
使用 ansible-playbook 命令执行 Pl[……]

READ MORE

「Ansible」- Playbook

#4 Playbook杂谈
4.1 再谈 Ansible 变量
变量作用域:

Global ,作用域为全局

Ansible 配置文件中定义的变量。
环境变量。
ansible(1)/ansible-playbook(1)在命令行中传进来的变量

Play,作用域为Play(一个Playbook由多个Play构成)

Play 中 vars 关键字下定义的变量。
通过模块include_vars 定义的变量。
role 在文件 default/main.yml 和 vars/main.yml 中定义的变量。

Host,作用域为某个主机

定义在主机清单中的变量。
主机的系统变量(Facts)。
注册变量(register)。

变量的优先级:

role defaults – 放在文件 roles/x/defaults/main.yml 中的变量。
dynamic inventory variables – 在主机清单(/etc/ansible/hosts)中定义的变量。
inventory variables
inventory group_vars – 主机清单中定义的组变量,或者在group_vars/下与主机组名同名文件中定义的。
inventory host_vars – 主机清单中定义的主机变量,或者在host_vars/下与主机名同名文件中定义的。
playbook group_vars – 与Playbook同级的group_vars/下。
playbook host_vars – 与Playbook同级的host_vars/下。
host facts – 从远程主机收集的变量。使用ansible hostl -m setup查看。
registered variables – 使用register指令将执行结果注册到的变量。
set_facts – 模块,在任务中通过 set_facts 加入一些 Facts 变量。
play variables – 在Playbook中,使用vars定义的变量。
play vars_prompt – 在执行Playbook时,需要用户输入的变量(使用prompt指定)。
play vars_files – 使用var_files指定引入的变量文件。
role variables and include variables – 在roles/x/vars/main.yml中定义的变量。或在rol[……]

READ MORE

「Ansible」- 使用变量

在 Playbook 中,常用变量可以分为以下几类:
第一种、用户自定义变量
在 Playbook 中: 1)用户可以通过 vars 关键字自定义变量; 2)也可以使用 vars_files 关键字引入包含变量定义的文件; 3)在使用时用 {{ var_name }} 引用变量。
如下示例,在 Playbook 中定义并使用变量:

– hosts: web

# 在 Playbook 中定义和使用变量
vars:
http_port: 80
remote_user: root
foo:
state: enabled
immediate: yes

# 在配置文件中定义变量
vars_files:
– vars/server_vars.yml

# 如果不需要使用系统变量,可以关闭远程变量的收集
gather_facts: no

tasks :
– name: “使用用户定义的变量”
firewalld: port=”{{ http_port }}/tcp” permanent=”true” state=”{{ foo.state }}” immediate=”{{ foo[‘immediate’] }}”
– name : “直接使用系统变量的示例”
shell : echo {{ ansible_os_family }}
– name : “使用复杂的系统变量的示例”
shell : echo {{ ansible_os_family }} {{ ansible_ens3[“ipv4”][“address”] }} {{ ansible_ens3.ipv4.address }}

在如上示例中的 foo 是个复杂的变量,可以通过 foo.state、foo[‘immediate’] 引用。
在使用 {{ var_name }} 引用变量时,如果以 { 作为参数开始,则需要需要加上双引号(通常为 “{{ var_name }}” 形式),否则可能会产生错误。
第二种、远程节点变量(Facts)
此类变量无须用户进行定义,而是 Ansible 在执行 Playbook 脚本之前,使用 setup 模块去全程主机上搜集关于远程节点系统信息的变量。
这些搜集到的系统信息叫作 Facts,这些信息可以已经变量的形式直接使用。使用 ansible all -m setup -u root 命令查看这些信息。
如果不需要 Facts 信息,可以通过关键字 gather_facts 进行关闭:


– hosts: product[……]

READ MORE

「Ansible」- 使用模块

模块类型
核心模块(Core Module)
无需额外下载和配置,在安装 Ansible 后就可以直接使用的;常用;经过严格测试;
附加模块(Extra Module)
需进行下载和额外的配置才能使用;不常用;可能包含 BUG 的模块;
安装附加模块
如果需要使用某个附加模块,则需要单独安装。介绍三种方法安装附加模块:
第一步、下载附加模块
下载 Ansible Module Extra 项目:git clone https://github.com/ansible/ansible-modules-extras.git
第二步、安装附加模块
方法一:全局有效。修改 /etc/ansible/ansible.cfg 配置文件,加入 library=/path/to/ansible-modules-extras/ 行。
方法二:当前目录。修改与 Playbook 同级目录的 ansible.cfg 配置文件,使其只对当前目录的 Playbook 生效。修改方法与「方法一」类似,但可以使用相对路径。
方法三:环境变量。export ANSIBLE_LIBRARY=/path/to/ansible-modules-extras/
模块使用方法
如何查看模块使用方法?

#!/bin/sh

ansible-doc “<module_name>”

# Core 模块可以在任何目录下执行,例如查看yum的用法:
ansible-doc yum

# Extra 模块必须在配置了 Extra 模块的目录下查看其用法。
ansible-doc archive

常用模块及文档
setup – Gathers facts about remote hosts
env – read the value of environment variables
debug – Print statements during execution
相关链接
Docs » User Guide » Working With Modules[……]

READ MORE

「Ansible」- copy

copy – Copy files to remote locations
简单实例

– name: Copy file with owner and permissions
copy:
src: /srv/myfiles/foo.conf
dest: /etc/foo.conf
backup: yes
owner: foo
group: foo
mode: ‘0644’[……]

READ MORE

「Ansible」- shell

shell – Execute shell commands on targets
执行 Shell 命令

– name: Execute the command in remote shell; stdout goes to the specified file on the remote.
shell: somescript.sh >> somelog.txt[……]

READ MORE

「Ansible」- systemd / service

systemd – Manage services service – Manage services
service_facts – Return service state information as fact data
检测 systemd 服务
Ansible tips’n’tricks: checking if a systemd service is running
使用 service_facts 可以获取服务信息,该模块支持 systemd, sysv, upstart 三种。

– name: “获取服务信息”
service_facts:

– name: “如果 Docker 已安装,则重启 Docker 服务”
when: ansible_facts.services[“docker.service”] is defined
systemd:
name: docker.service
state: restarted[……]

READ MORE

「Ansible」- yum / yum_repository

yum – Manages packages with the yum package manager yum_repository – Add or remove YUM repositories
安装或卸载多个软件包
Ansible – How to Install or Remove Multiple Packages
方法一、使用变量(推荐)

– name: ensure a list of packages installed
yum:
name: “{{ packages }}”
state: installed
vars:
packages:
– httpd
– httpd-tools

方法二、使用循环


– hosts: docker-host

tasks:
– name: Remove old versions of Docker
yum: pkg={{item}} state=absent
with_items:
– docker
– docker-common
– container-selinux
– docker-selinux
– docker-engine

添加软件仓库(.repo)
Importing/adding a yum .repo file using Ansible
在某些软件,比如 Docker 服务,官方直接提供 .repo 仓库文件。此时无法使用 yum_repository 模块,只能使用命令进行添加:

– name: “添加 REPO 仓库”
shell: yum-config-manager –add-repo http://example.com/path/to/foo.repo

当然,如果没有其他设置,本质上还是复制 .repo 文件,因此也可以采用其他方法。[……]

READ MORE

「Ansible」- 管理 Windows 主机

本笔记只记录管理 Windows 主机的通用设置流程,是对 Docs » User Guide » Windows Guides 手册的学习整理。
第一步、设置 Windows 主机
主机要求
Ansible can generally manage Windows versions under current and extended support from Microsoft. Ansible can manage desktop OSs including Windows 7, 8.1, and 10, and server OSs including Windows Server 2008, 2008 R2, 2012, 2012 R2, 2016, and 2019.
Ansible requires PowerShell 3.0 or newer and at least .NET 4.0 to be installed on the Windows host.
A WinRM listener should be created and activated. More details for this can be found below.
或者也可以使用 SSH 服务,但是官网也给出警告:Use this feature at your own risk! Using SSH with Windows is experimental, the implementation may make backwards incompatible changes in feature releases. The server side components can be unreliable depending on the version that is installed.
设置 WinRM 服务
官方推荐给出连接与管理 Windows 主机的方法,使用 WinRM 服务。
设置 SSH 服务(官方有警告)
虽然可以使用,但是官方警告存在版本兼容性问题,所以可靠性无法得到保证。
Windows Remote Management
本部分介绍使用 WinRM 连接并管理主机时,相关配置设置等内容。
第二步、使用 Ansible 管理 Windows 主机
本部分介绍如何使用 Ansible 及其 Modules 管理 Windows 主机。
Desired State Configuration(可选方案)
使用 Ansible 的 win_dsc 模块来调用 DSC 工具。
性能优化
优化处理 PowerShell 性能问题。
常见[……]

READ MORE

「Ansible」- Role and Galaxy

3.5 最佳使用方法
(1)鼓励文件的重用,尽量使用 include 和 role 避免重复的代码。 (2)尽量把大的文件分成小的文件。
官方例子:http://github.com/ansible/ansible-examples 分享平台「Ansible Galaxy」:这是用户分享的Playbook,使用前,请进行严格的测试。
#5 role & Ansible Galaxy
5.1 role 和 Ansible Galaxy 的简要介绍
role 是高级版本的 include 语句, include 用 来分享单个 Playbook 文件 , 而 role 可以分享一个文件夹 , 文件夹里面包含 task (任务)、handlers、 file (文件)、 template (模板)和 variable( 变量 )。
role文件夹里面包含了实现一个完整的功能所有文件 。例如 ,安装和配置 Web 服务器 Nginx、或者安装和配置数据库 MySQL 等。Ansible 中的 role 与编程语言中包(package)的概念类似。
Ansible Galaxy 是 Ansible 提供的分享 role 的 网站。
5.2 role 的放置位置
role 文件夹都可以放在哪里呢?

当前子目录roles下(与Playbook同级)
环境变量 ANSIBLE ROLES PATH 定义的文件夹,Ansible 也会搜索该文件夹下放置的 role。
Ansible 配置文件中 roles_path 定义的文件夹,roles_path=/opt/mysite/roles:/opt/othersite/roles。如果已经定义了环境变量ANSIBLE_ROLES_PATH ,那么配置变量 roles_path 定义的文件夹就会失效。有效的配置文件有:

file that ANSIBLE CONFIG (an environment variable) pointed to
ansible.cfg (in the current directory)
.ansible.cfg (in the home directory)
/etc/ansible/ans 工ble.cfg

默认文件夹/etc/ansible/roles。既没有定义环境变量 ANSIBLE_ROLES_PATH ,也没有在配置文件中定义变量 roles_path

5.3 在 Playbook 中如何调用 role
通过关键字roles来调用role。Ansible会自动在Playbook同级的roles/下查找[……]

READ MORE

「Tower and AWX」

#6 Ansible Tower
6.1 为什么要用 Ansible Tower
在企业中 , 被管理的远程主机有成百上千台 , 每位管理员都需要配置所有主机的 SSH 连接,无疑工作量是巨大的。如果每位管理员的电脑上都存储了 SSH 密钥,那么如果管理员的工作出 现变动,无疑会出现很多的安全隐患 , 尤其是线上产品使用的主机。
Ansible Tower 解决了企业级用户面临的上述难题 , 它是中心化的 Ansible 管理节点 , 远程主机管理员通过登录 Tower 来运行 Playbook , 无须每位管理员都在自己的机器上配置 SSH 连接,提高了工作效率。另外 , 在 Tower 申有 SSH 使用权限的访问控制,即便有权限使用 SSH 秘钥的管理员,也不能直接看到 SSH 密钥的明文 , 从而确保了安全。
Ansible Tower 的主要功能:

用户和权限的管理。
Ansible 命令行工具能做的事 , 通过 Tower 网站图形化界面都可以做。这也是Tower 最重要的功能。
记录 Playbook 的所有执行结果 , 提供用户视角和主机视角的统计信息。
提供了 API 接口 , 让第三方平台可以根据 API 调用 Tower 的功能。
在Tower中执行操作和命令行中进行的操作是相对应的。在命令行中:

需要配置基于密钥的 SSH 连接。
把新的远程主机加到 inventory 中。
准备 Playbook 及其需要的所有文件。
运行 Playbook。

Ansible Tower 的主要功能和 Ansible 命令行的使用相对应。
Ansible界面介绍:略过。
6.2 如何使用 Ansible Tower
安装:略过,参考官方手册
初始化:略过;
Ansible Tower 关于 Ansible 的功能是通过调用 Ansible 命令行实现的,如果登录 Ansible Tower ,修改 Ansible 的配置文件,那么对 Ansible Tower 也是生效的。Ansible Tower 3.0.3 默认会安装 Ansible 2.1 命令行工具。但在该版本的 Tower 申正确配置 Extra 模块后,执行时会一直提示找不到相关模块的错误。这是因为 Ansible 2.1 对 Extra 模块的 支持有 bug ,登录到安装有 Ansible Tower 的服务器,手动升级 Ansible 到 2.2 以上的版本即可。
6.3 与第三方平台的整合
Ansible Tower 提供了标准的 REST API 来供第三方平台调用 Ansible Tower 的[……]

READ MORE

「Ansible」- 使用 ansible.cfg 配置

3.1 配置文件(ansible.cfg)
配置文件 /etc/ansible/ansible.cfg 用于控制 Ansible 的行为,可以修改 Ansible 的主机目录、扩展模块位置、远程主机的临时目录、管理节点的临时目录、连接端口号、超时时间等等。参考「Configuring Ansible」一文。
配置文件优先级(有高到低):

ANSIBLE_CONFIG – 环境变量
ansible.cfg – 当前目录
$HOME/.ansible.cfg – 用户家目录($HOME)
/etc/ansible/ansible.cfg

Ansible 1.5 以前版本的顺序如下:

ansible.cfg – 当前目录
ANSIBLE_CONFIG – 环境变量
.ansible.cfg – 用户家目录($HOME)
/etc/ansible/ansible.cfg[……]

READ MORE

「RKE」- Rancher Kubernetes Engine

Rancher Kubernetes Engine (RKE) 是一个 CNCF 认证的 Kubernetes 发行版,完全在 Docker 容器中运行。它适用于裸机和虚拟化服务器。 RKE 解决了安装复杂的问题,这是 Kubernetes 社区的一个常见问题。使用 RKE,Kubernetes 的安装和操作既简单又容易自动化,并且完全独立于您运行的操作系统和平台。只要你能运行受支持的 Docker 版本,你就可以使用 RKE 部署和运行 Kubernetes;
简单说,通过 RKE 工具,我们能够快速部署 Kubernetes 集群:在 YAML 中,通过定义主机 SSH 连接信息,RKE 将负责完成后续的 Kubernetes 部署任务。[……]

READ MORE

「Rancher」- 概念术语

系统架构

概念术语
Downstream Cluster
被 Rancher Server 管理的集群
Local Cluster
运行 Rancher Server 的集群;
参考文献
Rancher Docs: Architecture[……]

READ MORE