以下所有的实验来都是在redhat7.3上
本章对ansible的inventory文件的配置做了详解,让我们了解了如何定义主机、主机组、主机变量、主机组变量等配置。
擅长使用使用ansible ad-hoc指令,使用ansible常用模块
主机信息 | 作用 |
---|---|
server5(172.25.70.5) | 主控端节点 |
server6(172.25.70.6) | 被控节点1 |
server7(172.25.70.7) | 被控节点2 |
(1) 在真机上创建三台快照(母盘内存是2048M,cpu为2)
[root@foundation70 images]# qemu-img create -f qcow2 -b rhel7.3small.qcow2 ansible1
[root@foundation70 images]# qemu-img create -f qcow2 -b rhel7.3small.qcow2 ansible2
[root@foundation70 images]# qemu-img create -f qcow2 -b rhel7.3small.qcow2 ansible3
(2)在真机上远程连接server5、server6、server7
(3)在真机上搭建第三方yum源仓库,里面包括ansible以及一些依赖性关系的rpm包
##这里的repodate是进行了createrepo -v /var/www/html/ansible所生成的
#关闭真机的防火墙
[root@foundation70 ansible]# systemctl start httpd
[root@foundation70 ansible]# systemctl enable httpd.service
[root@foundation70 ansible]# systemctl stop firewalld
(4)在server5上面编写yum配置文件
(5)各个主机上进行域名解析
(1)在server5上面安装ansible
下载ansible所需要的相关rpm包及其依赖包,进行安装
由于我在真机的网络yum源里面搭建了第三方仓库,因此这里直接安装,不需要处理依赖性关系
在真机上已经createrepo -v ansible的目录,所以现在可以直接使用
[root@server5 yum.repos.d]# yum install -y ansible #安装ansible
[root@server5 ~]# ansible --version
(3)查看ansible的配置文件
[root@server5 yum.repos.d]# cd /etc/ansible/
[root@server5 ansible]# ls
ansible.cfg hosts roles
/etc/ansible/ansible.cfg 主配置文件,配置ansible工作特性
/etc/ansible/hosts 主机清单
/etc/ansible/roles/ 存放角色的目录
(4)编辑/etc/hosts文件,添加本地解析(因为ansible的连接是通过ssh,加快ssh连接)
(5)添加普通用户使用ansible,编辑ansible主配置文件
[root@server5 ansible]# useradd devops #添加用户
[root@server5 ansible]# id devops #查看添加成功
uid=1000(devops) gid=1000(devops) groups=1000(devops)
[root@server5 ansible]# su - devops #切换用户
[devops@server5 ~]$ mkdir ansible
[devops@server5 ~]$ cd ansible/
[devops@server5 ansible]$ ls
[devops@server5 ansible]$ pwd
/home/devops/ansible
[devops@server5 ansible]$ vim ansible.cfg
[devops@server5 ansible]$ cat ansible.cfg
[defaults]
inventory = ./inventory #管理主机的清单,#等号后面的名字无所谓,主要是前面的参数
[devops@server5 ansible]$ vim inventory
[devops@server5 ansible]$ pwd
/home/devops/ansible
[devops@server5 ansible]$ cat inventory
[web] # 主机组名
172.25.70.6 #主机ip
[db] #主机组名
172.25.70.7
(7)设置ssh免密登陆
给两个节点server2和server3同样添加devops用户,并且设置密码
测试是否可以免密远程登录server6和server7
(9)测试一下设置是否正确
[devops@server5 ansible]$ ansible 172.25.70.6 -m ping -k #输入密码,测试server6 的ansible节点是否可以ping通
[devops@server5 ansible]$ ansible web -m ping
[devops@server5 ansible]$ ansible all -m ping
#rm -rf /root/.ansible/cp/*
清除缓存
其实命令和模块常常是结合在一起使用的
ansible命令示例
以bruce用户执行ping存活检测 # ansible all -m ping -u bruce
以bruce sudo至root执行ping存活检测 # ansible all -m ping -u bruce -b
以bruce sudo至batman用户执行ping存活检测 # ansible all -m ping -u bruce -b --become-user batman
ansible命令使用场景
非固化需求
临时一次性操作
二次开发接口调用
Inventory文件配置
Inventory是Ansible管理主机信息的配置文件,相当于系统HOSTS文件的功能,默认存放在/etc/ansible/hosts
定义主机和组
# Inventory可以直接为IP地址
172.25.0.2
# 端口号不是默认22端口时,可明确的表示为:
server2:2222
server2 ansible_port=2222 ansible_host=172.25.0.2
定义主机和组
# 中括号表示一个组,也可以表示一个范围
[webserver]
www[1:10].example.com
db-[a:f].example.com
定义主机变量
在playbook中使用时对主机进行个性化定制
[webserver]
web1 http_port=8080 maxRequestsPerChild=1024
定义组变量
[webserver]
server2
server3
[webserver:vars]
ntp_server=time1.aliyun.com
webserver组中的所有主机ntp_server值为time1.aliyun.com
定义组嵌套及组变量
组与组之间可以相互调用,并且可以向组中的主机指定变量。不过,这些变量只能在Ansible-playbook中使用,而Ansible不支持
[apache]
server1
server2
[nginx]
server3
server4
[webservers:children]
apache
nginx
[webservers:vars]
ntp_server=time1.aliyun.com
组与组之间可以相互掉用户,并且可以向组中的主机指定变量。不过,这些变量只能在Ansible-palybook中使用,而Ansible不支持
在inventory 主文件中保存所有的变量并不是最佳的方式.还可以保存在独立的文件中
这些独立文件的格式为 YAML
/etc/ansible/group_vars/raleigh
/etc/ansible/group_vars/webservers
/etc/ansible/host_vars/foosball
当变量变得太多时,分文件定义变量更方便进行管理和组织
/etc/ansible/group_vars/raleigh/db_settings
/etc/ansible/group_vars/raleigh/cluster_settings
变量的检索位置
Inventory配置文件(默认/etc/ansible/hosts)
Playbook中vars定义的区域
Roles中vars目录下的文件
Roles同级目录group_vars和hosts_vars目录下的文件
大家设置变量时尽量沿用同一种方式,以方便维护人员管理。
Ansible与正则
匹配所有主机,all或*号功能相同。
ansible all –m ping
ansible "*" -m ping
ansible 172.25.0.* -m ping
对多台主机或多个组同时执行,相互之间用冒号分隔即可
ansible "web1:web2" -m ping
在webserver组但不在database组的主机,用感叹号表示
ansible 'webservers:!database' -m ping
在webserver组和database组中同时存在的主机,用&符号表示
ansible "webservers:&database" -m ping
模糊匹配
*.example.com
www*.com:database
(1)ad-hoc 使用场景
Ansible提供两种方式去完成任务,一是 ad-hoc 命令,一是写 Ansible playbook
在学习了 playbooks 之后,你才能体会到 Ansible 真正的强大之处在哪里
ad-hoc更注重于解决一些简单或者平时工作中临时遇到的任务,相当于Linux系统命令行下的Shell命令
后者更适合于解决复杂或需固化下来的任务,相当于Linux系统的Shell Scripts。
使用场景
关闭所有不必要的服务器
临时更新Apache或Nginx的配置文件
(2)ansible命令执行流程
(3)Ansible的并发特性
Ansible和Ansible-playbook默认会fork 5个线程并发执行命令,如果同时操作的主机数比较多的话,可以调整到一个更大的值。
Ansible为我们提供了便捷的选项,-f指定线程数。
# ansible webserver -m ping -f 3
ansible有许多模块,默认是 command,也就是命令模块,我们可以通过 -m 选项来指定不同的模块。
(4)Ansible-doc用法
ansible的模块非常之多,Ansible也提供了类似于man功能的help说明工具ansible-doc。
正式学习Ansible模块使用前,有必要先了解ansible-doc用法:
ansible-doc -l # 显示所有可用模块#
ansible-doc yum # 获取yum模块帮助#
ansible-doc user #先看 =号参数 必写项 - 号可选参数
(5)Ansible常用模块
copy模块
# ansible webservers -m copy -a "src=/etc/hosts dest=/tmp/hosts"
file模块
# ansible webservers -m file -a "dest=/tmp/hosts mode=600 owner=root group=root" #修改文件权限和属性
# ansible webservers -m file -a "dest=/tmp/dir1/dir2 mode=755 owner=root group=root state=directory" #递归创建
# ansible webservers -m file -a "dest=/tmp/dir1/dir2 state=absent"
yum模块
# ansible webservers -m yum -a "name=httpd state=present"
# ansible server3 -m yum -a "name=http://172.25.0.250/rhel7.3/x86_64/dvd/Packages/vsftpd-3.0.2-21.el7.x86_64.rpm state=present" #在线安装
# ansible server3 -m yum -a "name=/mnt/vsftpd-3.0.2-21.el7.x86_64.rpm state=present" #本地安装
# ansible server3 -m yum -a "name=httpd state=absent" #卸载软件
service模块
# ansible webservers -m service -a "name=httpd state=started"
# ansible webservers -m service -a "name=httpd state=restarted"
# ansible webservers -m service -a "name=httpd state=stopped"
user模块
# ansible all -m user -a "name=wxh password=<加密密码>"
# ansible all -m user -a "name=wxh state=absent remove=yes"
# ansibledb -m user -a "name=wxh shell=/bin/bash groups=users,wheel append=yes state=present"
mysql_user模块
# ansible server3 -m mysql_user -a "name=wxh password=testpass priv=*.*:select host='%' state=present"
远程主机需要安装MySQL-python
(6)其余知识点
ansible server2 -m setup ##查看指定主机server2上的facts变量信息
ansible all -m setup ##查看指定的所有主机上的facts变量信息
ansible '*' -m setup ##同上
ansible-doc -l ##列出有哪些可用的模块,按q退出
ansible-doc -l | wc -l ##列出有多少个可用的模块
ansible-doc user ##查看user模块的帮助文档,按q退出。也可以在最后一行输入/passwd,来过滤与passwd有关的内容
ansible test -a 'df -h' ##在test组执行df -h命令
(1)默认模块command
一般来说如果-m后面没有加模块则默认使用command模块
(2)copy模块
[devops@server1 ansible]$ ansible test -m copy -a 'src=/etc/passwd dest=/tmp/passwd'
src为源地址(是ansible控制主机上的地址),dest为被控制节点主机的目标地址
查看是否将本机文件复制到server2上
(3)file模块
查看server2的/tmp下的文件权限(刚刚复制过去的文件)
查看权限
(4)yum模块
需要注意的是我们在使用yum的时候普通用户是要有sudo权限的
其实就是devops没有权限使用yum,只有sudo授权之后才有权限
因此先设置server2和server3中devops用户的sudo权限
[root@server2 ~]# vim /etc/sudoers #保存退出时如果显示权力不够,则加wq!强制保存即可
[root@server3 ~]# vim /etc/sudoers
权限设置好以后,尝试在server2上安装httpd服务
[devops@server1 ansible]$ ansible test -m yum -a 'name=httpd state=present' -b
##一定要加-b,指定sudo,否则回报错
查看是否下载成功
[devops@server1 ansible]$ ansible test -a 'rpm -q httpd'
当然如果不愿意加-b去特别指定的话,我们也可以修改主配置文件,给与sudo所需要的权限
[devops@server1 ansible]$ vim ansible.cfg
[devops@server1 ansible]$ cat ansible.cfg
[defaults]
inventory = inventory
[privilege_escalation]
become=True
become_method=sudo
become_user=root
become_ask_pass=False
我们去尝试在server2和server3上都安装httpd,不加参数-b
[devops@server1 ansible]$ ansible webservers -m yum -a 'name=httpd state=present'
(5)service模块
启动db(server3)的httpd服务
[devops@server1 ansible]$ ansible db -m service -a 'name=httpd state=started'
我们给它写一个默认发布界面,方便我们测试
[devops@server1 ansible]$ ansible db -m copy -a 'content="hello world\n" dest=/var/www/html/index.html'
(6)firewalld防火墙模块
首先,开启防火墙
[devops@server1 ansible]$ ansible db -m service -a 'name=firewalld state=started enabled=true'
测试:
我们把httpd服务加入防火墙的白名单:
[devops@server1 ansible]$ ansible db -m firewalld -a 'service=http state=enabled permanent=yes immediate=yes'
关闭防火墙
[devops@server1 ansible]$ ansible db -m service -a 'name=firewalld state=stopped enabled=false'
(1)ping一下远程主机组的所有主机以及ping 远程主机的不同方式
all表示所有远程的主机组,使用command模块,也是默认的模块,然后使用ping命令
可以看到server2和server3主机是可以ping通的
[devops@server5 ansible]$ ansible all -m ping # #列出ping通的主机
[devops@server5 ansible]$ ansible "*" -m ping #*等同于all,但是需要添加引号
[devops@server5 ansible]$ ansible web:db -m ping#连接web组和db组的并集
[devops@server5 ansible]$ ansible web:!db -m ping#连接web组里面的主机但是不连接db组里面的主机
[devops@server5 ansible]$ ansible 'web:&db' -m ping #连接web组和db组的交集主机,但是报错;
[WARNING]: No hosts matched, nothing to do
[devops@server5 ansible]$ cat inventory #
[web]
172.25.70.6
[db]
172.25.70.7
172.25.70.6 #设置web和db的交集
[webserver:children] #创建webserver组,批量检测
web
db
[devops@server5 ansible]$ ansible 'web:&db' -m ping
172.25.8.5 | SUCCESS => {
"changed": false,
"ping": "pong"
}
[devops@server5 ansible]$ ansible webserver -m ping #连接webserver所有主机
(2)使用devops的身份去检测
- u表示指定用户
可以看出以devops用户的身份去ping远程主机的devops用户是可以的
以devops用户的身份去ping远程主机的root用户是不可以的
记住:这里的用户指的都是远程主机的用户,拿谁家的钥匙开谁家的门
-b表示自动由devops用户转为root用户,因此还是不可以的
[devops@server5 ansible]$ ansible web -m service -a "name=httpd state=started" #开启httpd服务
[devops@server5 ansible]$ curl 172.25.70.6
[devops@server5 ansible]$ ansible web -m firewalld -a "service=http state=enabled" #打开web(172.25.70.6)的firewalld,然后设置成自启动的
[devops@server5 ansible]$ ansible web -m firewalld -a "service=http state=disabled" #给远程主机web(172.25.70.6)的firewalld设置成开机不自启
[devops@server5 ansible]$ curl 172.25.70.6
curl: (7) Failed connect to 172.25.70.6:80; No route to host
[devops@server5 ansible]$ ansible web -m service -a "name=firewalld state=stopped" #关闭防火墙
(3)copy模块
将本地的文件拷贝到远程主机(test组的主机)的tmp目录下面
这个是可以的,因为远程主机的devops用户对tmp目录有权限
在web组的server6主机上面查看一下是否拷贝成功
在server5主机上也可以直接查看,-a表示要执行的动作
也可以删除
删除完之后再次查看
将本地的文件拷贝到远程主机(test组的主机)的/mnt目录下面
这个是不可以的,因为server1和server2的 免密是devops用户的免密,devops用户对/mnt没有权限
/mnt --------- 此目录主要是作为挂载点使用。通常包括系统引导后被挂载的文件系统的挂载点。如挂载Windows下的某个分区
/tmp --------- 这个目录是用来存放一些临时文件的,所有用户对此目录都有读写权限。
在server2和server3上面授权,使devops具备root用户的权限
vim /etcsudoers 设置devops权限后强制wq!退出
再次拷贝,发现就成功了
现在不想使用-b转换身份,想直接默认使用root身份
再次验证就成功了
(8)yum模块
使用yum模块给webserver组里面的主机安装httpd服务
也可以在server1上看是否给server2安装了
也可以查看webserver组里面的主机是否都安装了httpd服务
另外一种方法
卸载webserver组里面的刚才安装的httpd服务
在server6上面验证
在server5上面再次验证
(9)给web组里面的主机安装httpd服务并且开启服务
关闭服务
(10)给web组的主机创建用户
(11)查看主机的详细信息
(12)给server7安装数据库
给server7创建用户
打开数据库
创建数据库用户并且授权