• ansible 批量安装zabbix-agent


    服务器初始化(这是在建立在新的服务器基础上做的初始化)关闭防火墙、selinux,添加epel常用源,安装常用工具、添加普通用户并禁止root

     1、服务器批量初始化

    [root@fwd ansible]# cat init.yml  系统初始化脚本
    ---
    - hosts: all
    
      tasks: 
        - name: disable selinux、firewalls,replace ali sources
          shell: |
            sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
            systemctl disable firewalld
            mkdir -p /etc/yum.repos.d/backup
            mv /etc/yum.repos.d/* /etc/yum.repos.d/backup/
            curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
    
        - name: ensure a list of packages installed
          yum:
            name: "{{ packages }}"
          vars:
            packages:
            - wget
            - vim
            - sysstat
            - lrzsz
            - lsof
    
        - name: Add the user centos 
          user:
            name: centos 
            group: wheel
    
        - name:  disabled root remote login
          replace:
            path: /etc/ssh/sshd_config
            regexp: '#PermitRootLogin yes'
            replace: 'PermitRootLogin no'
            backup: yes
    
        - name: modify ssh port
          shell: sed -i '/^#Port/aPort 22201' /etc/ssh/sshd_config
    
        - name: restart ssh
          service:
            name: sshd
            state: restarted
    
        - name: Add epel and reboot server
          shell: |
            reboot
    

     2、检测语法

    [root@fwd ansible]# ansible-playbook -C init.yml 
    
    PLAY [all] *******************************************************************************************************************************************************************************************************************************************************************
    
    TASK [Gathering Facts] *******************************************************************************************************************************************************************************************************************************************************
    ok: [192.168.9.22]
    ok: [192.168.9.14]
    ok: [192.168.9.132]
    
    TASK [disable selinux、firewalls,replace ali sources] *************************************************************************************************************************************************************************************************************************
    skipping: [192.168.9.132]
    skipping: [192.168.9.14]
    skipping: [192.168.9.22]
    
    TASK [ensure a list of packages installed] ***********************************************************************************************************************************************************************************************************************************
    changed: [192.168.9.22]
    changed: [192.168.9.14]
    changed: [192.168.9.132]
    
    TASK [Add the user centos] ***************************************************************************************************************************************************************************************************************************************************
    changed: [192.168.9.22]
    changed: [192.168.9.132]
    changed: [192.168.9.14]
    
    TASK [disabled root remote login] ********************************************************************************************************************************************************************************************************************************************
    changed: [192.168.9.132]
    changed: [192.168.9.22]
    changed: [192.168.9.14]
    
    TASK [modify ssh port] *******************************************************************************************************************************************************************************************************************************************************
    skipping: [192.168.9.22]
    skipping: [192.168.9.132]
    skipping: [192.168.9.14]
    
    TASK [restart ssh] ***********************************************************************************************************************************************************************************************************************************************************
    changed: [192.168.9.22]
    changed: [192.168.9.132]
    changed: [192.168.9.14]
    
    TASK [Add epel and reboot server] ********************************************************************************************************************************************************************************************************************************************
    skipping: [192.168.9.22]
    skipping: [192.168.9.132]
    skipping: [192.168.9.14]
    
    PLAY RECAP *******************************************************************************************************************************************************************************************************************************************************************
    192.168.9.132              : ok=5    changed=4    unreachable=0    failed=0   
    192.168.9.14               : ok=5    changed=4    unreachable=0    failed=0   
    192.168.9.22               : ok=5    changed=4    unreachable=0    failed=0   
    

    3、mysql 安装,并创建zabbix 需要数据库

    [root@fwd ~]# wget http://repo.mysql.com/mysql-community-release-el7-5.noarch.rpm
    [root@fwd ~]# rpm -ivh mysql-community-release-el7-5.noarch.rpm
    [root@fwd ~]# yum install mysql-server
    Loaded plugins: fastestmirror
    Loading mirror speeds from cached hostfile
     * base: mirrors.aliyun.com
     * extras: mirrors.aliyun.com
     * updates: mirrors.aliyun.com
    mysql-connectors-community                                                                                   | 2.5 kB  00:00:00     
    mysql-tools-community                                                                                        | 2.5 kB  00:00:00     
    mysql56-community                                                                                            | 2.5 kB  00:00:00     
    (1/3): mysql-connectors-community/x86_64/primary_db                                                          |  41 kB  00:00:00     
    (2/3): mysql-tools-community/x86_64/primary_db                                                               |  58 kB  00:00:00     
    (3/3): mysql56-community/x86_64/primary_db                                                                   | 226 kB  00:00:00     
    Resolving Dependencies
    --> Running transaction check
    ---> Package Percona-Server-server-56.x86_64 0:5.6.43-rel84.3.el7 will be installed
    --> Processing Dependency: Percona-Server-client-56 for package: Percona-Server-server-56-5.6.43-rel84.3.el7.x86_64
    --> Processing Dependency: Percona-Server-shared-56 for package: Percona-Server-server-56-5.6.43-rel84.3.el7.x86_64
    --> Running transaction check
    ---> Package Percona-Server-client-56.x86_64 0:5.6.43-rel84.3.el7 will be installed
    ---> Package Percona-Server-shared-56.x86_64 0:5.6.43-rel84.3.el7 will be obsoleting
    ---> Package mariadb-libs.x86_64 1:5.5.60-1.el7_5 will be obsoleted
    --> Finished Dependency Resolution
    
    Dependencies Resolved
    
    ====================================================================================================================================
     Package                              Arch               Version                           Repository                          Size
    ====================================================================================================================================
    Installing:
     Percona-Server-server-56             x86_64             5.6.43-rel84.3.el7                percona-release-x86_64              18 M
     Percona-Server-shared-56             x86_64             5.6.43-rel84.3.el7                percona-release-x86_64             619 k
         replacing  mariadb-libs.x86_64 1:5.5.60-1.el7_5
    Installing for dependencies:
     Percona-Server-client-56             x86_64             5.6.43-rel84.3.el7                percona-release-x86_64             5.5 M
    
    Transaction Summary
    ====================================================================================================================================
    Install  2 Packages (+1 Dependent package)
    
    Total size: 24 M
    Is this ok [y/d/N]: y
    Downloading packages:
    warning: /var/cache/yum/x86_64/7/percona-release-x86_64/packages/Percona-Server-client-56-5.6.43-rel84.3.el7.x86_64.rpm: Header V4 RSA/SHA256 Signature, key ID 8507efa5: NOKEY
    Retrieving key from file:///etc/pki/rpm-gpg/RPM-GPG-KEY-Percona
    
    
    The GPG keys listed for the "Percona-Release YUM repository - x86_64" repository are already installed but they are not correct for this package.
    Check that the correct key URLs are configured for this repository.
    
    
     Failing package is: Percona-Server-client-56-5.6.43-rel84.3.el7.x86_64
     GPG Keys are configured as: file:///etc/pki/rpm-gpg/RPM-GPG-KEY-Percon
     报错Percona-Release YUM存储库 -  x86_64”存储库列出的GPG密钥已经安装!
     解决办法如下:
    [root@fwd ~]# yum update percona-release 
    [root@fwd ~]# systemctl start mysqld
    

    3.1、修改mysql 密码 授权zabbix用户

    [root@fwd ~]# mysql_secure_installatio 
    [root@fwd ~]# mysqladmin -u root password "123456";  2中方法随意
    [root@fwd ~]# mysql -uroot -p
    Enter password:
    mysql> create database zabbix character set utf8 collate utf8_bin;
    mysql> grant all privileges on zabbix.* to zabbix@localhost identified by '123456';
    mysql> quit;  
    

    3.2、安装zabbix 4.0 server 添加zabbix 4.0 存储库, 并使用mysql 支持zabbix前端

    [root@fwd ~]# yum install -y https://repo.zabbix.com/zabbix/4.0/rhel/7/x86_64/zabbix-release-4.0-1.el7.noarch.rpm
    [root@fwd ~]# yum install -y zabbix-server-mysql zabbix-web-mysql zabbix-agent zabbix-get

    3.3、导入表结构

    [root@fwd ~]# zcat /usr/share/doc/zabbix-server-mysql*/create.sql.gz | mysql -uzabbix -p zabbix
    

    3.4、修改配置文件

    编辑 /etc/httpd/conf.d/zabbix.conf
    php_value date.timezone Europe/Riga  修改为 php_value date.timezone Asia/Shanghai
    编辑 /etc/zabbix/zabbix_server.conf
    DBPassword=123456
    

    3.5、开启服务,并设置开机自启

    [root@fwd ~]# systemctl restart zabbix-server zabbix-agent httpd
    [root@fwd ~]# systemctl enable zabbix-server zabbix-agent httpd
    

    4、批量部署zabbix-agent 客户端

    [root@fwd ansible]# pwd
    /etc/ansible
    [root@fwd ansible]# tree
    .
    ├── ansible.cfg
    ├── comon_site.retry
    ├── comon_site.yml
    ├── hosts
    ├── init.retry
    ├── init.yml
    ├── roles
    │   ├── common
    │   │   ├── defaults
    │   │   │   └── main.yml
    │   │   ├── files
    │   │   │   ├── common_id_rsa.pub
    │   │   │   ├── common_sshd_config
    │   │   │   └── common_sysctl.conf
    │   │   ├── handlers
    │   │   │   └── main.yml
    │   │   ├── tasks
    │   │   │   └── main.yml
    │   │   ├── templates
    │   │   │   ├── common_motd
    │   │   │   └── common_sshd_config
    │   │   └── vars
    │   │       └── main.yml
    │   └── zabbix_agent
    │       ├── files
    │       │   └── zabbix-agent-4.0.2-1.el7.x86_64.rpm
    │       ├── tasks
    │       │   └── main.yml
    │       └── templates
    │           └── zabbix_agentd.conf.j2
    

    4.1、查看hosts 文件  

    [root@fwd ansible]# cat hosts
    [james]
    192.168.9.22
    192.168.9.132
    192.168.9.14
    
    [root@fwd ansible]# cat zabbix_agent.yml   
    - hosts: all
      user: root
      vars:
         zabbix_serverip: 192.168.9.129 # zabbix 服务器IP
         zabbix_activeip: 192.168.9.129 # zabbix 服务器IP
         agent_hostname: '{{ ansible_hostname }}' # 客户端hostname
         agent_ip: '{{ ansible_ens33.ipv4.address }}' # 客户端IP 根据实际情况修改自己的网卡名字ens33 改成自己服务器
      roles:
        - zabbix_agent
    

    4.2、在/etc/ansible/roles/zabbix_agent/ 创建tasks 目录 添加 main.yml 文件

    [root@fwd tasks]# cat main.yml   # 这里写的是zabbix-agent 安装剧本
    - name: copy zabbix_agentd 
      copy: src=/etc/ansible/roles/zabbix_agent/files/zabbix-agent-4.0.2-1.el7.x86_64.rpm dest=/usr/local/src/zabbix-agent-4.0.2-1.el7.x86_64.rpm
    - name: install zabbix-agend
      shell: rpm -ivh /usr/local/src/zabbix-agent-4.0.2-1.el7.x86_64.rpm # 安装zabbix agentd
    - name: up zabbix-agent file client  # 上传配置文件
      template: src=zabbix_agentd.conf.j2 dest=/etc/zabbix/zabbix_agentd.conf
    - name: enabled service zabbix-agent # 打开zabbix-agent 开机启动
      service: name=zabbix-agent enabled=yes
    - name: start  service zabbix-agent # 启动zabbix-agent
      service: name=zabbix-agent  state=started
    

    4.3、在/etc/ansible/roles/zabbix_agent/ 下创建 templates 文件,定义zabbix_agent.conf .js模板文件

    [root@fwd templates]# cat zabbix_agentd.conf.j2 
    PidFile=/var/run/zabbix/zabbix_agentd.pid
    LogFile=/var/log/zabbix/zabbix_agentd.log
    EnableRemoteCommands=1  #远程执行命令的选项
    Server={{zabbix_serverip}} #自定义server IP 变量
    ListenPort=10050
    ServerActive={{zabbix_activeip}}
    Hostname={{ansible_hostname}}  #自定义主机名变量
    AllowRoot=1
    UnsafeUserParameters=1   #设置为1 表示允许用户自定义key值
    HostMetadataItem=system.uname
    Include=/etc/zabbix/zabbix_agentd.d/*.confgather_facts: false
    

    5、执行批量安装  

    [root@fwd ansible]# ansible-playbook zabbix_agent.yml 
    
    PLAY [all] *************************************************************************************************************************
    
    TASK [Gathering Facts] *************************************************************************************************************
    ok: [192.168.9.22]
    ok: [192.168.9.14]
    ok: [192.168.9.132]
    
    TASK [zabbix_agent : copy zabbix_agentd] *******************************************************************************************
    changed: [192.168.9.132]
    changed: [192.168.9.22]
    changed: [192.168.9.14]
    
    TASK [zabbix_agent : install zabbix-agend] *****************************************************************************************
    changed: [192.168.9.132]
    changed: [192.168.9.22]
    changed: [192.168.9.14]
    
    TASK [zabbix_agent : up zabbix-agent file client] **********************************************************************************
    changed: [192.168.9.22]
    changed: [192.168.9.132]
    changed: [192.168.9.14]
    
    TASK [zabbix_agent : enabled service zabbix-agent] *********************************************************************************
    changed: [192.168.9.132]
    changed: [192.168.9.22]
    changed: [192.168.9.14]
    
    TASK [zabbix_agent : start  service zabbix-agent] **********************************************************************************
    changed: [192.168.9.132]
    changed: [192.168.9.22]
    changed: [192.168.9.14]
    
    PLAY RECAP *************************************************************************************************************************
    192.168.9.132              : ok=6    changed=5    unreachable=0    failed=0   
    192.168.9.14               : ok=6    changed=5    unreachable=0    failed=0   
    192.168.9.22               : ok=6    changed=5    unreachable=0    failed=0 
    

    检查客户端zabbix_agent服务是否启动  

    [root@fwd ansible]# ansible james -m shell -a "ps -ef | grep zabbix_agent"
    192.168.9.132 | CHANGED | rc=0 >>
    root       9512      1  0 13:26 ?        00:00:00 /usr/sbin/zabbix_agentd -c /etc/zabbix/zabbix_agentd.conf
    root       9513   9512  0 13:26 ?        00:00:00 /usr/sbin/zabbix_agentd: collector [idle 1 sec]
    root       9514   9512  0 13:26 ?        00:00:00 /usr/sbin/zabbix_agentd: listener #1 [waiting for connection]
    root       9515   9512  0 13:26 ?        00:00:00 /usr/sbin/zabbix_agentd: listener #2 [waiting for connection]
    root       9516   9512  0 13:26 ?        00:00:00 /usr/sbin/zabbix_agentd: listener #3 [waiting for connection]
    root       9517   9512  0 13:26 ?        00:00:00 /usr/sbin/zabbix_agentd: active checks #1 [idle 1 sec]
    root       9566   9565  0 13:26 pts/0    00:00:00 /bin/sh -c ps -ef | grep zabbix_agent
    root       9568   9566  0 13:26 pts/0    00:00:00 grep zabbix_agent
    
    192.168.9.14 | CHANGED | rc=0 >>
    root       8847      1  0 13:26 ?        00:00:00 /usr/sbin/zabbix_agentd -c /etc/zabbix/zabbix_agentd.conf
    root       8848   8847  0 13:26 ?        00:00:00 /usr/sbin/zabbix_agentd: collector [idle 1 sec]
    root       8849   8847  0 13:26 ?        00:00:00 /usr/sbin/zabbix_agentd: listener #1 [waiting for connection]
    root       8850   8847  0 13:26 ?        00:00:00 /usr/sbin/zabbix_agentd: listener #2 [waiting for connection]
    root       8851   8847  0 13:26 ?        00:00:00 /usr/sbin/zabbix_agentd: listener #3 [waiting for connection]
    root       8852   8847  0 13:26 ?        00:00:00 /usr/sbin/zabbix_agentd: active checks #1 [idle 1 sec]
    root       8902   8901  0 13:26 pts/1    00:00:00 /bin/sh -c ps -ef | grep zabbix_agent
    root       8904   8902  0 13:26 pts/1    00:00:00 grep zabbix_agent
    
    192.168.9.22 | CHANGED | rc=0 >>
    root       8982      1  0 13:26 ?        00:00:00 /usr/sbin/zabbix_agentd -c /etc/zabbix/zabbix_agentd.conf
    root       8983   8982  0 13:26 ?        00:00:00 /usr/sbin/zabbix_agentd: collector [idle 1 sec]
    root       8984   8982  0 13:26 ?        00:00:00 /usr/sbin/zabbix_agentd: listener #1 [waiting for connection]
    root       8985   8982  0 13:26 ?        00:00:00 /usr/sbin/zabbix_agentd: listener #2 [waiting for connection]
    root       8986   8982  0 13:26 ?        00:00:00 /usr/sbin/zabbix_agentd: listener #3 [waiting for connection]
    root       8987   8982  0 13:26 ?        00:00:00 /usr/sbin/zabbix_agentd: active checks #1 [idle 1 sec]
    root       9037   9036  0 13:26 pts/1    00:00:00 /bin/sh -c ps -ef | grep zabbix_agent
    root       9039   9037  0 13:26 pts/1    00:00:00 grep zabbix_agent
    
    [root@fwd ansible]# ansible james -m shell -a "netstat -plunt"
    192.168.9.22 | CHANGED | rc=0 >>
    Active Internet connections (only servers)
    Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
    tcp        0      0 0.0.0.0:8080            0.0.0.0:*               LISTEN      6769/httpd          
    tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      7343/sshd           
    tcp        0      0 0.0.0.0:10050           0.0.0.0:*               LISTEN      8982/zabbix_agentd  
    tcp6       0      0 :::22                   :::*                    LISTEN      7343/sshd           
    tcp6       0      0 :::10050                :::*                    LISTEN      8982/zabbix_agentd  
    
    192.168.9.132 | CHANGED | rc=0 >>
    Active Internet connections (only servers)
    Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
    tcp        0      0 0.0.0.0:8080            0.0.0.0:*               LISTEN      6865/httpd          
    tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      7826/sshd           
    tcp        0      0 0.0.0.0:10050           0.0.0.0:*               LISTEN      9512/zabbix_agentd  
    tcp6       0      0 :::873                  :::*                    LISTEN      6869/xinetd         
    tcp6       0      0 :::22                   :::*                    LISTEN      7826/sshd           
    tcp6       0      0 :::10050                :::*                    LISTEN      9512/zabbix_agentd  
    udp        0      0 0.0.0.0:68              0.0.0.0:*                           7643/dhclient       
    
    192.168.9.14 | CHANGED | rc=0 >>
    Active Internet connections (only servers)
    Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
    tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      7245/sshd           
    tcp        0      0 0.0.0.0:10050           0.0.0.0:*               LISTEN      8847/zabbix_agentd  
    tcp6       0      0 :::22                   :::*                    LISTEN      7245/sshd           
    tcp6       0      0 :::10050                :::*                    LISTEN      8847/zabbix_agentd
    

     

    5.1、这里介绍下忘记zabbix 登录密码怎么办,因为我经常忘记 查看md5秘钥

    [root@fwd templates]# mysql -uroot -p -e "select * from zabbix.usersG"
    Enter password: 
    *************************** 1. row ***************************
            userid: 1
             alias: Admin
              name: Zabbix
           surname: Administrator
            passwd: 5fce1b3e34b520afeffb37ce08c7cd66
               url: 
         autologin: 1
        autologout: 0
              lang: en_GB
           refresh: 30s
              type: 3
             theme: default
    attempt_failed: 0
        attempt_ip: 
     attempt_clock: 0
     rows_per_page: 50
    *************************** 2. row ***************************
            userid: 2
             alias: guest
              name: 
           surname: 
            passwd: d41d8cd98f00b204e9800998ecf8427e
               url: 
         autologin: 0
        autologout: 15m
              lang: en_GB
           refresh: 30s
              type: 1
             theme: default
    attempt_failed: 0
        attempt_ip: 
     attempt_clock: 0
     rows_per_page: 50  
    [root@fwd templates]# mysql -uroot -p
    Enter password:
        mysql>use zabbix ;  进入到zabbix数据库
        mysql>update users set passwd='5fce1b3e34b520afeffb37ce08c7cd66' where userid='1';
        因为5fce1b3e34b520afeffb37ce08c7cd66 = zabbix  你现在就可以用 Admin zabbix 登录了~
    

    6、zabbix自动发现,自动添加(我们批量安装zabbix_agent的目的就是因为以后服务器越来越多,面对越来越多的服务器,我们一台一台添加明显有点不现实!所以就要用到zabbix的自动发现登录zabbix http://localhost/zabbix)  

    6.1、配置自动发现规则

    6.2、配置-动作-触发器-创建动作

    6.3、配置完毕,几分钟后zabbix--监控中--自动发现

    6.4、自动注册 配置-动作-自动注册

    更新过后,刷新就会发现发现的主机已经自动添加了

    报错主机无法被监控是因为我客户端防火墙开启了,没对外开放10050端口,给防火墙添加条规则就可以

    [root@proxy-01 network-scripts]# cat /etc/sysconfig/iptables
    # sample configuration for iptables service
    # you can edit this manually or use system-config-firewall
    # please do not ask us to add additional ports/services to this default configuration
    *filter
    :INPUT ACCEPT [0:0]
    :FORWARD ACCEPT [0:0]
    :OUTPUT ACCEPT [0:0]
    -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
    -A INPUT -p icmp -j ACCEPT
    -A INPUT -i lo -j ACCEPT
    -A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
    -A INPUT -p tcp --dport 10050 -j ACCEPT   添加规则 对外开放10050端口
    -A INPUT -j REJECT --reject-with icmp-host-prohibited
    -A FORWARD -j REJECT --reject-with icmp-host-prohibited
    COMMIT
    [root@proxy-01 network-scripts]# systemctl restart iptables.service
    [root@proxy-01 network-scripts]# iptables -nvL
    Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
     pkts bytes target     prot opt in     out     source               destination         
       30  1980 ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0            state RELATED,ESTABLISHED
        0     0 ACCEPT     icmp --  *      *       0.0.0.0/0            0.0.0.0/0           
        0     0 ACCEPT     all  --  lo     *       0.0.0.0/0            0.0.0.0/0           
        0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            state NEW tcp dpt:22
        0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:10050
        0     0 REJECT     all  --  *      *       0.0.0.0/0            0.0.0.0/0            reject-with icmp-host-prohibited
    
    Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
     pkts bytes target     prot opt in     out     source               destination         
        0     0 REJECT     all  --  *      *       0.0.0.0/0            0.0.0.0/0            reject-with icmp-host-prohibited
    
    Chain OUTPUT (policy ACCEPT 16 packets, 1552 bytes)
     pkts bytes target     prot opt in     out     source               destination    
    

      

      

      

      

    作者:james

    -------------------------------------------

    个性签名:独学而无友,则孤陋而寡闻。做一个灵魂有趣的人!

    如果觉得这篇文章对你有小小的帮助的话,记得在右下角点个“推荐”哦,博主在此感谢!

  • 相关阅读:
    ASP.NET Core的Kestrel服务器(转载)
    ASP.NET Core MVC中的IActionFilter.OnActionExecuting方法,可以获取Controller的Action方法参数值
    SQL 中常用存储过程xp_cmdshell运行cmd命令 (转载)
    SQL Server数据库中外键强制约束的好处是什么,什么时候设置外键非强制约束?(转载)
    EF Core中如何取消跟踪DbContext中所有被跟踪的实体
    c# .NET开发邮件发送功能的全面教程(含邮件组件源码)
    jquery操作select(取值,设置选中) 基础
    Visiual Studio2012 CLR20r3问题
    关于同时查询父子名称的SQL查询语句的写法 id name parentId parentName .
    Linq to SQL Like Operator
  • 原文地址:https://www.cnblogs.com/jameslove/p/10927350.html
Copyright © 2020-2023  润新知