本章对ansible的inventory文件的配置做了详解,让我们了解了如何定义主机、主机组、主机变量、主机组变量等配置。
你应该能:使用ansible ad-hoc指令,使用ansible常用模块
主机信息 | 主机功能 |
---|---|
server1(172.25.2.1 ) | 主控端节点 |
server2(172.25.2.2) | 被控节点1 |
server3(172.25.2.3) | 被控节点2 |
(1)在真机中创建三个快照,并且开启
(2)用真机连接三个实验节点
(3)在真机上搭建网络yum源,里面包括ansible以及一些依赖性关系的rpm包
(4)在server1上面编写yum配置文件
(1)在server1上面安装ansible
下载ansible所需要的相关rpm包及其依赖包,进行安装
由于我在真机的网络yum源里面搭建了第三方仓库,因此这里直接安装,不需要处理依赖性关系
createrepo -v ansible的目录,这样就可以了
(3)查看ansible的配置文件
/etc/ansible/ansible.cfg 主配置文件,配置ansible工作特性
/etc/ansible/hosts 主机清单
/etc/ansible/roles/ 存放角色的目录
(4)编辑/etc/hosts文件,添加本地解析(因为ansible的连接是通过ssh)
(5)添加普通用户使用ansible,编辑ansible主配置文件
[devops@server1 ansible]$ vim ansible.cfg
[devops@server1 ansible]$ cat ansible.cfg
[defaults]
inventory = inventory 管理主机的清单
(6)设置ansible主机
(7)设置ssh免密登陆
下面使用的密码为前面设置的devops密码
(8)给两个节点server2和server3同样添加devops用户,并且设置密码
(9)测试一下设置是否正确
手残将文件名写错了
测试所有的ansible节点是否可以ping通
参数 | 功能 |
---|---|
-m | 要执行的模块,默认为command |
-a | 指定模块的参数 |
-u | ssh连接的用户名,默认用root,ansible.cfg中可以配置 |
-b,–become | 变成那个用户身份,不提示密码 |
-k | 提示输入ssh登录密码,当使用密码验证的时候用 |
-s | sudo运行 |
-U | sudo到哪个用户,默认为root |
-K | 提示输入sudo密码,当不是NOPASSWD模式时使用 |
-C | 只是测试一下会改变什么内容,不会真正去执行 |
-c | 连接类型(default=smart) |
-f | fork多少进程并发处理,默认为5个 |
-i | 指定hosts文件路径,默认default=/etc/ansible/hosts |
-I | 指定pattern,对已匹配的主机中再过滤一次 |
-list-host | 只打印有哪些主机会执行这个命令,不会实际执行 |
-M | 要执行的模块路径,默认为/usr/share/ansible |
-o | 压缩输出,摘要输出 |
–private-key | 私钥路径 |
-T | ssh连接超时时间,默认是10秒 |
-t | 日志输出到该目录,日志文件名以主机命名 |
-v | 显示详细日志 |
其实命令和模块常常是结合在一起使用的
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
在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的配置文件
(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
获取yum模块帮助# ansible-doc yum
(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 ##查看指定主机server1上的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一下远程主机组的所有主机
all表示所有远程的主机组,使用command模块,也是默认的模块,然后使用ping命令
可以看到server2和server3主机是可以ping通的
(2)使用devops的身份去检测
- u表示指定用户
可以看出以devops用户的身份去ping远程主机的devops用户是可以的
以devops用户的身份去ping远程主机的root用户是不可以的
记住:这里的用户指的都是远程主机的用户,拿谁家的钥匙开谁家的门
-b表示自动由devops用户转为root用户,因此还是不可以的
(3)copy模块
将本地的文件拷贝到远程主机(test组的主机)的tmp目录下面
这个是可以的,因为远程主机的devops用户对tmp目录有权限
在test组的server2主机上面查看一下是否拷贝成功
在server1主机上也可以直接查看,-a表示要执行的动作
也可以删除
删除完之后再次查看
将本地的文件拷贝到远程主机(test组的主机)的/mnt目录下面
这个是不可以的,因为server1和server2的 免密是devops用户的免密,devops用户对/mnt没有权限
在server2和server3上面授权,使devops具备root用户的权限
再次拷贝,发现就成功了
再次验证就成功了
(4)找出在test组里面但是不在prod组里面的主机
(5)找出既在test组又在prod组里面的所有主机
(6)找出所有组中的所有主机
(7)创建webserver组,批量检测
(8)yum模块
使用yum模块给webserver组里面的主机安装httpd服务
可以在server2上查看
也可以在server1上看是否给server2安装了
也可以查看webserver组里面的主机是否都安装了httpd服务
另外一种方法
关掉webserver组里面的刚才安装的httpd服务
在server2上面验证
再次验证
(9)给test组里面的主机安装httpd服务并且开启服务
关闭服务
(10)给test组的主机创建用户
(11)查看主机的详细信息
(12)安装数据库
创建数据库用户并且授权