Ansible快速入门(下)

Posted 若水三千

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Ansible快速入门(下)相关的知识,希望对你有一定的参考价值。

6. Ansible常用模块

ansible 有着诸多的模块,虽然模块众多,但最为常用的模块也就 20-30 个左右;

6.1 command模块

功能:在远程主机执行 Shell 命令;此为默认模块,可忽略 -m 选项;
注意:不支持管道命令 |

参数 选项 含义
chdir chdir /opt 执行ansible时,切换到指定的目录
creates creates /data/file 如果文件存在,则跳过执行
removes removes /data/file 如果文件存在,则执行

范例1:chdir ,切换目录执行 Shell 命令;

[root@manger ~]# ansible localhost -m command -a \'chdir=/root echo $PWD\'
localhost | CHANGED | rc=0 >>
/root

范例2:creates ,如果 /data/file 文件存在,则跳过执行;

[root@manger ~]# ansible localhost -m command -a \'creates=/data/file ifconfig eth0\'
localhost | SUCCESS | rc=0 >>
skipped, since /data/file exists

范例3:removes ,如果 /data/file 文件存在,则执行;

[root@manger ~]# ansible localhost -m command -a \'removes=/data/file ifconfig eth0\'
localhost | CHANGED | rc=0 >>
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>
mtu 1500
	inet 10.0.0.6 netmask 255.255.255.0 broadcast 10.0.0.255
	inet6 fe80:20c:29ff:fe2a:348 prefixlen 64 scopeid 0x20<link>
	ether 00:0c:29:2a:03:48 txqueuelen 1000 (Ethernet)
	RX packets 76534 bytes 99611397 (96.9 MiB)
	RX errors 0 dropped 0 overruns 0 frame 0
	TX packets 17274 bytes 1957911 (1.8 MiB)
	TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

6.2 shell模块

功能:在远程主机执行 Shell 命令,执行管道等特殊符号的操作;

参数 选项 含义
chdir chdir /opt 执行ansible时,切换到指定的目录
creates creates /data/file 如果文件存在,则跳过执行
removes removes /data/file 如果文件存在,则执行

范例1:使用 Shell 命令过滤被控端主机的 IP 地址;

[root@manger ~]# ansible localhost -m shell -a "ifconfig eth0|awk \'NR==2\' "
[WARNING]: No inventory was parsed, only implicit
localhost is available
localhost | CHANGED | rc=0 >>
	inet 10.0.0.6 netmask 255.255.255.0 broadcast 10.0.0.255

6.3 script模块

功能:在被控节点,运行 Ansible 主机的脚本;

范例1:在 Ansible 主机上编写脚本,然后推送至被控端运行;

#在本地运行模块,等同于在远程执行,不需要将脚本文件进行推送目标主机执行
[root@manger ~]# ansible webservers -m script -a "/data/yum.sh"

6.4 yum模块

功能:管理各个操作系统的软件包;

参数 选项 含义
name httpd、nginx ... 指定安装软件包名或软件包URL
state present(Defaults)、absent、latest 指定yum对应的方法
enablerepo epel、base ... 允许从哪些仓库获取软件
disablerepo epel、base ... 禁止从哪些仓库获取软件
exclude kernel ... 排除某些软件包
download_only yes、no 仅下载软件包,不安装

范例1:安装当前最新的 Apache 软件,如果存在则不安装

[root@manger ~]# ansible webservers -m yum -a "name=httpd state=present"

范例2:安装当前最新的Apache软件,通过epel仓库安装

[root@manger ~]# ansible webservers -m yum -a "name=httpd state=present enablerepo=epel"

范例3:通过公网 URL 安装 rpm 软件

[root@manger ~]# ansible webservers -m yum -a "name=https://xx.rpm state=present"

范例4:安装最新版本的 Apache 软件,如果存在则更新 Apache

[root@manger ~]# ansible webservers -m yum -a "name=httpd state=latest"

范例5:更新所有的软件包,但排除和 kernel 相关的

[root@manger ~]# ansible webservers -m yum -a "name=* state=latest exclude=kernel"

范例6:删除 Apache 软件

[root@manger ~]# ansible webservers -m yum -a "name=httpd state=absent"

6.5 copy模块

功能:从 ansible 服务端主控端复制文件到远程主机;

参数 选项 含义
src 复制本地目录下的文件至远程服务器
dest 文件复制到远程的绝对路径
owner root(Defaults) 文件复制到远程并设定属主
group root(Defaults) 文件复制到远程并设定属组
mode file=644,directory=755 文件复制到远程并设定权限
backup yes 备份被修改前的配置文件
content 新建文件并给文件添加内容

范例1:将本地的 httpd.conf 文件 Listen 端口修改为 8080 ,推送至远程服务器

[root@manger ~]# ansible webservers -m copy -a "src=./httpd.conf dest=/etc/httpd/conf/httpd.conf owner=root group=root mode=644"

范例2:将本地的 httpd.conf 文件 Listen 端口修改为 9090 ,推送至远程服务器,然后检查远端是否存在上一次的备份文件

[root@manger ~]# ansible webservers -m copy -a "src=./httpd.conf dest=/etc/httpd/conf/httpd.conf owner=root group=root mode=644 backup=yes"

范例3:往远程的主机文件中写入内容,如果文件不存在则创建

[root@manger ~]# ansible webservers -m copy -a "content="Http_Server" dest=/var/www/html/index.html"

6.6 file模块

功能:为被控端创建文件或目录,设定权限属性;

参数 选项 含义
path 指定远程服务器的路径
recurse 递归方式(可以是递归授权)
state touch、directory、link、absent 文件复制到远程的状态
owner root(Defaults) 文件复制到远程并设定属组
group root(Defaults) 备份被修改前的配置文件
mode file=644,directory=755 文件复制到远程并设定权限

范例1:创建文件,并设定属主、属组、权限

[root@manger ~]# ansible webservers -m file -a "path=/tmp/foo.conf state=touch mode=666"

范例2:创建目录,并设定属主、属组、权限

[root@manger ~]# ansible webservers -m file -a "path=/tmp/foo state=directory mode=777"

范例3:递归授权目录

[root@manger ~]# ansible webservers -m file -a "path=/tmp/foo state=directory owner=root group=root mode=777 recurse=yes"

6.7 lineinfile模块

功能:修改或删除文件内容,与系统中的 sed 命令类似;

参数 选项 含义
path 指定要操作的文件
regexp 使用正则表达式匹配对应的行
line 修改为新的内容
insertafter 将文本插入到“指定的行”之后
insertbefore 将文本插入到“指定的行”之前
state absent、present(Defaults) 删除对应的文本时,需要state=absent
backrefs yes、no 1.支持后向引用 2.当未匹配到内容则不操作文件
backup 是否在修改文件之前对文件进行备份
create 当要操作的文件并不存在时,是否创建对应的文件

范例1:将 SELINUX 修改为 disabled 状态;

[root@manger ~]# ansible localhost -m lineinfile -a \'path=/etc/selinux/config regexp=\'^SELINUX=\' line=SELINUX=disabled\'

范例2:删除 /etc/sudoers 文件中 %wheel 开头的行;

[root@manger ~]# ansible localhost -m lineinfile -a \'path=/etc/sudoers regexp=\'^%wheel\' state=absent\'

范例3:替换 /etc/hosts 文件中以 12.0.0.1 的行为 127.0.0.1 ansible.oldxu.com

[root@manger ~]# ansible localhost -m lineinfile -a \'path=/etc/hosts regex=\'^127\\.0\\.0\\.1\' line="127.0.0.1 ansible.oldxu.com"\'

范例4:修改默认 Apache 的端口为 8080 ,使用 insertafter

[root@manger ~]# ansible localhost -m lineinfile -a \'path=/etc/httpd/conf/httpd.conf regexp=\'^Listen\' line="Listen 8080" insertafter=\'^#Listen\'\'

6.8 get_url模块

功能:通过互联网下载软件至被控端本地;

参数 选项 含义
url HTTP, HTTPS ... 资源文件在互联网上的具体位置
dest 文件下载位置的绝对路径
mode 文件下载后的权限
checksum md5、sha256 对下载的资源进行校验
timeout 10(Default) URL请求超时时间

范例1:下载互联网的软件至本地

[root@manger ~]# ansible webservers -m get_url -a "url=https://mirrors.aliyun.com/xx.rpm dest=/tmp"

范例2:下载互联网文件并进行 md5 校验

[root@manger ~]# ansible webservers -m get_url -a "url=http,https dest=/opt checksum=md5:76eb3af80ffd"

6.9 systemd模块

功能:管理服务启动与停止,与 service 模块用法一致;

参数 选项 含义
name httpd、nginx ... 定义要启动服务的名称
state started、stopped、restarted、reloaded 指定服务状态
enabled yes、no 允许服务开机自启或禁止服务开机自启

范例1:启动 Httpd 服务

[root@manger ~]# ansible webservers -m service -a "name=httpd state=started"

范例2:重载 Httpd 服务

[root@manger ~]# ansible webservers -m service -a "name=httpd state=reloaded"

范例3:重启 Httpd 服务

[root@manger ~]# ansible webservers -m service -a "name=httpd state=restarted"

范例4:停止 Httpd 服务

[root@manger ~]# ansible webservers -m service -a "name=httpd state=stopped"

范例5:启动 Httpd 服务,并加入开机自启

[root@manger ~]# ansible webservers -m service -a "name=httpd state=started enabled=yes"

6.10 group模块

功能:管理被控端用户组;

参数 选项 含义
name 指定创建的组名
gid 为组设置可选gid
state present(Default)、absent 是否将组创建在远程主机上
system yes、no(Default) 是否创建系统组

范例1:创建 news 基本组,指定uid为9999

[root@manger ~]# ansible webservers -m group -a "name=news gid=9999 state=present"

范例2:创建 http 系统组,指定uid为8888

[root@manger ~]# ansible webservers -m group -a "name=http gid=8888 system=true state=present"

范例3:删除 news 基本组

[root@manger ~]# ansible webservers -m group -a "name=news state=absent"

6.11 user模块

功能:管理被控端用户;

参数 选项 含义
name 创建或删除的用户名
uid 为用户设置可选uid
group 为用户设置主要的组
groups 为用户设置附加的组
shell present(Default)、absent 为用户设置登陆时的Shell
create_home yes(Default)、no 为用户创建主目录
state present(Default)、absent 用户是否应该存在
remove yes、no(Default) 删除与用户关联的目录,只有当state=absent时生效
generate_ssh_key yes、no(Default) 为相关用户生成ssh密钥。不会覆盖现有的ssh密钥
ssh_key_bits 2048 创建用户ssh密钥中位数
ssh_key_file .ssh/id_rsa(Default) 可以实现ssh密钥改名,或变更存放ssh密钥位置

范例1:创建 joh 用户, uid1040 ,主要的组是 adm

[root@manger ~]# ansible webservers -m user -a "name=joh uid=1040 group=adm"

范例2:创建 joh 用户,登录 shell/sbin/nologin ,追加bin、sys 两个组

[root@manger ~]# ansible webservers -m user -a "name=joh shell=/sbin/nologin groups=bin,sys"

范例3:创建 jsm 用户,为其添加 123 作为登录密码,并且创建家目录

[root@manger ~]# ansible localhost -m debug -a "msg= \'123\' | password_hash(\'sha512\', \'salt\') "
$6$salt$jkH
[root@manger ~]# ansible webservers -m user -a \'name=jsm password=\'$6$salt$jkH\' create_home=yes\'

范例4:示例四、移除 joh 用户

[root@manger ~]# ansible webservers -m user -a "name=joh remove=yes state=absent"

范例5:创建 http 用户,并为该用户创建 2048 字节的私钥,存放在 ~/http/.ssh/id_rsa

[root@manger ~]# ansible webservers -m user -a "name=http uid=8888 group=8888 generate_ssh_key=yes ssh_key_bits=2048 ssh_key_file=.ssh/id_rsa"

6.12 cron模块

功能:管理被控端计划任务;

参数 选项 含义
name 定时任务基本描述
job 定时任务要执行的命令
minute (Default)、0-59
hour (Default)、0-23
day (Default)、1-31
month (Default)、1-12
weekday (Default)、0-6

范例1:添加定时任务,每分钟执行一次ls,* * * * * ls >/dev/null

[root@manger ~]# ansible webservers -m cron -a "name=\'cron01\' job=\'ls >/dev/null\'"

范例2:添加定时任务,每天的凌晨2点和凌晨5点执行一次ls, 0 5,2 * * * ls >/dev/null

[root@manger ~]# ansible webserver -m cron -a "name=\'cron02\' minute=0 hour=2,5 job=\'ls >/dev/null\'"

范例3:关闭定时任务,使定时任务失效

[root@manger ~]# ansible webservers -m cron -a "name=\'cron02\' minute=0 hour=2,5 job=\'ls >/dev/null\' disabled=yes"

6.13 mount模块

功能:管理被控端设备挂载;

参数 选项 含义
src 本地或远程设备的路径
path 设备挂载至本地的路径
fstype xfs、nfs... 文件系统类型
opts defaults、ro... 挂载的参数
state present、absent、mounted、unmounted 挂载的状态

环境准备:将 ansible 作为 nfs 服务端, 172.16.1.7、172.16.1.8 作为 nfs 客户端挂载;

# ansible localhost -m yum -a \'name=nfs-utils state=present\'
# ansible localhost -m file -a \'path=/ops state=directory\'
# ansible localhost -m copy -a \'content="/ops 172.16.1.0/24(rw,sync)" dest=/etc/exports\'
# ansible localhost -m service -a "name=nfs state=restarted"

范例1:挂载 nfs 至本地的 /opt 目录,并实现开机自动挂载

[root@manger ~]# ansible webservers -m mount -a "src=172.16.1.61:/ops path=/opt fstype=nfs opts=defaults state=mounted"

范例2:临时卸载 nfs 的挂载,但不清理 /etc/fstab

[root@manger ~]# ansible webservers -m mount -a "src=172.16.1.61:/ops path=/opt fstype=nfs opts=defaults state=unmounted"

范例3:永久卸载 nfs 挂载,同时清理 /etc/fstab

[root@manger ~]# ansible webservers -m mount -a "src=172.16.1.61:/ops path=/opt fstype=nfs opts=defaults state=absent"

6.14 hostname模块

功能:管理被控端主机名称;

范例:设置主机名称为 ansible-hostname

[root@manger ~]# ansible localhost -m hostname -a \'name=ansible-hostname\'

6.15 archive模块

功能:打包与压缩;

参数 选项 含义
path 要压缩的文件或目录
dest 压缩后的文件
format bz2、gz、tar、xz、zip 指定打包压缩的类型

范例:将 /var/log 目录压缩为 tar 格式,并存储至 /opt 目录下;

[root@manger ~]# ansible localhost -m archive -a \'path=/var/log dest=/opt/log.tar.gz format=gz\'

6.16 unarchive模块

功能:解包与解压缩;

参数 选项 含义
src 要解压的软件包路径
dest 解压到目标位置
remote_src yes、no(default) yes:要解压的包在被控端、no:要解压的包在控制端

范例1:解压控制端的包至被控端;

[root@manger ~]# ansible localhost -m unarchive -a \'src=/root/php.zip dest=/tmp/\'

范例2:解压被制端的包至被控端;

[root@manger ~]# ansible localhost -m unarchive -a \'src=/log.tar.gz dest=/tmp/ remote_src=yes\'

6.17 selinux模块

功能:管理 SELINUX 防火墙;

参数 选项 含义
state enforcing、permissive、disabled Selinux模式

范例1:设置 selinuxenforcing

[root@manger ~]# ansible webservers -m selinux -a "state=enforcing"

范例2:设置 selinuxdisabled

[root@manger ~]# ansible webservers -m selinux -a "state=disabled"

6.18 firewalld模块

功能:管理 firewalld 防火墙;

参数 选项 含义
service http、https ... 添加或删除firewalld中的服务名称
port 80、443... 添加或删除firewalld中的端口范围
masquerade yes、no 启用或禁止防火墙的地址伪装
immediate yes、no(Default) 防火墙规则当前是否立即生效
permanent yes、no 防火墙规则当前是否重启后也生效
state enabled、disabled 启用或禁用当前配置的规则
rich_rule 在防火墙中添加或删除富规则
source 添加或删除防火墙源IP网络
zone public(Default)、home ... 指定防火墙区域

范例1:放行 http 服务流量,设定临时与永久生效;

[root@manger ~]# ansible webservers -m firewalld -a "service=http immediate=yes permanent=yes state=enabled"

范例2:放行 tcp/8080-8090 端口,设定临时与永久生效;

[root@manger ~]# ansible webservers -m firewalld -a "port=8080-8090/tcp immediate=yes permanent=yes state=enabled"

6.19 iptables模块

功能:管理 iptables 代理过滤防火墙;

iptables常用参数:

参数 含义
table
chain
source 来源IP
destination 目标IP
destination_port 目标端口
protocol 协议
jump:DROP 动作
action 如何添加规则
insert 插入
append 追加

范例1:来源IP是192.168.1.1 目标地址 1.1.1.1 目标端口 80 协议 tcp 则拒绝;规则要写入第一行;

[root@manger ~]# ansible webservers -m iptables -a \'table=filter chain=INPUT source=192.168.1.1/32 destination=1.1.1.1 destination_port=80 protocol=tcp jump=DROP action=insert\'

范例2:NAT:DNAT和SNAT:

DNAT:
	如果请求1.1.1:80端口,则DNAT到2.2.2.2:8800
	ansible webservers -m iptables -a \'table=nat chain=PREROUTING protocol=tcp destination=1.1.1.1 destination_port=80 jump=DNAT to_destination="2.2.2.2:8800"\'

	如果请求1.1.1:81端口,则DNAT到3.3.3.3:8800
	ansible webservers -m iptables -a \'table=nat chain=PREROUTING protocol=tcp destination=1.1.1.1 destination_port=81 jump=DNAT to_destination="3.3.3.3:8800"\'

SNAT:
	POSTROUTING
	iptables -t nat -I POSTROUTING -s 172.16.1.0/24 -j SNAT --to-source 5.5.5.5

	ansible webservers -m iptables -a \'table=nat chain=POSTROUTING source=172.16.2.0/24 jump=SNAT to_source=6.6.6.6\'
	ansible webservers -m iptables -a \'table=nat chain=POSTROUTING source=172.16.3.0/24 jump=SNAT to_source=7.7.7.7 action=insert\'

参数很多,具体参见官方文档

https://docs.ansible.com/ansible/2.9/modules/iptables_module.html#iptables-module

Ansible的基础使用和快速入门

Ansible其实一个it运维自动化工具,主要是完成it基础设施的配置应用的部署,可以对百十台的主机,上千台的主机进行管理,它一直强调的是:
简单易用,所以我们就能很快的上手它,所以不需要好的基础能力

简单-----减少学习的成本:它使用易读的描述语言部署的文件。
无需特殊编码技能:也就是它不需求你会开发,你就能很快的上手使用。
任务按顺序执行:ansible执行就是按你的任务从上到下依次去执行,所以很好去理解,很好的去写这个配置文件。

强大-----协调应用程序生命周期,因为一个应用程序的生命周期分为多个阶段,例如从代码的拉取到构建,然后再到部署,然后再到测试,一个应用的周期大概是这样的,ansible可以在这个应用周期中完成一系列任务
应用部署
配置管理
工作流程编排
我们可以通过刚才的那几个阶段去写配置文件,这样就能很清晰的看出这个应用程序到底要做哪些事,根据我们做那些事,我们再逐一的去分解
这也就是ansible的主要的功能

无代理----可预测,可靠和安全

无代理架构,也就是在一台服务器上安装ansible就可以了,而不需要在客户端再安装一个agent,
使用openssh通信,确保了安全性,
没有代理维护成本

Ansible相对比同类的saltstack他们都是使用python去编写的,在早些年saltstack市场占有率是远超ansible,而近几年市场占有率是远超saltstack的,其实主要的原因呢,就是跟它这个设计模式有关系,因为ansible最初呢讲究的就是无代理架构,而saltstack要在被管理端,要装一个agent,装一个很简单,要考虑后期的维护,所以根据现在的市场需求,很多情况下,在某些机器上安装一些复杂的agent和其他的一些工具,对于现在的企业it环境中,每个服务器上面都安装了很多的agent,有可能自己研发了被监控端的agent,日志的agent,回头再安装一些其他的agent,要初始化要舒适化四五个agent,久而久之就会增加很多额外的负载,而且不易于我们后期对服务器的管理,所以根据这个现状呢,ansible就用的it企业很多,而且ansible在它本身的这个配置下就是这么设计的,而且根据这种形态去扩展更多模块和功能,而saltstack,虽然已经支持了这种无代理架构,但是它是后来支持的,有很多功能的还是难于ansible去使用的。

Ansible的架构
技术图片![]

Users就是我们这个管理员用户,也就是我们,我们去批量管理主机,有两种方式,一个是执行命令,例如查看磁盘空间
第二种方式呢,就是playbook去管理比较复杂的任务,例如一个应用的部署

这个ansible引擎有4部分,第一个就是inventory,这个就是管理我们主机的一个清单,你去管理谁,就是在这体现的,包括主机的ip地址,端口,账户密码都是在这个inventory去输写的
第二个就是ansible的Api,它有api来供我们去调用,当我们去开发运维自动化平台的时候,不用去造轮子,就可以直接使用ansible的api去使用来完成你的批量管理。

第三个就是模块modules,ansible是一个自动化引擎,它很多的功能呢都是通过模块去实现的,例如去创建一个用户,那么它就有这个user这个账户,那么去管理一个服务,去启动一个服务那么久有这个service,强调之初呢就是它有非常多的模块。

第四个就是plugins,这个就是插件,这个相当于ansible来完成内部的一些操作,例如ansible怎么去管理这些主机,那么它就有这个contation的一个插件,通过这个插件呢去连接你这个主机,所以这个plugins是ansible的核心功能,而模块是ansible核心之外的扩展功能。

而ploybook可以通过这些模块去编写应用的生命周期,它就相当于一个文本,我们要在里面输写我们要做哪些事
如果要实现一个CMDB的一个功能,配置中心管理数据库,这个功能呢就记录了你的it基础设施中,一些主机的一些信息,通过这些信息呢,以供其他人去使用,供其他的项目去调用,有了ansible的话就能很快去获取这些信息,因为ansible可以在你的目标主机上去获取当前主机所有的一些硬件资源了,一些配置,各个信息都会帮你收集,只需要将你的数据收集到你的CMDB当中就可以了
而且ansible也有很多的模块和插件来对接这个云平台,不管是私有云还是公有云都会帮我们去做一些事,,这个就是一个ansible的一个架构

管理员通过操作ansible,ansible去调用一些模块和插件来读取,inventory的配置主机清单,去操作你操作的主机组。

Ansible的安装
我们可以直接通过yum去安装
[root@ansible ~]# yum -y install ansible
安装之后就是配置ansible,这里就是配置ansible的主机清单,这里可以使用把密码写上去,也可以提前做好免交互登录,就直接写ip也可以

[root@ansible ~]# vim /etc/ansible/hosts
[webservers]
10.4.7.12 ansible_ssh_user=root ansible_ssh_pass=666666
10.4.7.21 ansible_ssh_user=root ansible_ssh_pass=666666

对我们执行的命令添加不需要指纹的交互

[root@ansible ~]# vim /etc/ansible/ansible.cfg
host_key_checking = False

查看我们多主机节点的磁盘状态

[root@ansible ~]# ansible webservers -a "df -h"
10.4.7.12 | SUCCESS | rc=0 >>
Filesystem               Size  Used Avail Use% Mounted on
/dev/mapper/centos-root   50G  1.4G   49G   3% /
devtmpfs                 858M     0  858M   0% /dev
tmpfs                    870M     0  870M   0% /dev/shm
tmpfs                    870M  8.4M  861M   1% /run
tmpfs                    870M     0  870M   0% /sys/fs/cgroup
/dev/sda2               1014M  179M  836M  18% /boot
/dev/sda1                200M   12M  189M   6% /boot/efi
/dev/mapper/centos-home   73G   33M   72G   1% /data
tmpfs                    174M     0  174M   0% /run/user/0

10.4.7.21 | SUCCESS | rc=0 >>
Filesystem               Size  Used Avail Use% Mounted on
/dev/mapper/centos-root   50G  1.4G   49G   3% /
devtmpfs                 3.8G     0  3.8G   0% /dev
tmpfs                    3.9G     0  3.9G   0% /dev/shm
tmpfs                    3.9G  8.4M  3.8G   1% /run
tmpfs                    3.9G     0  3.9G   0% /sys/fs/cgroup
/dev/sda2               1014M  179M  836M  18% /boot
/dev/sda1                200M   12M  189M   6% /boot/efi
/dev/mapper/centos-home   73G   33M   72G   1% /data
tmpfs                    779M     0  779M   0% /run/user/0

Ansible的使用要求
服务端的要求
Python2.6/2.7/3.x
Redhat,Debian,centos,os x等,不支持windows
因为ansible是python写的所以要有python的环境,ansible是在15年的10月份被redhat收购的,默认centos已经将python安装了
被管理端要求
Openssh,linux发行版一般也使用openssh,也需要python,会使用python的脚本,执行我们使用的模块,最终封装我们使用的脚本,在被管理端执行,结果返回给ansible
Python2.6/2.7/3.x

安装ansible的方式支持yum,也是推荐的方式,像redhat核debian都支持他们本身的软件包去安装ansible
也可以通过pip去安装,其实ansible也是python的一个模块
也可以通过源码包去安装
? https://releases.ansible.com/ansible or https://github.com/ansible/ansible.git

ansible的配置文件

[root@ansible ~]# vim /etc/ansible/ansible.cfg
some basic default values...

#inventory      = /etc/ansible/hosts
#library        = /usr/share/my_modules/
#module_utils   = /usr/share/my_module_utils/
#remote_tmp     = ~/.ansible/tmp
#local_tmp      = ~/.ansible/tmp
#forks          = 5
#poll_interval  = 15
#sudo_user      = root
#ask_sudo_pass = True
#ask_pass      = True
#transport      = smart
#remote_port    = 22
#module_lang    = C
#module_set_locale = False

有这几个重要的简单说一下,inventory -/etc/ansible/hosts
这是被管理端的主机清单
Fork是ansible工作进程的并发数,它默认是5个,可以根据自己管理主机的数量调整这个,同时提高这个并发数也会对你的服务器的负载增加消耗

Sudo_user:就是提权,在linux下如果你是普通用户,如果想root方式去执行操作时,那你是不是需要sudo,或者su -切到root用户操作,那这就称为提权。

Remote_port=22,操作目标主机的端口,ssh 默认22,这里也默认22

Host_key_checking=false 这个开启的话就会实现我们第一次登录一个主机时,可以免去敲yes/no,但是开启这个也有不好的,就是当我们的服务端重装系统了,那么这个地方就会失效报错,当然也可以解决,把know_hosts下的历史登录记录清除就可以,不过这个也不影响使用。
Log_path=/var/log/ansible.log 就是记录日志的,记录一些基本操作,可以开启一下
Private_key_file=/root/.ssh/id_rsa,这是指定密钥认证的私钥,连接linux的认证方式就是基于密码的认证,一个是基于密钥对的认证,基于密钥对的认证是相对于比较安全的,进行数字证书的效验,基于ssh的容易被破解,但是满足密码的复杂性也很难破解。

inventory主机清单
[root@ansible ~]# vim /etc/ansible/hosts
像ansible在操作我们基础设施主机的时候,都是通过这个/etc/ansible/hosts去操作的
这个配置中有属于这种未分组的组,它会分配到auto的组中,也就是默认组,我们可以根据IP,或者主机名进行配置,

Ex 1: Ungrouped hosts, specify before any group headers.

green.example.com
blue.example.com
192.168.100.1
192.168.100.10

Ansible的执行命令的使用方法
[root@ansible ~]# ansible --help
Usage: ansible <host-pattern> [options]
主机的模式->选项,就是在你的主机清单中匹配
这个all就是匹配你所有的主机组,不加主机组也会匹配上
-m command可以省略,这是默认的

[root@ansible ~]# ansible all  -a "free -m"
10.4.7.12 | SUCCESS | rc=0 >>
              total        used        free      shared  buff/cache   available
Mem:           1738         121        1475           8         141        1456
Swap:          3839           0        3839

10.4.7.21 | SUCCESS | rc=0 >>
              total        used        free      shared  buff/cache   available
Mem:           7785         162        7479           8         143        7403
Swap:          3839           0        3839

10.4.7.22 | SUCCESS | rc=0 >>
              total        used        free      shared  buff/cache   available
Mem:           7785         159        7482           8         144        7406
Swap:             0           0           0

也可以使用直接输入ip同样也可以查看到

[root@ansible ~]# ansible 10.4.7.12 -a "df -h"
10.4.7.12 | SUCCESS | rc=0 >>
Filesystem               Size  Used Avail Use% Mounted on
/dev/mapper/centos-root   50G  1.4G   49G   3% /
devtmpfs                 858M     0  858M   0% /dev
tmpfs                    870M     0  870M   0% /dev/shm
tmpfs                    870M  8.4M  861M   1% /run
tmpfs                    870M     0  870M   0% /sys/fs/cgroup
/dev/sda2               1014M  179M  836M  18% /boot
/dev/sda1                200M   12M  189M   6% /boot/efi
/dev/mapper/centos-home   73G   33M   72G   1% /data
tmpfs                    174M     0  174M   0% /run/user/0

然后就是变量,能与用户动态的交互,传参,来让ansible来做指定的事情,这样就能更灵活一些。

Ansible的官方文档是docs.ansible.com
一般经常用的ansible和ploybook,doc
其他的模块也很多,暂时也用不上
比如变量的使用

[webservers]
10.4.7.21 ansible_ssh_user=root ansible_ssh_pass=666666 http_port=80
10.4.7.22 ansible_ssh_user=root ansible_ssh_pass=666666 http_port=80
[root@ansible ~]# ansible webservers -a "echo {{http_port}}"
10.4.7.22 | SUCCESS | rc=0 >>
80

10.4.7.21 | SUCCESS | rc=0 >>
80

组变量的使用,定义这个vars,使用的时候就会调用这个变量

[webservers:vars]
http_port=8080
server_name=www.devops.com
[root@ansible ~]# ansible webservers -a "echo {{http_port}}"
10.4.7.21 | SUCCESS | rc=0 >>
8080

10.4.7.22 | SUCCESS | rc=0 >>
8080

[root@ansible ~]# ansible webservers -a "echo {{server_name}}"
10.4.7.22 | SUCCESS | rc=0 >>
www.devops.com

10.4.7.21 | SUCCESS | rc=0 >>
www.devops.com

也可以单独写到/etc/ansible/group_vars/webservers.yml下,它默认会读取你哪个组里面的变量,以yml的模式更方便
http_port: 8090
server_name: xiabanle


[root@ansible group_vars]# ansible webservers -a "echo {{http_port}}"
10.4.7.22 | SUCCESS | rc=0 >>
8090

10.4.7.21 | SUCCESS | rc=0 >>
8090

[root@ansible group_vars]# ansible webservers -a "echo {{server_name}}"
10.4.7.22 | SUCCESS | rc=0 >>
xiabanle

10.4.7.21 | SUCCESS | rc=0 >>
xiabanle

ad-hoc命令

  1. 命令工具常用选项
  2. Ssh密码认证
  3. Ssh 密钥对认证
    前面所使用的就是我们使用的ad-hoc命令的方式执行一个命令来使用我们的ansible
    这种的特点就是能够快速的执行某个操作,ad-hoc就是我们经常用的批量管理,而ploybook就是我们一个应用的编排

使用shell模块在主机组批量创建文件

[root@ansible ~]# ansible webservers -m shell -a "mkdir /opt/devops"
 [WARNING]: Consider using file module with state=directory rather than running mkdir

10.4.7.21 | SUCCESS | rc=0 >>
10.4.7.22 | SUCCESS | rc=0 >>

[root@ansible ~]# ansible webservers -m shell -a "ls /opt/"
10.4.7.22 | SUCCESS | rc=0 >>
devops
test
10.4.7.21 | SUCCESS | rc=0 >>
devops
test

查看本次的操作设计到了哪些主机

[root@ansible ~]# ansible webservers --list-hosts
  hosts (2):
    10.4.7.21
10.4.7.22

查看输出的命令遇到的详细信息
[root@ansible ~]# ansible webservers -vvv -a "ls /opt/devops"

Ssh密钥对的认证
先创建一对密钥对
[root@ansible ~]# ssh-keygen
这个rsa.pub是公钥,这个放在目标主机上,这个id_rsa是使用这个私钥进行登录认证的

[root@ansible .ssh]# ls
id_rsa  id_rsa.pub  known_hosts

怎么放过去,有两种方式,第一种查看公钥的内容,将它复制到目标主机认证key中
还有一种方式就是通过ssh-copy-id,这样的话,就能直接传到目标主机的authorized_keys中
[root@ansible .ssh]# ssh-copy-id root@10.4.7.21
这个就是保存你ansible主机上的公钥

[root@aaa ~]# cat .ssh/authorized_keys 
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDRgvupMdkSCz2tP1WOig7h636iqHdFMWVdMoYnmgpe8EUp/Xmuwf66dVv/RrDvs6jyPtlnlQtBVtEYJCwsuumgLXcSp+XwyICLe5cetYGYRa3ByhIiJPxrfkLCnLGHAHKl0dBnxN2286Rsg1D1NgRLFGVS+MF1Hj6CPgHhLc+eTusDv4tZXCFGdJoyT99jJCAwpc1N/pbJhoS/t4g+fxZ7nCrRkLS49i8Mo7KuLjtfwlB4yDbh1bzdG60rzF71k8asJlBj3GcSmtEhqmw7xyv2qcqCq/CvpscUhJ4ZIrz4xs6Jq2IKBhgQiptCnDis15b6Cj6R3mY3XLf4sruX/hyh root@ansible

这样就能实现免交互登录了
这样的话,hosts文件只需要将IP或者域名写上就可以了

Ansible的常用模块
执行shell命令(command和shell)
文件传输(copy和file)可以对文件拷贝和创建目录
管理软件包(yum)
用户和组(user)
从源代码管理系统部署(git)从git仓库拉取源代码
管理服务(service)
收集目标主机信息(setup)

Copy模块将文件拷贝过去

[root@ansible ~]# ansible webservers -m copy -a "src=/root/Dockerfile dest=/tmp"
查看目标已有
[root@ansible ~]# ansible webservers -a "ls /tmp"

File模块在管理端去创建文件
创建目录state=directory
创建文件state=touch
删除目录/文件state=absent
[root@ansible ~]# ansible webservers -m file -a "dest=/tmp/xiaoming state=file"

Yum模块在被管理端安装yum的包
Yum命令state=present
卸载命令 State=absent
[root@ansible ~]# ansible webservers -m yum -a "name=vim state=present"

User模块,创建用户
[root@ansible ~]# ansible webservers -m user -a "name=foo password=66666"
删除用户 :state=absent

Service模块我们启动一个服务停止一个服务,
测试一个memcache来测试服务的启动和停止
启动state=started
停止state=stopped
开机启动enabled=true
重启state=restarted

启动

[root@ansible ~]# ansible webservers -m yum -a "name=memcached state=present"
[root@ansible ~]# ansible webservers -m service -a "name=memcached "
[root@ansible ~]# ansible webservers -m shell -a "ps -ef |grep memcached"

停止
[root@ansible ~]# ansible webservers -m service -a "name=memcached state=stopped"
给memcached加入开机启动
[root@ansible ~]# ansible webservers -m service -a "name=memcached enabled=true"
重启就是restarted

Set up模块是收集系统信息的
这个也会写一些变量,当我们使用ploybook时当前的主机变量
[root@ansible ~]# ansible webservers -m setup
可以过滤其中的一些信息来过滤一些我们想要的系统信息,比如获得主机名

[root@ansible ~]# ansible webservers -m setup -a "filter=ansible_hostname"
10.4.7.21 | SUCCESS => {
    "ansible_facts": {
        "ansible_hostname": "k8s-node1"
    }, 
    "changed": false
}
10.4.7.12 | SUCCESS => {
    "ansible_facts": {
        "ansible_hostname": "k8s-master"
    }, 
    "changed": false
}
10.4.7.22 | SUCCESS => {
    "ansible_facts": {
        "ansible_hostname": "k8s-node2"
    }, 
    "changed": false
}

查看内存使用情况
[root@ansible ~]# ansible webservers -m setup -a "filter=ansible_*_mb"

以上是关于Ansible快速入门(下)的主要内容,如果未能解决你的问题,请参考以下文章

ansible快速入门

ansible 快速入门

Ansible快速入门

ansible快速入门系列

linux之Ansible快速入门

Ansible 快速入门