写在前面


  • 嗯,准备RHCA,学习整理这部分知识
  • 所谓自动化配置服务和网络接口,其实是使用Ansible配置
  • 关于Ansible的一些基本操作在RHCE一门课中有涉及。
  • 博文内容为对Ansible操作回顾:
    • Ansible的简单概述及环境配置的Demo
    • 使用Ansible自动化管理配置Service unit
    • 使用Ansiblerhel-system-roles.network角色来自动化配置网络接口
    • 阅读本文需要了解一些基本Ansible知识

傍晚时分,你坐在屋檐下,看着天慢慢地黑下去,心里寂寞而凄凉,感到自己的生命被剥夺了。当时我是个年轻人,但我害怕这样生活下去,衰老下去。在我看来,这是比死亡更可怕的事。--------王小波


利用Ansible我们可以实现服务和网络的自动化管理,试想如果有数十台机器搭集群,需要配置firewalldSElinuxNetworkManager,如果一台一台配就特别麻烦,而且是需要一个交互环境,即使刷脚本我们也需要一台一台远程去看状态,但是使用Ansible就很方便。

Ansible 简述

Ansible概念和架构

Ansible是一款简洁、高效的运维自动化工具。基于Python开发,集合了众多运维工具(puppet、cfengine、chef、func、fabric)的优点,只需要将ansible安装在主控机器上,就可以通过SSH协议实现针对大量受管服务器批量化、剧本化的管理。通过Ansible实现远程控制,,实现了批量系统配置、批量程序部署、批量运行命令等功能。

ansible是基于模块工作的,本身没有批量自动化的能力。真正具有批量自动化的是ansible所运行的模块,ansible只是提供一种框架。

为了方便复杂任务(包含大批量任务操作、模板、变量等资源)的重复使用,降低playbook剧本编写难度,ansible提出角色的概念,所谓角色就是预先定义好的一套目录结构。针对每一个角色,ansible会到固定的目录去调取特定的数据,使用角色时不指定hosts: 清单主机列表,而是交给调用此角色的剧本来指定.

下面我们来看一个ansible的demo

Ansible Demo

Ansible需要配置控制节点到受管节点SSH免密root提权,这里我们已经配置好测试下

┌──[root@control]-[~/web]
└─$ssh node1 sudo id
uid=0(root) gid=0(root) groups=0(root) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023

对于Ansible的所有配置,命令操作,都是在一个指定文件夹下进行的,Ansible在执行临时命令或者剧本时会扫描当前工作目录,满足要求才会执行,否则会发出警告。新建ansible目录,编写主机清单inventory,主机清单用于指定要控制的主机

inventory:指定操作的主机,是一个配置文件里面定义监控的主机,可以是域名,IP。同时支持分组,表达式等高级特性

┌──[root@control]-[~]
└─$mkdir web;cd web
┌──[root@control]-[~/web]
└─$touch inventory
┌──[root@control]-[~/web]
└─$cat > inventory << EOF
> [webs]
> node1
> EOF
┌──[root@control]-[~/web]
└─$

当前目录编写ansible配置文件,用于指定主机清单文件,连接受管机器的远程的用户名,用户的su 提权等

┌──[root@control]-[~/web]
└─$ls
ansible.cfg  inventory
┌──[root@control]-[~/web]
└─$cat ansible.cfg
[defaults]
# 主机清单文件,就是要控制的主机列表
inventory=inventory
# 连接受管机器的远程的用户名
remote_user=root
# 角色目录
roles_path=roles
# 设置用户的su 提权
[privilege_escalation]
become=True
become_method=sudo
become_user=root
become_ask_pass=False

ping 受控节点测试:管控到受控的ping命令测试

┌──[root@control]-[~/web]
└─$ansible webs -m ping
node1 | SUCCESS => {"ansible_facts": {"discovered_interpreter_python": "/usr/libexec/platform-python"},"changed": false,"ping": "pong"
}

只需要几步,我们就通过control来控制node1机器,当然上面我们省略了ansible装包,配置SSH免密、sudo提权。

上面的命令相当于在Control机器ping node1机器,-m指定模块,默认为command模块

┌──[root@control]-[~/web]
└─$ping node1

剧本实现服务自动化配置

利用Ansible实现服务自动化管理,主要涉及模块:Servicesystemdservice_facts,下面我们看一个Demo

通过编写ploybook的方式,用yum、service、firewalld模块实现httpd服务的自动配置

编写剧本 vim deploy_book_web.yaml

- name: deploy web servershosts: webstasks:- name: install httpdyum:name: httpdstate: present- name: start and enable httpdservice:name: httpdstate: startedenabled: yes- name: set firewall to allow httpd servicefirewalld:service: httppermanent: yes #持久放行immediate: yes #立刻放行state: enabled- name: index.html writecopy:dest: /var/www/html/index.htmlcontent: "Hello Word !\n"

通过 ansible-playbook --syntax-check来检测剧本语法

┌──[root@control]-[~/web]
└─$ansible-playbook  deploy_book_web.yaml  --syntax-checkplaybook: deploy_book_web.yaml

通过 ansible-playbook 执行剧本

┌──[root@control]-[~/web]
└─$ansible-playbook deploy_book_web.yamlPLAY [deploy web servers] **********************************************************************************************TASK [Gathering Facts] *************************************************************************************************
ok: [node1]TASK [install httpd] ***************************************************************************************************
changed: [node1]TASK [start and enable httpd] ******************************************************************************************
changed: [node1]TASK [set firewall to allow httpd service] *****************************************************************************
changed: [node1]TASK [index.html write] ************************************************************************************************
changed: [node1]PLAY RECAP *************************************************************************************************************
node1                      : ok=4    changed=4    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

测试httpd服务

┌──[root@control]-[~/web]
└─$curl node1
Hello Word !
┌──[root@control]-[~/web]
└─$

服务自动化常用模块

软件管理模块(yum/dnf)yum/dnf 模块用于安装软件包,常用参数

  • name:软件名、软件名-版本号、逗号分隔的列表、@组名、*通配符
  • state:present、absent,
  • list:软件名、installed、available
- name: install the nginx rpm from a remote repoyum:name: http://nginx.org/packages/centos/6/noarch/RPMS/nginx-release-centos-6-0.el6.ngx.n>state: present- name: install nginx rpm from a local fileyum:name: /usr/local/src/nginx-release-centos-6-0.el6.ngx.noarch.rpmstate: present- name: install the 'Development tools' package groupyum:name: "@Development tools"state: present

安全控制模块(firewalld):用于管理配置Linux防火墙服务 firewalld,常用参数:

  • permanent(永久开启)
  • port(端口)
  • service(服务)、
  • source(源端)
  • state(状态)
  • immediate(立即生效)
- firewalld:service: httpspermanent: yesstate: enabled
- name: Redirect port 443 to 8443 with Rich Rulefirewalld:rich_rule: rule family=ipv4 forward-port port=443 protocol=tcp to-port=8443zone: publicpermanent: yesimmediate: yesstate: enabled

服务控制模块(service/systemd)代替systemctl 指令来控制服务的启动/停止/重启、开机自启动状态的设置

  • name=服务名 //指定系统服务名(必选参数)
  • state=“started|stoped|restarted|reloaded” //启动|停止|重启|重载服务
  • enable=“yes|no” //是否开机自启

service模块用于执行基本的系统服务管理

- name: Enable service httpd, and not touch the stateservice:name: httpdenabled: yes

systemd模块可以提供更多配置选项,例如daemon-reloadreload子命令重新加载的是当前service unit的配置文件daemon-reload子命令是重新加载 systemd 程序的配置文件。而所有的 unit 配置文件都是作为 systemd 程序的配置文件存在的。所以需要执行daemon-reload命令的时候

  • 新添加 unit 配置文件时需要执行 daemon-reload 子命令
  • 有 unit 的配置文件发生变化时也需要执行 daemon-reload 子命令
- name: reload service httpd, in all casessystemd:name: httpdstate: reloaded
- name: just force systemd to reread configs (2.4 and above)systemd:daemon_reload: yes

service_facts模块:对于服务模块来讲,还可以通过service_facts模块收集有关系统上服务的信息,并将该信息存储在ansible_facts[services]变量中。

- name: populate service factsservice_facts:- debug:var: ansible_facts.services- name: serviers factshosts: webstasks:- name:  collect service status factsservice_facts:- name: display whether NetworkManager is runningdebug:var: ansible_facts['services']['NetworkManager.service']['state']

通过service_facts模块查看NetworkManager服务运行状态为running

┌──[root@control]-[~/web]
└─$vim service_facts.yaml
┌──[root@control]-[~/web]
└─$ansible-playbook service_facts.yaml  --syntax-checkplaybook: service_facts.yaml
┌──[root@control]-[~/web]
└─$ansible-playbook  service_facts.yaml
.......
TASK [display whether NetworkManager is running] ***********************************************************************
ok: [node1] => {"ansible_facts['services']['NetworkManager.service']['state']": "running"
}
........

角色实现网络自动化配置

使用ansible配置不但可以通过剧本的方式,也可以通过角色的方式来配置,自RHEL7.4开始,操作系统随附了多个Ansible角色,由rhel-system-roles软包提供。在RHEL8中,该软件包可从AppStream频道获取。系统角色的目的是标准化配置版本6.10及以上的任何RHEL主机RHEL系统角色来源于开源Ansible GalaxyLinux System Role项目。

系统角色默认安装在/usr/share/ansible/roles目录,Ansible可以直接引用这些角色。一般通过拷贝的方法,使用ansible配置网络常用模块network_connections来配置。对应的角色包为rhel-system-roles.network

下面我们使用角色rhel-system-roles.network,以及角色中network_connections变量配置网络。角色的执行,首先需要拷贝对应的角色包当前角色目录下,然后编写需要替换的变量文件(即tasks/main.yml中的变量),我们可以在host_vars主机变量文件夹下编写,之前需要编写执行角色的剧本。

角色环境配置

┌──[root@workstation.lab.example.com]-[~]
└─$dnf  list rhel-system-roles
Last metadata expiration check: 0:00:58 ago on Thu 14 Apr 2022 11:42:34 PM CST.
Available Packages
rhel-system-roles.noarch                       1.0-9.el8                       rhel-8.1-for-x86_64-appstream-rpms
┌──[root@workstation.lab.example.com]-[~]
└─$dnf -y install rhel-system-roles.noarch
Last metadata expiration check: 0:01:15 ago on Thu 14 Apr 2022 11:42:34 PM CST.
......

查看预先设置好的角色包位置。

┌──[root@workstation.lab.example.com]-[~]
└─$ansible-galaxy list
# /usr/share/ansible/roles
- linux-system-roles.kdump, (unknown version)
- linux-system-roles.network, (unknown version)
.......
┌──[root@workstation.lab.example.com]-[~]
└─$

拷贝角色到当前的roles目录下

┌──[root@workstation.lab.example.com]-[~/web]
└─$mkdir roles
┌──[root@workstation.lab.example.com]-[~/web]
└─$ansible-galaxy  list
# /root/web/roles
┌──[root@workstation.lab.example.com]-[~/web]
└─$cp -r  /usr/share/ansible/roles/rhel-system-roles.network/ roles/network
┌──[root@workstation.lab.example.com]-[~/web]
└─$cd roles/network/
┌──[root@workstation.lab.example.com]-[~/web/roles/network]
└─$ls
defaults  library  LICENSE  meta  module_utils  pylintrc  README.html  README.md  tasks  tests  tox.ini
┌──[root@workstation.lab.example.com]-[~/web/roles/network]
└─$

查看当前目录的ansible环境拥有的角色

┌──[root@workstation.lab.example.com]-[~/web]
└─$ansible-galaxy list
# /root/web/roles
- network, (unknown version)
┌──[root@workstation.lab.example.com]-[~/web]
└─$

查看network角色执行的任务剧本,这是一个写好的模板,我们配置网络只需要在文件中定向最下面的network_connections变量即可

┌──[root@workstation.lab.example.com]-[~/web]
└─$cat roles/network/tasks/main.yml
# SPDX-License-Identifier: BSD-3-Clause
# get service facts, used in defaults/main.yml
---
- name: Check which services are runningservice_facts:no_log: true# needed for ansible_facts.packages
- name: Check which packages are installedpackage_facts:no_log: true- name: Print network providerdebug:msg: "Using network provider: {{ network_provider }}"# Depending on the plugins, checking installed packages might be slow
# for example subscription manager might slow this down
# Therefore install packages only when rpm does not find them
- name: Install packagespackage:name: "{{ network_packages }}"state: presentwhen:- not network_packages is subset(ansible_facts.packages.keys())- name: Enable and start NetworkManagerservice:name: "{{ network_service_name }}"state: startedenabled: truewhen:- network_provider == "nm"- name: Enable network serviceservice:name: "{{ network_service_name }}"enabled: truewhen:- network_provider == "initscripts"- name: Ensure initscripts network file dependency is presentcopy:dest: /etc/sysconfig/networkcontent: "# Created by network system role"force: falsewhen:- network_provider == "initscripts"- name: Configure networking connection profilesnetwork_connections:provider: "{{ network_provider | mandatory }}"ignore_errors: "{{ network_ignore_errors | default(omit) }}"force_state_change: "{{ network_force_state_change | default(omit) }}"connections: "{{ network_connections | default([]) }}"- name: Re-test connectivityping:
┌──[root@workstation.lab.example.com]-[~/web]
└─$

编写变量文件

host_vars文件夹下定义变量

┌──[root@workstation.lab.example.com]-[~/web]
└─$mkdir host_vars;cd host_vars

定义一个静态IP的网络接口配置的变量文件

┌──[root@workstation.lab.example.com]-[~/web]
└─$cat host_vars/servera.yaml

通过network_connections还可以配置网桥,VLAN等其他的一些配置,更多见附录

---
network_connections:- name: ethO-statictype: ethernetinterface_name: eth0persistent_state: presentautoconnect: yes #自动连接state: upip:address:- 172.25.250.10/24- 172.25.254.10/24gateway4: 172.25.250.254dns:- 172.25.250.254- 172.25.254.254dns_search:- lab.example.com- example.com

通过debug模块来测试变量

┌──[root@workstation.lab.example.com]-[~/web]
└─$ansible servera -m debug -a 'var=network_connections'
servera | SUCCESS => {"network_connections": [{"autoconnect": true,"interface_name": "eth0","ip": {"address": ["172.25.250.10/24","172.25.254.10/24"],"dns": ["172.25.250.254","172.25.254.254"],"dns_search": ["lab.example.com","example.com"],"gateway4": "172.25.250.254"},"name": "ethO-static","persistent_state": "present","state": "up","type": "ethernet"}]
}

编写执行角色剧本

┌──[root@workstation.lab.example.com]-[~/web]
└─$vim config_network.yaml
┌──[root@workstation.lab.example.com]-[~/web]
└─$cat config_network.yaml
---
- name: config eth0 on serveahosts: servararoles:- network

查看原本的eth0接口配置

┌──[root@workstation.lab.example.com]-[~/web]
└─$ansible servera -m shell -a "ip addr show eth0"
servera | CHANGED | rc=0 >>
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000link/ether 52:54:00:00:fa:0a brd ff:ff:ff:ff:ff:ffinet 172.25.250.10/24 brd 172.25.250.255 scope global noprefixroute eth0valid_lft forever preferred_lft foreverinet6 fe80::984:87d2:dba7:1007/64 scope link noprefixroutevalid_lft forever preferred_lft forever

执行剧本

┌──[root@workstation.lab.example.com]-[~/web]
└─$ansible-playbook config_network.yaml

查看执行之后的网络状态

┌──[root@workstation.lab.example.com]-[~/web]
└─$ansible servera -m shell -a "ip addr show eth0"
servera | CHANGED | rc=0 >>
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000link/ether 52:54:00:00:fa:0a brd ff:ff:ff:ff:ff:ffinet 172.25.250.10/24 brd 172.25.250.255 scope global noprefixroute eth0valid_lft forever preferred_lft foreverinet 172.25.254.10/24 brd 172.25.254.255 scope global noprefixroute eth0valid_lft forever preferred_lft foreverinet6 fe80::e88f:e7dd:6595:4edf/64 scope link noprefixroutevalid_lft forever preferred_lft forever

ipv4的地址信息

┌──[root@workstation.lab.example.com]-[~/web]
└─$ansible servera -m setup -a "filter=ansible_all_ipv4_addresses"
servera | SUCCESS => {"ansible_facts": {"ansible_all_ipv4_addresses": ["172.25.250.10","172.25.254.10"],"discovered_interpreter_python": "/usr/libexec/platform-python"},"changed": false
}

dns信息

┌──[root@workstation.lab.example.com]-[~/web]
└─$ansible servera -m setup -a "filter=ansible_dns"
servera | SUCCESS => {"ansible_facts": {"ansible_dns": {"nameservers": ["172.25.250.254","172.25.254.254"],"search": ["lab.example.com","example.com"]},"discovered_interpreter_python": "/usr/libexec/platform-python"},"changed": false
}

Ansible facts

我们上面使用setup模块,这里简单介绍下,Ansible使用facts向控制节点检索有关受管主机配置的信息。一般叫系统变量,或者系统指标。通过变量,我们可以查看系统的一些详细信息,剧本的信息的收集是通过gather_facts=yes自动搜集,临时命令调用setup模块,剧本默认会调用。

# ansible  清单主机  -m  setup  [-a  'filter=系统指标名']
┌──[root@workstation.lab.example.com]-[~/web]
└─$ansible servera -m setup -a "filter=ansible_all_ipv4_addresses"

常见的网络方面的系统变量

网络相关系统指标 网络相关系统指标
ansible_interfaces ansible_all_ipv4_addresses
ansible_domain ansible_all_ipv6_addresses
ansible_interfacename ansible_default_ipv4
ansible_eth0.active ansible_default_ipv4.address
ansible_eth0.device ansible default ipv4.interface
ansible_eth0.features ansible_default_ipv4.gateway
ansible_eth0.ipv4 ansible_default_ipv4.netmask
ansible_eth0.ipv6 ansible_default_ipv4.type
ansible eth0.macaddress ansible_default_ipv6
ansible_fqdn ansible_dns
ansible_hostname ansible_dns.nameservers

facts应用

如果我们知道网络端口的MAC地址,使用Ansible来检索该接口的名称。

- name: Identify and print specific interfacehosts: serveravars:target_mac: "52:54:00:00:fa:0a"tasks:- name: Find the_interface for target_macset_fact: #定义变量the_interface: "{{item}}"when:- ansible_facts[item]['macaddress'] is defined- ansible_facts[item]['macaddress']==target_macloop: "{{ansible_facts['interfaces']}}"- name: Display the_interfacedebug:var: the_interfacevar: ansible_{{the_interface}}

附录

下面是一些网络配置角色帮助文档中的一些Demo

多次设置相同的连接配置文件:

network_connections:- name: Wired0type: ethernetinterface_name: eth0ip:dhcp4: yes- name: Wired0state: up

激活一个已存在的连接配置文件

network_connections:- name: eth0state: up

取消激活一个已存在的连接配置文件:

network_connections:- name: eth0state: down

创建持久连接配置文件:

network_connections:- name: eth0#persistent_state: present  # defaulttype: ethernetautoconnect: yesmac: 00:00:5e:00:53:5dip:dhcp4: yes

删除一个名为“eth0”的连接配置文件(如果它存在):

network_connections:- name: eth0persistent_state: absent

配置Ethernet链路:

network_connections:- name: eth0type: ethernetethernet:autoneg: nospeed: 1000duplex: full

创建网桥连接:

network_connections:- name: br0type: bridge#interface_name: br0  # defaults to the connection name

配置网桥连接:

network_connections:- name: internal-br0interface_name: br0type: bridgeip:dhcp4: noauto6: no

设置 masterslave_type:

network_connections:- name: br0-bond0type: bondinterface_name: bond0master: internal-br0slave_type: bridge- name: br0-bond0-eth1type: ethernetinterface_name: eth1master: br0-bond0slave_type: bond

配置 VLAN:

network_connections:- name: eth1-profileautoconnet: notype: ethernetinterface_name: eth1ip:dhcp4: noauto6: no- name: eth1.6autoconnect: notype: vlanparent: eth1-profilevlan:id: 6ip:address:- 192.0.2.5/24auto6: no

Configuring MACVLAN:

network_connections:- name: eth0-profiletype: ethernetinterface_name: eth0ip:address:- 192.168.0.1/24- name: veth0type: macvlanparent: eth0-profilemacvlan:mode: bridgepromiscuous: yestap: noip:address:- 192.168.1.1/24

设置IP配置:

network_connections:- name: eth0type: ethernetip:route_metric4: 100dhcp4: no#dhcp4_send_hostname: nogateway4: 192.0.2.1dns:- 192.0.2.2- 198.51.100.5dns_search:- example.com- subdomain.example.comroute_metric6: -1auto6: nogateway6: 2001:db8::1address:- 192.0.2.3/24- 198.51.100.3/26- 2001:db8::80/7route:- network: 198.51.100.128prefix: 26gateway: 198.51.100.1metric: 2- network: 198.51.100.64prefix: 26gateway: 198.51.100.6metric: 4route_append_only: norule_append_only: yes

动态IP配置

network_connections:- name: enp2s0-dhcptype: ethernet  #网卡类型interface_name: enp2s0 #网卡persistent_state: present #持久化配置zone: external #防火墙位置ip:dhcp4: yes #IP自动获取auto6: no  #ipv6关闭ethernet:autoneg: no #不协商speed: 1000 #千兆duplex: full ##全双工

静态IP配置

network _connections:- name: ethO-static type: ethernet interface_name: eth0persistent_state: presentautoconnect: yes #自动连接state: up ip: address:- 172.25.250.10/24- 172.25.254.10/24gateway4: 172.25.250.254dns:- 172.25.250.254- 172.25.254.254dns_search:- lab.example.com- example.com

关于Linux中自动化配置服务和网络接口的一些笔记相关推荐

  1. 关于Linux中批量配置SSH免密的一些笔记

    写在前面 今天和小伙伴们分享批量配置SSH免密的一些笔记 传统的运维场景可以通过Ansible 等运维工具处理 在安装使用一些运维工具,比如Ansible,或则一些pass组件,需要配置ssh免密,s ...

  2. Linux中阶—域名解析服务DNS(十)

    全局配置文件:/etc/named.conf //单行注释类型 /*   多行注释 */ //声明控制通道 key "rndc-key" {         algorithm h ...

  3. linux vnc 改端口号,基于Linux中vnc配置端口号的修改方法

    vnc的默认端口是自己配置的,并不是这有一个端口号. 通过打开/etc/sysconfig/vncservers. 这里就配置了2个桌面,一个桌面号是1, 一个是2. 这里的配置的参数 VNCSERV ...

  4. linux中有关于dhcp的选择题,未指定试题(2014-11-18):DHCP协议的功能是(1)。在Linux中提供DHCP服务的...

    试题分类:未指定 DHCP协议的功能是 (1) .在Linux中提供DHCP服务的程序是 (2) :DHCP服务将主机的MAC地址和IP地址绑定在一起的方法是在 (3) 文件中添加"host ...

  5. linux dhcp 绑定mac地址,●DHCP协议的功能是 (58) 。在Linux中提供DHCP服务的程序是 (59) ;DHCP服务将主机的MAC地址和IP地 - 赏学吧...

    ●DHCP协议的功能是 (58) .在Linux中提供DHCP服务的程序是 (59) :DHCP服务将主机的MAC地址和IP地址绑定在一起的方法是在 (60) 文件中添加"host主机名{h ...

  6. Linux中阶—文件服务vsftpd (九)

    vsftpd服务安装: yum -y install vsftpd* yum -y install pam* libdb -utils libdb* --skip-broken 软件结构如下: ​ ​ ...

  7. ssh 配置:在 Linux 中 ssh 配置无密码登陆完整步骤以及易错点分析

    文章目录 前言 一.什么是 SSH? 二.ssh 配置无密码登陆原理 三.Linux 系统上生成 SSH 密钥和公钥 四.登录验证 总结 前言 对于 Hadoop 的伪分布式和全分布式而言,Hadoo ...

  8. Linux中安装配置jdk

    Linux中安装配置jdk 一.下载与解压jdk 二.配置环境变量 三.查看安装是否成功 一.下载与解压jdk #进入/usr/local 建立jdk目录 cd /usr/local mkdir jd ...

  9. linux中安装配置golang开发环境

    linux中安装配置golang开发环境 不要误以为linux配置环境很难,其实也不一定.可能更简单[windows 安装后安装程序给你配一半,你再配置,可能还出问题,先删除软件给你配的,再自己配置. ...

最新文章

  1. vectorvectorint 二维容器编程
  2. boost::math::quadrature::naive_monte_carlo用法的测试程序
  3. 吉林大学c语言考试题库,吉林大学C语言题库.docx
  4. Java将五个整数存入整形数组_异常处理:从命令行输入5个整数,放入一整型数组,然后打印输出。。。...
  5. 文本挖掘预处理之TF-IDF
  6. VDI序曲十四 使用 RemoteFX 安装和配置 USB 重定向
  7. fragment中嵌套viewpager,vierpager中用fragment不显示数据
  8. 转:关于Apache与Nginx的优势比较(经典)
  9. 精选| 2019年3月R新包推荐
  10. 用计算机计算的结构图怎么画,冯·诺依曼计算机结构图解析
  11. unity shader shaderLab 手册
  12. C# 解析种子文件(bt文件)
  13. Balsamiq 介绍
  14. 5 个有效好用的恢复文件和照片的 Android恢复软件推荐
  15. 产品读书《六顶思考帽》
  16. 直插电阻通过色环读取电阻阻值,误差与温度系数方法总结
  17. Linux进程间通信(五)——进程间通信
  18. 中级经济师人力资源专业
  19. 【硬件】常见芯片封装技术
  20. 【开箱即用】vk-unicloud-admin-快速开发框架-打造unicloud最好用的admin

热门文章

  1. php实现店铺装修,php 实现店铺装修1
  2. 619300-53-7,DOTA-NOC,FC-2154,DOTA-NOC acetate,DOTA-[Nal3]-octreotide
  3. CodeForces 739C Alyona and towers
  4. ffmpeg给视频加黑边
  5. Qt编写安防视频监控系统64-子模块8飞行轨迹
  6. 好奇怪呀后面加什么标点_三年级语文提示语的标点练习(含答案)
  7. c语言结构体数组内存大小,如何为C语言的结构体数组分配/释放内存?
  8. 南非认证_南非2008年-圣诞前夕闪电风暴
  9. 中小企业信息化“四”字诀
  10. 学习Python的 第六天Day6, 今天你get了吗❤