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 用户, uid 是 1040 ,主要的组是 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:设置 selinux 为 enforcing
[root@manger ~]# ansible webservers -m selinux -a "state=enforcing"
范例2:设置 selinux 为 disabled
[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命令
- 命令工具常用选项
- Ssh密码认证
- 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快速入门(下)的主要内容,如果未能解决你的问题,请参考以下文章