• Ansible的基本配置


    定义主机和组

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

    主机的定义

    • 主机部分可以使用域名,主机名,IP地址来定义;使用前2者时,需要主机能够解析到对应的IP地址
    copy
      [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地址),这三种定义方式都是可以的,但是你要想管理的话,主机名和域名必须是有对应的解析的
      这种方式是一个个定义,我们还可以指定范围,比如

      copy
        [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地址范围

        主机组的定于

        主机的定义就是直接讲被管理的节点写入到主机清单内,而主机组的定义是需要加上一个[组名]的

        copy
          [devops@node1 ~]$ cat hosts
          [webserver]
          node1
          node2

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

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

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

            copy
              [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之前是空了很多行的,我们通过命令来查一下看看

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

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

                我们再来查一下

                copy
                  [devops@node1 ~]$ ansible sqlserver --list
                  hosts (2):
                  node2
                  node3
                  # 通过这个命令可以查到不属于任何主机组的主机
                  [devops@node1 ~]$ ansible ungrouped --list
                  hosts (1):
                  192.168.1.1

                  现在他被定义成了一个单个主机

                  主机组的嵌套

                  主机组的嵌套是什么呢?我们可以这样来想象,假设你现在管理2个机房的服务器,现在你需要对机房1的所有服务器进行软件升级,这个时候你怎么去选择机房1呢?我们可以通过主机嵌套来解决

                  copy
                    [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这个组就可以了

                    copy
                      [devops@node1 ~]$ ansible MachineRoom --list
                      hosts (3):
                      node1
                      node2
                      node3

                      选择主机和组

                      上面我们说到了定义主机和主机组,定义完了之后我们如何去选择呢?上面也提到了一些,选择我们来看如果更精准的选择

                      匹配主机

                      copy
                        # 或者执行ansible all --list-hosts是一样的
                        [devops@node1 ~]$ ansible all --list
                        hosts (4):
                        192.168.1.1
                        node1
                        node2
                        node3
                        1. 匹配指定的主机或组
                        copy
                          # 匹配单个主机
                          [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文件内容

                          copy
                            [devops@node1 ~]$ cat hosts
                            192.168.1.1
                            node1.example.com
                            node2.example.com
                            [webserver]
                            node1
                            node2
                            [sqlserver]
                            node2
                            node3

                            使用通配符匹配

                            copy
                              # 匹配所有以.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 (变更前与变更后的差异)

                              配置文件参数说明

                              copy
                                [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

                                这些配置我们一行行来看

                                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
                                copy
                                  echo "192.168.100.210 node1" >> /etc/hosts
                                  echo "192.168.100.220 node2" >> /etc/hosts

                                  需求,使用普通用户devops去操作主机,devops使用密钥验证,可以免密提权到root

                                  1. 在节点上创建一个普通用户devops,并设置密码123

                                  copy
                                    [root@node1 ~]# useradd devops
                                    [root@node1 ~]# echo 123|passwd --stdin devops
                                    [root@kvm ~]# useradd devops
                                    [root@kvm ~]# echo 123|passwd --stdin devops

                                    2. 配置sudo提权

                                    copy
                                      [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. 配置管理节点免密登录到被管节点

                                      copy
                                        [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. 配置

                                        copy
                                          # 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. 写主机清单

                                          copy
                                            [devops@node1 ansible]$ cat hosts
                                            node1
                                            node2

                                            6. 验证配置是否生效

                                            copy
                                              [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的基本配置了

                                              本文作者:FuShudi

                                              本文链接:https://www.cnblogs.com/fsdstudy/p/18030956

                                              版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

                                            • 相关阅读:
                                              【OpenCV】- 分水岭算法
                                              java计算机毕业设计网上书店进销存管理系统源码+数据库+系统+lw文档+mybatis+运行部署
                                              QT+OSG/osgEarth编译之三十八:gdal+Qt编译(一套代码、一套框架,跨平台编译,版本:gdal-3.6.0)
                                              “威胁”员工全来上班后,马斯克“尴尬”了:车没地停、工位不够坐、Wi-Fi 还太差
                                              Learning From Documents in the Wild to Improve Document Unwarping论文学习笔记
                                              Hproxy项目前端
                                              SpringBoot项目基础设施搭建
                                              开源工业软件:SCADA系统开源
                                              Vuex快速入门
                                              POJ 1328 简单贪心算法
                                            • 原文地址:https://www.cnblogs.com/fsdstudy/p/18030956