ansible 常见操作命令

1、ansible all -k -m shell -a ‘hostname’

没有配置 ssh 公私钥时输入密码

配置后:ansible all -m shell -a ‘hostname’

3、ansible 配置变量

ansible_ssh_pass=’password’  #配置密码

[group]

host1

host2

[group:vars]

ansible_ssh_pass=’password’  #为组配置密码或者其他变量

4、配置 inventory 目录

编辑 cfg 文件,

/etc/ansible # cat ansible.cfg

[defaults]
host_key_checking = False
inventory = /etc/ansible/inventory

在/etc/ansible/inventory 目录下配置响应的文件

ansible all –list-hosts 检查机器列表正确

5、使用用户密码登录认证

编辑 host 文件,修改类似以下内容:

cat /etc/ansible/inventory/hosts
[test]
iZ28nwm86khZ
[test:vars]
ansible_ssh_user=my_webad
ansible_ssh_pass=’my_webad’

然后执行验证

ansible test -m command -a ‘id’ -o

6、复制文件

ansible webservers -m copy -a ‘src=/etc/hosts dest=/tmp/myhosts owner=root group=root mode=755 backup=yes’ -o

ansible webserver -m shell -a ‘md5sum /tmp/myhosts’  -o 检查生效

7、收集服务器配置信息

ansible webserver -m setup

8、安装 ansible-shell

 

 

 

ansible 下载和安装和基本配置过程

1、如果要安装的服务器能够连接互联网

pip install ansible

2、如果要安装的服务器不能够连接互联网

在一台能够下载的服务器下载文件:

pip install –download “pathofdownload” ansible

将下载后的 python 组建copy 到需要安装的服务器,执行以下步骤安装

pip install –no-index –find-links=“pathofdownload” ansible

3、配置 ssh 公私钥对

ssh-keygen

ssh-copy-id -i /root/.ssh/id_rsa.pub root@hostname

4、配置 /etc/ansible/hosts 文件,添加主机列表

5、配置/etc/ansible/ansible.cfg,添加一下内容

[defaults]
host_key_checking = False

放置进行 ssh 操作的时候出现密钥纠正提示的 yes or no 信息。

 

配置apache url过滤正则表达式匹配

ProxyPassMatch Directive
Description: Maps remote servers into the local server URL-space using regular expressions

Syntax: ProxyPassMatch [regex] !|url [key=value [key=value …]]

Context: server config, virtual host, directory

Status: Extension

Module: mod_proxy

Compatibility: available in Apache 2.2.5 and later

This directive is equivalent to ProxyPass but makes use of regular expressions instead of simple prefix matching. The supplied regular expression is matched against the url, and if it matches, the server will substitute any parenthesized matches into the given string and use it as a new url.
Suppose the local server has address http://example.com/; then
ProxyPassMatch ^(/.*\.gif)$ http://backend.example.com$1

will cause a local request for http://example.com/foo/bar.gif to be internally converted into a proxy request to http://backend.example.com/foo/bar.gif.
Note

The URL argument must be parsable as a URL before regexp substitutions (as well as after). This limits the matches you can use. For instance, if we had used

ProxyPassMatch ^(/.*\.gif)$ http://backend.example.com:8000$1

in our previous example, it would fail with a syntax error at server startup. This is a bug (PR 46665 in the ASF bugzilla), and the workaround is to reformulate the match:

ProxyPassMatch ^/(.*\.gif)$ http://backend.example.com:8000/$1

The ! directive is useful in situations where you don’t want to reverse-proxy a subdirectory.
例子

linux可用内存使用分析问题

服务器01内存MEMAppUsablePerc告警,当时的现场信息如下:
服务器01使用free查看内存使用率,可以看到算上buffers和cache,内存还剩余了2.7G,但是patrol上显示可用MEMAppUsablePerc只有5% :
pacpgwq01:~ # free -m
total used free shared buffers cached
Mem: 7867 7705 162 0 136 2459
-/+ buffers/cache: 5109 2758
Swap: 0 0 0

服务器02使用free查看内存使用率,算上buffers和cache,内存还剩余了2.1G,与patrol上显示可用MEMAppUsablePerc为25%,基本相符:
pacpgwq02:~> free -m
total used free shared buffers cached
Mem: 7867 7732 134 0 32 1937
-/+ buffers/cache: 5762 2104
Swap: 0 0 0

为什么free –m的内容差不多,patrol差异这么大?

后来跟监控组确认MEMAppUsablePerc的计算方法,其计算方法为:Patrol KM读取/proc/meminfo的字段,
MEMAppUsablePerc(内存可用率)=100*(MemFree+Buffers+Cached)/MemTotal
当时的相关信息如下:
pacpgwq01:/proc/sys/vm # cat /proc/meminfo
MemTotal: 8055952 kB
MemFree: 2844140 kB
Buffers: 1328 kB
Cached: 31888 kB
SwapCached: 0 kB

可以看到其cached为31M左右,与free –m看到2.4G的差别很大。

而pacpgwq02的信息如下,与Patrol基本一致,MEMAppUsablePerc为20%左右。
pacpgwq02:~ # cat /proc/meminfo
MemTotal: 8055952 kB
MemFree: 133852 kB
Buffers: 92856 kB
Cached: 1786256 kB
为什么会出现free –m与/proc/meminfo信息不一致的这个问题,后来查询相关资源发现:
SUSE之类的系统则认为:可用内存=free的内存+cached的内存+buffers的内存+SReclaimable的内存(SReclaimable为操作系统内存管理slob缓存的系统内核信息)
检查pacpgwq01的SReclaimable大小,发现有1.9G左右。
pacpgwq01:/usr # cat /proc/meminfo
MemTotal: 8055952 kB
MemFree: 158948 kB
Buffers: 145540 kB
Cached: 526864 kB

Slab: 2078612 kB
SReclaimable: 1967368 kB

调用以下命令调整内核参数,对文件环境、kernel缓存进行清理后,Cached、SReclaimable降低,MemFree显著增加,Patrol监控恢复正常。
pacpgwq01:/usr # echo 3 > /proc/sys/vm/drop_caches
pacpgwq01:/usr # cat /proc/meminfo
MemTotal: 8055952 kB
MemFree: 2731032 kB
Buffers: 1192 kB
Cached: 25604 kB
SwapCached: 0 kB

Slab: 150672 kB
SReclaimable: 39456 kB

以为这个问题就这么解决了,但是后续观察又发现运行一段时间后,pacpgwq01的SReclaimable值又增加了到1.3G,而没有执行任何操作的pacpgwq02其SReclaimable一直为180M左右。

那么SReclaimable为什么增长呢?slaptop发现,其主要为进程inode缓存proc_inode_cache(1G左右),其次为目录结构缓存dentry(300M),
pacpgwq01:/usr # slabtop
Active / Total Objects (% used) : 3723187 / 3809628 (97.7%)
Active / Total Slabs (% used) : 373224 / 373230 (100.0%)
Active / Total Caches (% used) : 95 / 175 (54.3%)
Active / Total Size (% used) : 1431793.25K / 1443443.42K (99.2%)
Minimum / Average / Maximum Object : 0.02K / 0.38K / 4096.00K

OBJS ACTIVE USE OBJ SIZE SLABS OBJ/SLAB CACHE SIZE NAME
1566570 1566254 99% 0.64K 261095 6 1044380K proc_inode_cache
1607260 1606750 99% 0.19K 80363 20 321452K dentry
31915 31893 99% 0.80K 6383 5 25532K ext3_inode_cache
121758 113904 93% 0.18K 5798 21 23192K vm_area_struct
2065 2061 99% 6.30K 2065 1 16520K task_struct
6804 5956 87% 1.62K 1701 4 13608K TCP

其有这么多的读写文件相关的缓存,肯定有大量的IO操作导致,需要对OS抓取trace确认哪些程序调用open,stat,close,unlink等操作。

抓取步骤如下:
1.如果问题可以在业务空闲是重现,则最好在业务空闲时执行。
2.请顺序执行如下命令:
# sysctl -w vm.block_dump=1
# echo 3 > /proc/sys/vm/drop_caches
# cat /proc/meminfo
3.等待Slab占用明显升高后,顺序执行如下命令:
# sysctl -w vm.block_dump=0
# cat /proc/meminfo
分析/var/log/messages,找到SReclaimable增加是执行的进程操作,判断哪一个进程导致。

负载均衡下linux建立链接失败的问题

该问题可能与linux的操作系统参数tcp_tw_recycle和tcp_timestamps有关系,理论的解释如下:

如下为tcpip握手部分的linux源码:
if (tmp_opt.saw_tstamp &&
tcp_death_row.sysctl_tw_recycle &&
(dst = inet_csk_route_req(sk, req)) != NULL &&
(peer = rt_get_peer((struct rtable *)dst)) != NULL &&
peer->v4daddr == saddr) {
if (get_seconds() < peer->tcp_ts_stamp + TCP_PAWS_MSL &&
(s32)(peer->tcp_ts – req->ts_recent) >
TCP_PAWS_WINDOW) {
NET_INC_STATS_BH(sock_net(sk), LINUX_MIB_PAWSPASSIVEREJECTED);
goto drop_and_release;
}
}
tmp_opt.saw_tstamp:该socket支持tcp_timestamp
sysctl_tw_recycle:本机系统开启tcp_tw_recycle选项
TCP_PAWS_MSL:60s,该条件判断表示该源ip的上次tcp通讯发生在60s内
TCP_PAWS_WINDOW:该条件判断表示该源ip的上次tcp通讯的timestamp 大于本次tcp

LINUX当前的参数设置为tcp_tw_recycle=1, tcp_timestamps=1,在这种配置下,如果后一个SYN的timestamp属性比前一个SYN的要小,LINUX就不会为后一个SYN发送ACK,导致问题现象。

这就能解释为什么本地服务器的syn包有时候已经到对方没有回报文,有时候有时好的,导致不能建立链接。

建议的的方案:
1、 先把临时上线的两台测试服务器的操作系统参数修改tcp_timestamps关闭,tcp_tw_recycle修改为打开,切换防火墙验证是否可行
具体操作:
echo 1 > /proc/sys/net/ipv4/tcp_tw_recycle
echo 0 > /proc/sys/net/ipv4/tcp_timestamps