4

Ansible的基本配置 - FuShudi

 6 months ago
source link: https://www.cnblogs.com/fsdstudy/p/18030956
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

定义主机和组

在使用ansible来批量管理主机的时候,通常我们需要先定义要管理哪些主机或者主机组,而这个用于管理主机与主机组的文件就叫做Inventory,也叫做主机清单,该文件默认位于/etc/ansible/hosts(如果是pip安装则没有)
当然我们也可以通过修改ansible的配置文件来修改默认使用的主机清单

主机的定义

  • 主机部分可以使用域名,主机名,IP地址来定义;使用前2者时,需要主机能够解析到对应的IP地址
[devops@node1 ~]$ cat hostsnode1node2node1.example.comnode2.example.com192.168.200.100192.168.200.200

我们可以看到,现在主机清单里面是写了node1(主机名),node1.example.com(域名),192.168.200.100(IP地址),这三种定义方式都是可以的,但是你要想管理的话,主机名和域名必须是有对应的解析的
这种方式是一个个定义,我们还可以指定范围,比如

[devops@node1 ~]$ cat hosts192.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]node1node2

中括号里面写的就是组名,下面的内容就是这个组内有哪些主机
同样我们可以通过组名来查看组内有哪些主机

# 注意,我之前写的是ansible all --list# 这里写的是webserver,也就是主机组的名字,所以他只会列出这个主机组内的成员[devops@node1 ~]$ ansible webserver --list hosts (2): node1 node2

如果有多个主机组,那么就可以写多个中括号,一个主机可以隶属于不同主机组

[devops@node1 ~]$ cat hosts[webserver]node1node2[sqlserver]node2node3[devops@node1 ~]$ ansible all --list hosts (3): node1 node2 node3

这里不知道你有没有疑问,那我主机和主机组同时定义的时候,位置是随意的吗?不是!
单个主机只能写在主机组之前,如果你写在主机组之后,不管你空多少行,他都会认为你这个主机是属于这个组内的,来看例子

现在我想定义一个单个主机192.168.1.1

3204832-20240224113130241-1312866543.png

从截图我们可以看到,这个192.168.1.1与主机组sqlserver之前是空了很多行的,我们通过命令来查一下看看

# 我们直接来查sqlserver主机组内有哪些成员[devops@node1 ~]$ ansible sqlserver --list hosts (3): node2 node3 192.168.1.1

看到了吗,sqlserver主机组内是包含这个主机的,那我们将这个主机提前到所有主机组之前

3204832-20240224113339649-1736629565.png

我们再来查一下

[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 hosts192.168.1.1 [webserver]node1node2 [sqlserver]node2node3 [MachineRoom:children]webserversqlserver

就是这样定义的,[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
  1. 匹配指定的主机或组
# 匹配单个主机[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 hosts192.168.1.1node1.example.comnode2.example.com [webserver]node1node2 [sqlserver]node2node3

使用通配符匹配

# 匹配所有以.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个地方

    1. ANSIBLE_CONFIG:首先,Ansible命令会检查这个环境变量以及指向的配置文件,优先级最高
    1. ./ansible.cfg:当前目录下的ansible.cfg,如果ANSIBLE_CONFIG环境变量不存在,那么就会使用这个
    1. ~/.ansible.cfg:当前用户家目录下的一个隐藏文件,如果当前目录下没有ansible.cfg文件,就会检查这个隐藏文件是否存在
    1. /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/hostsask_pass = falseremote_user = root[privilege_escalation]become = truebecome_method = sudobecome_user = rootbecome_ask_pass = False

这些配置我们一行行来看

  1. inventory: 定义默认使用的主机清单,当前是使用的/etc/ansible/hosts,可以将他修改成你想用的那个文件
  2. remote_user:ansible在操作远程主机时,使用远程主机上的哪个用户身份,默认是root,为了安全可以使用一个普通用户
  3. ask_pass:在操作远程主机时,登录时是否输入密码,默认为true。如果使用密钥认证,将这里设置为false
  4. become:是否提权
  5. become_method:如果使用提权,将以何种方式提权,默认时sudo
  6. become_user:提权到哪个用户,默认提权到root
  7. 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/hostsecho "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-keygenGenerating 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 [email protected] 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])? yesdevops@node2's password: # 这里输入密码Now try logging into the machine, with: "ssh 'node2'"
# 1. 将配置文件拷贝到普通用户家目录下[devops@node1 ~]$ cp -r /etc/ansible/ .[devops@node1 ~]$ lsansible# 2. 进入目录修改配置[devops@node1 ~]$ cd ansible/[devops@node1 ansible]$ lsansible.cfg hosts roles# 最后将配置文件修改成这样就行[devops@node1 ansible]$ cat ansible.cfg[defaults]inventory = ./hostssudo_user = devopsask_sudo_pass = Falseask_pass = Falsehost_key_checking = False[privilege_escalation]become=Truebecome_method=sudobecome_user=rootbecome_ask_pass=False

5. 写主机清单

[devops@node1 ansible]$ cat hosts node1node2

6. 验证配置是否生效

[devops@node1 ansible]$ ansible all --list hosts (2): node1 node2[devops@node1 ansible]$ ansible all -m shell -a 'whoami'node2 | CHANGED | rc=0 >>rootnode1 | CHANGED | rc=0 >>root

我们可以看到,node1和node2上都执行成功了,并且返回的结果时root,说明提权也是配置正确的
这就是ansible的基本配置了


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK