Ansible安装和简单的使用
主要内容:
一、ansible概述和运行机制
二、实战-安装并配置Ansible管理两个节点
三、ansible常见模块高级使用方法
四、实战-使用Playbook批量部署多台LAMP环境
一、ansible概述和运行机制
ansible概述
Ansible是一款为类Unix系统开发的自由开源的配置和自动化工具。它用Python写成,类似于saltstack和Puppet,但是有一个不同和优点是我们不需要在节点中安装任何客户端。它使用SSH来和节点进行通信。Ansible基于 Python paramiko 开发,分布式,无需客户端,轻量级,配置语法使用 YMAL 及 Jinja2模板语言,更强的远程命令执行操作
官方网站:https://www.ansible.com/
ansiblle具有如下特点:
1、部署简单,只需在主控端部署Ansible环境,被控端无需做任何操作;
2、默认使用SSH协议对设备进行管理;
3、主从集中化管理;
4、配置简单、功能强大、扩展性强;
5、支持API及自定义模块,可通过Python轻松扩展;
6、通过Playbooks来定制强大的配置、状态管理
7、对云计算平台、大数据都有很好的支持;
Ansible 工作机制
Ansible 在管理节点将 Ansible 模块通过 SSH 协议推送到被管理端执行,执行完之后自动删除,可以使用 SVN 等来管理自定义模块及编排。
由上面的图可以看到 Ansible 的组成由 5 个部分组成:
Ansible : ansible核心
Modules : 包括 Ansible 自带的核心模块及自定义模块
Plugins : 完成模块功能的补充,包括连接插件、邮件插件等
Playbooks : 剧本;定义 Ansible 多任务配置文件,由Ansible
自动执行 Inventory : 定义 Ansible 管理主机的清单 [ˈɪnvəntri] 清单
二、安装并配置Ansible管理两个节点
实验环境:
Ansible server 192.168.2.88
Simple service 192.168.2.88
Simple service 192.168.2.69
在server 192.168.2.88安装ansible
1、 设置EPEL仓库
Ansible仓库默认不在yum仓库中,因此我们需要使用下面的命令启用epel仓库。
yum -y install epel-release.noarch
yum install ansible
ansible --version
ansible命令参数
我们首先写一个ansible的命令,查看ansible的文档
ansible-doc -s service
anisble命令语法: ansible [-i 主机文件] [-f 批次] [组名] [-m 模块名称] [-a 模块参数] ansible object method argument 环境变量 对象 方法 调用方法需要的参数 -v,-verbose # 详细模式,如果命令执行成功,输出详细的结果 (-vv –vvv -vvvv) -i PATH, -inventory=PATH # 指定 host 文件的路径,默认是在 /etc/ansible/hosts inventory [ˈɪnvəntri] 库存 -f NUM,-forks=NUM # NUM 是指定一个整数,默认是 5 ,指定 fork 开启同步进程的个数。 -m NAME,-module-name=NAME # 指定使用的 module 名称,默认使用 command模块 -a,MODULE_ARGS #指定 module 模块的参数 -k,-ask-pass #提示输入 ssh 的密码,而不是使用基于 ssh 的密钥认证 -sudo # 指定使用 sudo 获得 root 权限 -K,-ask-sudo-pass #提示输入 sudo 密码,与 -sudo 一起使用 -u USERNAME,-user=USERNAME # 指定移动端的执行用户 -C,-check #测试此命令执行会改变什么内容,不会真正的去执行 ansible-doc详细参数: ansible-doc -l #列出所有的模块列表 ansible-doc -s 模块名 #查看指定模块的参数 -s, snippet [ˈsnɪpɪt] 片断
定义主机清单
1、基于端口,用户,密码定义主机清单
ansible基于ssh连接-i (inventory)参数后指定的远程主机时,也可以写端口,用户,密码。
格式:ansible_ssh_port:指定ssh端口 ansible_ssh_user:指定 ssh 用户 ansible_ssh_pass:指定 ssh 用户登录是认证密码(明文密码不安全) ansible_sudo_pass:指明 sudo 时候的密码
例:
配置内容
192.168.2.88 ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_pass=123
然后执行命令
ansible -i /etc/ansible/hosts webservers -m ping
这个错误还是来源于ssh首次登陆陌生的主机,会校验know_hosts
解决方法
1、 ssh一次就可以了
2、 关闭询问
解决之后,效果如此
2、基于ssh密钥来访问定义主机清单
一般来说,使用明文密码不安全,所以增加主机无密码访问。
在Ansible服务端生成密钥,并且复制公钥到节点中。
生成秘钥
ssh-keygen
复制到客户机
ssh-copy-id
ssh-copy-id [email protected]
ssh-copy-id [email protected]
然后修改hosts配置
注意:两个#注释,只是为了和上面一致
进行测试
ansible 'web-servers' -m ping
例2:检查Ansible节点的运行时间(uptime)
[root@saltMaster ~]# uptime 21:48:39 up 2:20, 5 users, load average: 0.15, 0.09, 0.07 [root@saltMaster ~]# ansible -m command -a "uptime" "webservers" 192.168.2.88 | CHANGED | rc=0 >> 21:49:09 up 2:21, 6 users, load average: 0.57, 0.19, 0.10 192.168.2.69 | CHANGED | rc=0 >> 08:49:09 up 2:01, 4 users, load average: 0.00, 0.01, 0.05 [root@saltMaster ~]#
例3:检查节点的内核版本
例4:将df命令在所有节点执行后,重定向输出到本机的/tmp/command-output.txt文件中
[root@saltMaster ~]# ansible -m command -a "df -Th" "webservers" > /tmp/command-output.txt [root@saltMaster ~]# cat /tmp/command-output.txt 192.168.2.88 | CHANGED | rc=0 >> Filesystem Type Size Used Avail Use% Mounted on /dev/mapper/centos-root xfs 17G 5.5G 12G 33% / devtmpfs devtmpfs 897M 0 897M 0% /dev tmpfs tmpfs 912M 124K 912M 1% /dev/shm tmpfs tmpfs 912M 18M 895M 2% /run tmpfs tmpfs 912M 0 912M 0% /sys/fs/cgroup /dev/sda1 xfs 1014M 179M 836M 18% /boot tmpfs tmpfs 183M 32K 183M 1% /run/user/0 /dev/sr0 iso9660 4.3G 4.3G 0 100% /run/media/root/CentOS 7 x86_64 192.168.2.69 | CHANGED | rc=0 >> Filesystem Type Size Used Avail Use% Mounted on /dev/mapper/centos-root xfs 17G 4.6G 13G 27% / devtmpfs devtmpfs 471M 0 471M 0% /dev tmpfs tmpfs 488M 0 488M 0% /dev/shm tmpfs tmpfs 488M 15M 473M 4% /run tmpfs tmpfs 488M 0 488M 0% /sys/fs/cgroup /dev/sda1 xfs 1014M 201M 814M 20% /boot tmpfs tmpfs 98M 44K 98M 1% /run/user/0 /dev/sr0 iso9660 4.3G 4.3G 0 100% /run/media/root/CentOS 7 x86_64 [root@saltMaster ~]#
三、ansible常见模块高级使用方法
ansible常用模块
ansible 已经给开发者定义了好多可用的模块,我们除了拓展之外,大部分模块可以直接使用
1、3个远程命令模块的区别
(1)、command模块为ansible默认模块,不指定-m参数时,使用的就是command模块; comand模块比较简单,常见的命令都可以使用,但其命令的执行不是通过shell执行的,所以,像这些 "<", ">", "|", and "&"操作都不可以,当然,也就不支持管道; 缺点:不支持管道,没法批量执行命令;
(2)、shell模块:使用shell模块,在远程命令通过/bin/sh来执行;所以,我们在终端输入的各种命令方式,都可以使用。
例1:运行free -m 命令
[root@saltMaster ~]# ansible webservers -m shell -a "free -m" 192.168.2.88 | CHANGED | rc=0 >> total used free shared buff/cache available Mem: 1823 781 82 12 959 783 Swap: 2047 6 2041 192.168.2.69 | CHANGED | rc=0 >> total used free shared buff/cache available Mem: 974 686 60 6 227 63 Swap: 2047 383 1664
对shell模块的使用可以分成两块:
1) 如果待执行的语句少,可以直接写在一句话中,如上例。
2) 如果在远程待执行的语句比较多,可写成一个脚本,通过copy模块传到远端,然后再执行;但这样就又涉及到两次ansible调用;对于这种需求,ansible已经为我们考虑到了,script模块就是干这事的;
(3)、scripts模块
使用scripts模块可以在本地写一个脚本,在远程服务器上执行:
[root@saltMaster ~]# vim /etc/ansible/net.sh #!/bin/bash date hostname [root@saltMaster ~]# ansible webservers -m script -a "/etc/ansible/net.sh" 192.168.2.88 | CHANGED => { "changed": true, "rc": 0, "stderr": "Shared connection to 192.168.2.88 closed.\r\n", "stderr_lines": [ "Shared connection to 192.168.2.88 closed." ], "stdout": "Mon Dec 3 22:08:55 CST 2018\r\nsaltMaster\r\n", "stdout_lines": [ "Mon Dec 3 22:08:55 CST 2018", "saltMaster" ] } 192.168.2.69 | CHANGED => { "changed": true, "rc": 0, "stderr": "Shared connection to 192.168.2.69 closed.\r\n", "stderr_lines": [ "Shared connection to 192.168.2.69 closed." ], "stdout": "Mon Dec 3 09:09:06 EST 2018\r\nlocalhost.localdomain\r\n", "stdout_lines": [ "Mon Dec 3 09:09:06 EST 2018", "localhost.localdomain" ] }
2、copy模块:实现主控端向目标主机拷贝文件,类似scp功能
例1:把ansible主机上的/etc/hosts文件复制到主机组中机器的/tmp目录下
[root@saltMaster /]# ansible webservers -m copy -a "src=/etc/hosts dest=/tmp/ owner=root group=root mode=0755" 192.168.2.88 | CHANGED => { "changed": true, "checksum": "7335999eb54c15c67566186bdfc46f64e0d5a1aa", "dest": "/tmp/hosts", "gid": 0, "group": "root", "md5sum": "54fb6627dbaa37721048e4549db3224d", "mode": "0755", "owner": "root", "size": 158, "src": "/root/.ansible/tmp/ansible-tmp-1543846330.63-199478885009462/source", "state": "file", "uid": 0 } 192.168.2.69 | CHANGED => { "changed": true, "checksum": "7335999eb54c15c67566186bdfc46f64e0d5a1aa", "dest": "/tmp/hosts", "gid": 0, "group": "root", "md5sum": "54fb6627dbaa37721048e4549db3224d", "mode": "0755", "owner": "root", "secontext": "unconfined_u:object_r:admin_home_t:s0", "size": 158, "src": "/root/.ansible/tmp/ansible-tmp-1543846330.65-125711974784987/source", "state": "file", "uid": 0 } [root@saltMaster /]#
3、file模块设置文件属性。
例如:
[root@63 ~]# ansible -i /etc/ansible/hosts web-servers -m file -a "path=/tmp/hosts mode=0777"
验证:
[root@63 ~]# ll /tmp/hosts -rwxrwxrwx 1 root root 158 11月 14 22:39 /tmp/hosts
4、stat模块获取远程文件信息
[root@63 ~]# ansible -i /etc/ansible/hosts web-servers -m stat -a "path=/tmp/hosts"
5、get_url模块实现远程主机下载指定url到本地,支持sha256sum文件校验。
例如:下载epel-release-latest-7.noarch.rpm到主机清单中的/tmp/目录下
[root@63 ~]# ansible -i /etc/ansible/hosts web-servers -m get_url -a "url=https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm dest=/tmp/ mode=0440 force=yes"
注:url=https://xxx 的等号=前后不能有空格
扩展:查看force=yes的作用
[root@xuegod63 ~]# ansible-doc -s get_url #在弹出的信息中找到force
如果force=yes,当下载文件时,如果所下的内容和原目录下的文件内容不一样,则替换原文件,如果一样,就不下载了。
如果为“否”,则仅在目标不存在时才下载文件。 一般来说,只有小型本地文件才应该为“是”。 在0.6之前,该模块表现为默认为“是”。
查看下载的文件:
[root@63 ~]# ll /tmp/epel-release-latest-7.noarch.rpm -r--r----- 1 root root 15080 11月 14 22:43 /tmp/epel-release-latest-7.noarch.rpm
测试:下载文件时,当文件不一样时,会替换原来的文件
[root@64 ~]# cp /etc/passwd /tmp/epel-release-latest-7.noarch.rpm [root@63 ~]# ansible -i /etc/ansible/hosts web-servers -m get_url -a "url=https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm dest=/tmp/ mode=0440 force=yes" 192.168.1.63 | SUCCESS => { "changed": false, #63上原来的文件和当前的文件一样,就没有改变。执行成功,但没有发生改变,那么显示绿色 } 192.168.1.64 | SUCCESS => { "changed": true, #64上的文件名字一样,但是内容变,就会重新下载。执行成功,且发生改变,那么显示×××
6、yum模块linux平台软件包管理。
yum模块可以提供的status状态: latest ,present,installed #这3个代表安装;removed, absent #后面2个是卸载
例子:安装httpd软件
[root@xuegod63 ~]# ansible -i /etc/ansible/hosts web-servers -m yum -a "name=httpd state=latest"
7、cron模块远程主机crontab配置。
例如:增加每30分钟执行ls /tmp
# ansible -i /etc/ansible/hosts web-servers -m cron -a "name='list dir' minute='*/30' job='ls /tmp'" 在xuegod63上查看 # crontab -l #Ansible: list dir */30 * * * * ls /tmp
8、service模块远程主机系统服务管理。
service模块常用参数:
(1)、name参数:此参数用于指定需要操作的服务名称,比如 nginx,httpd。
(2)、state参数:此参数用于指定服务的状态,比如,我们想要启动远程主机中的httpd,则可以将 state 的值设置为 started;如果想要停止远程主机中的服务,则可以将 state 的值设置为 stopped。此参数的可用值有 started、stopped、restarted(重启)、reloaded。
enabled参数:此参数用于指定是否将服务设置为开机 启动项,设置为 yes 表示将对应服务设置为开机启动,设置为 no 表示不会开机启动。
注:想使用service模块启动服务,被启动的服务,必须可以使用service 命令启动或关闭
例如:远程启动Apache服务
# ansible -i /etc/ansible/hosts web-servers -m service -a "name=httpd state=restarted"
9、sysctl模块远程主机sysctl配置。
例:开启路由转发功能
# ansible -i /etc/ansible/hosts web-servers -m sysctl -a "name=net.ipv4.ip_forward value=1 reload=yes"
验证:
# cat /proc/sys/net/ipv4/ip_forward 1