ansible配置和模块

参考:http://www.zsythink.net/archives/2481

ansible是一个“配置管理工具”,也是一个“自动化运维工具”,可以帮我们批量完成一些经常重复操作的工作

ansible工作是通过SSH管理远程主机,不用在远程主机上安装agent。并且ansible具有幂等性,可以保证在重复执行同一操作时
,得到的结果是一致的。

安装和主机清单配置

安装ansible需要epel源。
yum install -y ansible
    
使用前需要在/etc/ansible/hosts文件中添加被管理的主机
[root@localhost ~]#vim /etc/ansible/hosts 
192.168.91.137 ansible_port=22 ansible_user=root ansible_ssh_pass=122333

测试:
[root@localhost ~]#ansible 192.168.91.137 -m ping					#-m:调用模块  ping:模块,探测被控主机是否能ping通
192.168.91.137 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": false, 
    "ping": "pong"				#返回pong表示能ping通
}

可以给主机添加别名,通过别名管理被控主机
[root@localhost ~]#vim /etc/ansible/hosts 
node2 ansible_host=192.168.91.137 ansible_port=22 ansible_user=root ansible_ssh_pass=122333

测试:
[root@localhost ~]#ansible node2 -m ping
node2 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": false, 
    "ping": "pong"
}
注意:此时不能通过IP地址管理被控端了。除非同时配置了IP和别名两个方式管理

但是上述方式不实用,因为ssh的密码会暴漏,所以经常使用基于密钥认证的SSH
生成默认格式的密钥对(公钥与私钥)
[root@localhost ~]#ssh-keygen

把生成的公钥复制到192.168.91.137的认证列表
[root@localhost ~]#ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.91.137

此时主机清单中的配置可以精简
192.168.91.137					#如果ssh端口不是默认的22,加上ansible_port=#
node2 ansible_host=192.168.91.137

可以一次操作主机清单中的所有主机
[root@localhost ~]#ansible all -m ping			#使用“all”

定义组
[A]
192.168.91.137
[B]
192.168.91.132
[root@localhost ~]#ansible A -m ping
192.168.91.137 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": false, 
    "ping": "pong"
}
[root@localhost ~]#ansible B -m ping
192.168.91.132 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": false, 
    "ping": "pong"
}

如果被控主机的IP是连续的,可以使用一下格式定义
[A]
192.168.91.[137:140]
[B]
192.168.91.132

可以用主机名管理后台主机,前提是ansible主机可以解析对应的主机名。可以使用以下格式
[A]
web-a.kej.com
[B]
web-b.kej.com
可以简写为以下格式
[A]
web-[a:b].kej.com

可以使用组嵌套组
[A]
192.168.91.137
[B]
192.168.91.132
192.168.91.131
[C]
A
B

ansible模块

使用ansible完成任务时,需要依靠ansible的各个模块。使用以下命令列出所有模块
ansible-doc -l

查看某个模块的详细用法,使用以下命令
ansible-doc -s 模块名

ansible的基本用法
ansible 被控主机 -m 模块 -a "模块参数"

copy模块:
功能:把ansible主机上的文件复制到被控主机上

fetch模块:
功能:把被控主机上的文件拉取到ansible主机上

file模块:
在被控主机上完成一些文件的基本操作,例如创建文件或目录,删除文件或目录,修改文件权限等

blockinfile模块:
在指定的文件中插入“一段文本”,这段文本是被标记过的,以便在以后的操作中可以通过“标记”找到这段文本,然后处理这段文本

如果在被控主机/data/fstab文件尾部插入如下字段
systemctl start mariadb
systemctl start nginx
可以使用如下命令
[root@localhost ~]#ansible 192.168.91.137 -m blockinfile -a "path=/data/fstab block='systemctl start mariadb\nsyst
emctl start nginx'"			#path指明要操作的文件,block指明要插入的字段内容,\n表示换行
结果:
# BEGIN ANSIBLE MANAGED BLOCK					#自动添加的开始标记
systemctl start mariadb							#block指定的文本内容
systemctl start nginx								#block指定的文本内容
# END ANSIBLE MANAGED BLOCK						#激动添加的结束标记

可以使用marker自定以标记
[root@localhost ~]#ansible 192.168.91.137 -m blockinfile -a "path=/data/fstab block='systemctl start mariadb\nsyste
mctl start nginx' marker='#{mark} service start'"			#{mark}表示BEGIN和END
结果:
#BEGIN service start
systemctl start mariadb
systemctl start nginx
#END service start

如果marker标记对应的文本块已经存在于文件中,而且block的值与之前文本块的内容不同,这时,对应的文本块中的内容会被更新,而不会再次插入新的文本块
[root@localhost ~]#ansible 192.168.91.137 -m blockinfile -a "path=/data/fstab block='systemctl start mariadb' marke
er='#{mark} service start'"
结果:
#BEGIN service start
systemctl start mariadb
#END service start

删除对应标记的文本块,以下两种方式
[root@localhost ~]#ansible 192.168.91.137 -m blockinfile -a "path=/data/fstab block='' marker='#{mark} service sta
rt'"
[root@localhost ~]#ansible 192.168.91.137 -m blockinfile -a "path=/data/fstab  marker='#{mark} service start' stat
e=absent"

使用backup,可以在修改文件之前对文件进行备份

使用create,如果指定的文件不存在,则创建

如果要把文本块插入到文档的开头,可以使用insertbefore=BOF, insertbefore支持正则表达式,文本块会插入到最后一次匹配的行的上一行
如果没有匹配到,默认会插入到最后一行

如果要把文本块插入到文档的结尾,可以使用insertafter-EOF

lineinfile模块:
管理文本文件中的行

检测某文件中是否存在某一行,如果没有则在文件尾部增加
[root@localhost ~]#ansible 192.168.91.137 -m lineinfile -a "path=/data/fstab line='swap'"

可以用正则表达式匹配文件中的每一行,如果匹配到不止一行,只有最后一行会被line定义的字段替换。如果使用state=absent,所有匹配到的行都会被删除。如果没有一行匹配到,默认会加到文件结尾

根据line定义的行删除,如果文件有多行都与line定义的行匹配,所有匹配到的行都会被删除
[root@localhost ~]#ansible 192.168.91.137 -m lineinfile -a "path=/data/fstab line='字符串' state=absent"

根据正则表达式删除行,如果有多行都匹配到,则会全部删除
[root@localhost ~]#ansible 192.168.91.137 -m lineinfile -a "path=/data/fstab regexp='正则表达式' state=absent"

默认情况下,lineinfile模块不支持后向引用,backrefs=yes开启

find模块:
在paths指定的路径下寻找contains表示的字符串,默认不递归查询。如要递归,使用recurse=yes,默认不查找隐藏文件
[root@localhost ~]#ansible 192.168.91.137 -m find -a "paths=/data/ contains='正则表达式' recurse=yes"

查找隐形文件。文件名要匹配patterns
[root@localhost ~]#ansible 192.168.91.137 -m find -a "paths=/data/ patterns='通配符' hidden=yes"

查找所有文件类型。文件名要匹配patterns
[root@localhost ~]#ansible 192.168.91.137 -m find -a "paths=/data/ patterns='通配符' file_type=any"

patterns默认使用通配符表示,use_regex=yes表示使用正则表达式
[root@localhost ~]#ansible 192.168.91.137 -m find -a "paths=/data/ patterns='正则表达式' use_regex=yes"

查找mtime在4天以内的文件
[root@localhost ~]#ansible 192.168.91.137 -m find -a "paths=/data/ age=-4d"

查找atime在4周以后的文件
[root@localhost ~]#ansible 192.168.91.137 -m find -a "paths=/data/ age=-4w age_stamp=atime "

查找大于等于2g的文件,size=-2g表示小于等于
[root@localhost ~]#ansible 192.168.91.137 -m find -a "paths=/data/ size=2g"

replace模块
根据正则表达式替换文件中所有被匹配到的字符串
[root@localhost ~]#ansible 192.168.91.137 -m replace -a "path=/data/fstab regexp=正则表达式 replace=最终要替换成的字符串"

可以后项引用
[root@localhost ~]#ansible 192.168.91.137 -m replace -a "path=/data/fstab regexp=.*(info).* replace=\1"

command模块
使用command在被控主机执行命令时,不会经过被控主机的shell处理,所以不支持特殊符号。如果命令中有特殊符号,使用shell模块
creates表示如果被控主机上有/data/fstab文件,则不会执行echo命令
[root@localhost ~]#ansible 192.168.91.137 -m command -a "creates=/data/fstab echo 122333"

removes表示如果被控主机上有/data/fstab文件,则会执行echo命令
[root@localhost ~]#ansible 192.168.91.137 -m command -a "removes=/data/fstab echo 122333"

shell模块
与command模块类似,但是支持特殊符号

script模块
可以在被控主机上执行ansible主机上的脚本,脚本一直在ansible主机上,不需要复制到被控主机。最好给脚本加上执行权限,不要用bash命令

service模块
管理被控主机上的服务
[root@localhost ~]#ansible 192.168.91.137 -m service -a "name=nginx state=started|stoped|restarted|reloaded"

[root@localhost ~]#ansible 192.168.91.137 -m service -a "name=nginx enabled=yes|no"

cron模块
管理被控主机的计划任务

user模块
管理被控端的用户

group模块
管理被控主机的组

yum模块
在被控主机上通过yum源管理软件包
disable_gpg_check=yes:当yum源没有没有开启gpg验证的情况下启用,安装包
[root@localhost ~]#ansible 192.168.91.137 -m yum -a "name=nginx disable_gpg_check=yes"
[root@localhost ~]#ansible 192.168.91.137 -m yum -a "name=nginx disable_gpg_check=yes state=installed|present"

删除包
[root@localhost ~]#ansible 192.168.91.137 -m yum -a "name=nginx state=removed|absent"

安装时临时启用或禁用某个仓库
[root@localhost ~]#ansible 192.168.91.137 -m yum -a "name=nginx enablerepo|disablerepo=仓库名"

yum_repository模块
管理被控主机上的yum仓库

description:设置仓库的注释信息,也就时name对应的内容
name:仓库ID,也就是[]中的内容
此命令生成的文件为/etc/yum.repos.d/aliEpel.repo
ansible 192.168.91.137 -m yum_repository -a 'name=aliEpel description="alibaba EPEL" baseurl=https://mirrors.aliyun.com/epel/$releasever\Server/$basearch/'

file:指明生成的文件名字,此命令生成的文件为/etc/yum.repos.d/alibaba.repo
enable:是否启用仓库
ansible 192.168.91.137 -m yum_repository -a 'name=aliEpel description="alibaba EPEL" baseurl=https://mirrors.aliyun.com/epel/$releasever\Server/$basearch/ file=alibaba enable=no|yes'

删除仓库
ansible 192.168.91.137 -m yum_repository -a 'file=alibaba name=aliEpel state=absent'

gpgcheck:是否开启包验证功能
gpgcakey:验证包所需的公钥位置
ansible 192.168.91.137 -m yum_repository -a 'name=local baseurl=file:///media description="local cd yum" gpgcheck=yes gpgcakey=file:///media/RPM-GPG-KEY-CentOS-7'
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值