Ansible的基本配置
定义主机和组
在使用ansible来批量管理主机的时候,通常我们需要先定义要管理哪些主机或者主机组,而这个用于管理主机与主机组的文件就叫做Inventory,也叫做主机清单,该文件默认位于/etc/ansible/hosts(如果是pip安装则没有)
当然我们也可以通过修改ansible的配置文件来修改默认使用的主机清单
主机的定义
- 主机部分可以使用域名,主机名,IP地址来定义;使用前2者时,需要主机能够解析到对应的IP地址
[devops@node1 ~]$ cat hosts
node1
node2
node1.example.com
node2.example.com
192.168.200.100
192.168.200.200
我们可以看到,现在主机清单里面是写了node1(主机名),node1.example.com(域名),192.168.200.100(IP地址),这三种定义方式都是可以的,但是你要想管理的话,主机名和域名必须是有对应的解析的
这种方式是一个个定义,我们还可以指定范围,比如
[devops@node1 ~]$ cat hosts
192.168.200.[1:10]
# 通过命令来查看当前被定义的主机是哪些
# ansible all --list就是列出主机清单内的全部主机
[devops@node1 ~]$ ansible all --list
hosts (10):
192.168.200.1
192.168.200.2
192.168.200.3
192.168.200.4
192.168.200.5
192.168.200.6
192.168.200.7
192.168.200.8
192.168.200.9
192.168.200.10
可以看到,他确实是我们定义的那样从1-10这个IP地址范围
主机组的定于
主机的定义就是直接讲被管理的节点写入到主机清单内,而主机组的定义是需要加上一个[组名]的
[devops@node1 ~]$ cat hosts
[webserver]
node1
node2
中括号里面写的就是组名,下面的内容就是这个组内有哪些主机
同样我们可以通过组名来查看组内有哪些主机
# 注意,我之前写的是ansible all --list
# 这里写的是webserver,也就是主机组的名字,所以他只会列出这个主机组内的成员
[devops@node1 ~]$ ansible webserver --list
hosts (2):
node1
node2
如果有多个主机组,那么就可以写多个中括号,一个主机可以隶属于不同主机组
[devops@node1 ~]$ cat hosts
[webserver]
node1
node2
[sqlserver]
node2
node3
[devops@node1 ~]$ ansible all --list
hosts (3):
node1
node2
node3
这里不知道你有没有疑问,那我主机和主机组同时定义的时候,位置是随意的吗?不是!
单个主机只能写在主机组之前,如果你写在主机组之后,不管你空多少行,他都会认为你这个主机是属于这个组内的,来看例子
现在我想定义一个单个主机192.168.1.1

从截图我们可以看到,这个192.168.1.1与主机组sqlserver之前是空了很多行的,我们通过命令来查一下看看
# 我们直接来查sqlserver主机组内有哪些成员
[devops@node1 ~]$ ansible sqlserver --list
hosts (3):
node2
node3
192.168.1.1
看到了吗,sqlserver主机组内是包含这个主机的,那我们将这个主机提前到所有主机组之前

我们再来查一下
[devops@node1 ~]$ ansible sqlserver --list
hosts (2):
node2
node3
# 通过这个命令可以查到不属于任何主机组的主机
[devops@node1 ~]$ ansible ungrouped --list
hosts (1):
192.168.1.1
现在他被定义成了一个单个主机
主机组的嵌套
主机组的嵌套是什么呢?我们可以这样来想象,假设你现在管理2个机房的服务器,现在你需要对机房1的所有服务器进行软件升级,这个时候你怎么去选择机房1呢?我们可以通过主机嵌套来解决
[devops@node1 ~]$ cat hosts
192.168.1.1
[webserver]
node1
node2
[sqlserver]
node2
node3
[MachineRoom:children]
webserver
sqlserver
就是这样定义的,[MachineRoom:children],也就是说MachineRoom下面有哪些孩子嘛,它下面有webserver组和sqlserver组,这2个组就代表着机房1,所以我需要对机房1进行操作的话我就可以直接选择Machine这个组就可以了
[devops@node1 ~]$ ansible MachineRoom --list
hosts (3):
node1
node2
node3
选择主机和组
上面我们说到了定义主机和主机组,定义完了之后我们如何去选择呢?上面也提到了一些,选择我们来看如果更精准的选择
匹配主机
# 或者执行ansible all --list-hosts是一样的
[devops@node1 ~]$ ansible all --list
hosts (4):
192.168.1.1
node1
node2
node3
- 匹配指定的主机或组
# 匹配单个主机
[devops@node1 ~]$ ansible 192.168.1.1 --list
hosts (1):
192.168.1.1
# 配置主机组
[devops@node1 ~]$ ansible webserver --list
hosts (2):
node1
node2
# 匹配多个主机,这种方式可以选择多个,只需要用逗号隔开就行
[devops@node1 ~]$ ansible 192.168.1.1,webserver --list
hosts (3):
192.168.1.1
node1
node2
# 匹配不属于任何主机组的主机
[devops@node1 ~]$ ansible ungrouped --list
hosts (1):
192.168.1.1
使用通配符匹配
先改一个hosts文件内容
[devops@node1 ~]$ cat hosts
192.168.1.1
node1.example.com
node2.example.com
[webserver]
node1
node2
[sqlserver]
node2
node3
使用通配符匹配
# 匹配所有以.example.com结尾的主机
[devops@node1 ~]$ ansible *.example.com --list
hosts (2):
node1.example.com
node2.example.com
# 匹配所有.example.com结尾的主机但是不匹配node2开头的主机,这种情况需要使用引号,如果不使用引号终端会将!当作历史命令给执行的
[devops@node1 ~]$ ansible '*.example.com,!node2*' --list
hosts (1):
node1.example.com
配置文件优先级
ansible的配置文件也是有优先级的,他一般会存在4个地方
- ANSIBLE_CONFIG:首先,Ansible命令会检查这个环境变量以及指向的配置文件,优先级最高
- ./ansible.cfg:当前目录下的ansible.cfg,如果ANSIBLE_CONFIG环境变量不存在,那么就会使用这个
- ~/.ansible.cfg:当前用户家目录下的一个隐藏文件,如果当前目录下没有ansible.cfg文件,就会检查这个隐藏文件是否存在
- /etc/ansible/ansible.cfg:默认的配置文件,如果以上所有的配置文件都不存在,则会使用这个
配置文件详解
配置文件段
ansible.cfg的配置迷人分为十段:
[defaults] 通用配置项目
[inventory] 与主机清单相关配置
[privilege_escalation] 特权升级相关配置
[paramiko_connection] 使用paramiko连接的相关配置
[ssh_connection] 使用openssh连接的相关配置
[persistent_connection] 持久连接的配置项
[accelerate] 加速模式相关配置
[selinux] selinux相关配置
[color] ansible命令输出的颜色相关配置
[diff] 是否再运行时打印diff (变更前与变更后的差异)
配置文件参数说明
[defaults]
inventory = /etc/ansible/hosts
ask_pass = false
remote_user = root
[privilege_escalation]
become = true
become_method = sudo
become_user = root
become_ask_pass = False
这些配置我们一行行来看
- inventory: 定义默认使用的主机清单,当前是使用的/etc/ansible/hosts,可以将他修改成你想用的那个文件
- remote_user:ansible在操作远程主机时,使用远程主机上的哪个用户身份,默认是root,为了安全可以使用一个普通用户
- ask_pass:在操作远程主机时,登录时是否输入密码,默认为true。如果使用密钥认证,将这里设置为false
- become:是否提权
- become_method:如果使用提权,将以何种方式提权,默认时sudo
- become_user:提权到哪个用户,默认提权到root
- become_ask_pass:提权是否需要输入密码,默认为False
配置案例
前置条件,配置hosts映射,所有节点都要做
| 主机 | IP | 主机名 |
|---|---|---|
| node1 | 192.168.100.210 | node1 |
| kvm | 192.168.100.220 | node2 |
echo "192.168.100.210 node1" >> /etc/hosts
echo "192.168.100.220 node2" >> /etc/hosts
需求,使用普通用户devops去操作主机,devops使用密钥验证,可以免密提权到root
1. 在节点上创建一个普通用户devops,并设置密码123
[root@node1 ~]# useradd devops
[root@node1 ~]# echo 123|passwd --stdin devops
[root@kvm ~]# useradd devops
[root@kvm ~]# echo 123|passwd --stdin devops
2. 配置sudo提权
[root@node1 ~]# cat /etc/sudoers.d/devops
devops ALL=(root) NOPASSWD:ALL
[root@kvm ~]# cat /etc/sudoers.d/devops
devops ALL=(root) NOPASSWD:ALL
3. 配置管理节点免密登录到被管节点
[root@node1 ~]# su - devops
[devops@node1 ~]$ ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/home/devops/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/devops/.ssh/id_rsa.
Your public key has been saved in /home/devops/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:eUVPHb1laerU/LB+EDBFHu8nrtjz9jE91cZ2SditO8Y devops@node1.example.com
The key's randomart image is:
+---[RSA 3072]----+
| .o=o+|
| .o+o=*|
| .+B+=|
| . . o+Bo|
| S . o o=@|
| . +o=*|
| .E=.|
| o.oo.=|
| . o+.o.|
+----[SHA256]-----+
# 将公钥发送到被管节点
[devops@node1 ~]$ ssh-copy-id node1
[devops@node1 ~]$ ssh-copy-id node2
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/home/devops/.ssh/id_rsa.pub"
The authenticity of host 'node2 (192.168.100.220)' can't be established.
ECDSA key fingerprint is SHA256:sH7gqZEak7Xap0VARUzaZJXrr2y4RE2ds40WKMoCspw.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
devops@node2's password: # 这里输入密码
Now try logging into the machine, with: "ssh 'node2'"
4. 配置
# 1. 将配置文件拷贝到普通用户家目录下
[devops@node1 ~]$ cp -r /etc/ansible/ .
[devops@node1 ~]$ ls
ansible
# 2. 进入目录修改配置
[devops@node1 ~]$ cd ansible/
[devops@node1 ansible]$ ls
ansible.cfg hosts roles
# 最后将配置文件修改成这样就行
[devops@node1 ansible]$ cat ansible.cfg
[defaults]
inventory = ./hosts
sudo_user = devops
ask_sudo_pass = False
ask_pass = False
host_key_checking = False
[privilege_escalation]
become=True
become_method=sudo
become_user=root
become_ask_pass=False
5. 写主机清单
[devops@node1 ansible]$ cat hosts
node1
node2
6. 验证配置是否生效
[devops@node1 ansible]$ ansible all --list
hosts (2):
node1
node2
[devops@node1 ansible]$ ansible all -m shell -a 'whoami'
node2 | CHANGED | rc=0 >>
root
node1 | CHANGED | rc=0 >>
root
我们可以看到,node1和node2上都执行成功了,并且返回的结果时root,说明提权也是配置正确的
这就是ansible的基本配置了
Ansible的基本配置的更多相关文章
- Ansible :一个配置管理和IT自动化工具
编译文章:LCTT https://linux.cn/article-4215-1.html 译者: felixonmars 文章地址:https://linux.cn/article-4215-1 ...
- 服务器批量管理软件ansible安装以及配置
1.yum安装(管理主机以及被管理主机都需要安装) yum install epel-release yum install ansible 2.配置管理主机 vim /etc/ansible/hos ...
- Ansible 安装与配置(一)
公司大概有200多云主机需要进行管理,但是如果通过手工管理费时还累最终结果也容易出错,所以考虑通过自动化的方式来管理云主机,目前开源的自动化工具,大家用的比较多的有Ansible和Saltstack这 ...
- 002. Ansible部署及配置介绍
一 Ansible的安装部署 1.1 PIP方式 安装PIP 略,可参考<001.Pip简介及使用>. 提示:建议将PIP升级到最新:pip install --upgrade pip. ...
- 15.Ansible安装与配置简单版
Ansible是一个简单高效的自动化运维管理工具,用Python开发,能大批量管理N多台机器,可以并发的在多台机器上部署应用.安装软件.执行命令.配置和编排任务. 一.Ansible工作机制 从图中可 ...
- Ansible部署及配置介绍
原文转自:https://www.cnblogs.com/itzgr/p/10233932.html作者:木二 目录 一 Ansible的安装部署 1.1 PIP方式 1.2 YUM方式 二 Ansi ...
- ansible主机组配置及秘钥分发
ansible主机组配置及秘钥分发 ansible主机组文件位于/etc/ansible/hosts文件中 1 hosts主机经常使用到的变量为: 2 ansible_ssh_host #用于指定被管 ...
- ansible简介安装配置
ansible简介 ansible是一款,自动化运维管理工具.顾名思义是用于批量去管理及安装服务及批量管理主机. ansible与saltstack对比 ansible优点:配置简单,部署容易除主管理 ...
- 1.Ansible安装以及配置
本节内容以Centos7为系统环境进行讲解: 1.安装epel源,方便直接yum安装: wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun ...
- Ansible安装及配置
ansible分为以下几个部份: Ansible:核心引擎 Modules:包括 Ansible 自带的核心模块(core modules)及自定义模块 (custom modules): 核心模块: ...
随机推荐
- [转帖]CentOS 8已经停止维护,怎么检查CentOS的版本
https://rumenz.com/rumenbiji/centos-check-version.html CentOS 8 在2021年12月31日停止更新并停止维护(EOL). CentOS 7 ...
- [转帖]火狐URL默认打开为HTTPS,切换成http形式
火狐在当前及未来版本默认URL采用HTTPS进行链接,但个人习惯,某些网站不是https,改http在响应超时状态也会切成https,将默认为http. edge,chrome 依然还是http为主要 ...
- [百度贴吧]部分CPU的SPEC2006int 结果
这些测试成绩基本上是本人自己测试的结果.下表中有来自spec官网的两个成绩,因为测试年份较早,系统环境和编译器都较老,测试成绩本人实测的还差,所以仅作为参考.部分测试启用了自动并行和附加的优化库,是为 ...
- Linux无头模式使用mat分析dump的方法
摘要 mat可以很好的进行jvm的内存dump的分析. 但是大部分服务器是没有GUI界面的. 而且就算是有GUI界面也很难直接使用. 但是随着jvm堆区越来越大. WindowsPC机器已经很难进行分 ...
- mysql 的outfile以及infile 语法简单备份恢复表
今天学习 姜老师的 mysql技术内存innodb存储引擎时看到了有一个outfile和infile的语法,感觉挺好的, 这里面进行一下简单的学习与验证. oufile 可以到处文件 infile 可 ...
- 程序调试利器——GDB使用指南
作者:京东科技 孙晓军 # 1\. GDB介绍 GDB是GNU Debugger的简称,其作用是可以在程序运行时,检测程序正在做些什么.GDB程序自身是使用C和C++程序编写的,但可以支持除C和C++ ...
- TS声明promise返回来的数据类型
promise返回来的数据类型 interface backResult{ code: number, data: { name:string,age:number}[], //数组里面的对象类型,这 ...
- vue3关于.sync的用法
场景描述 我们都知道,子组件是不能够去修改父组件传递过来的数据. 因为如果子组件去修改父组件件传递过来的数据. 会导致数据的应用流向变得难以理解. 但是有些时候,我们需要当子组件的数据变化后,父组件的 ...
- c++全局变量extern
extern extern 是 C++ 中的一个关键字,用于声明一个变量或函数是在其他文件中定义的.它的作用是告诉编译器在链接时在其他文件中寻找该变量或函数的定义. 在 C++ 中,如果一个变量或函数 ...
- 深度学习应用篇-计算机视觉-视频分类[8]:时间偏移模块(TSM)、TimeSformer无卷积视频分类方法、注意力机制
深度学习应用篇-计算机视觉-视频分类[8]:时间偏移模块(TSM).TimeSformer无卷积视频分类方法.注意力机制 1.时间偏移模块(TSM) 视频流的爆炸性增长为以高精度和低成本执行视频理解任 ...