草庐IT

Ansible自动化运维工具阐述及配置实现

51eA 2023-03-28 原文
什么是ansible

ansible是一个轻量级的运维管理工具 , 基于Python研发 。可实现对系统的批量管理配置、程序的批量部署、批量的运行命令等功能。 仅需在任意管理主机安装 ansible 程序即可实现批量管理被管控主机且被管控的主机无需客户端。 我们在安装ansible时一定要依托epel源来安装(推荐阿里云),并且在线用yum安装。它基于python开发所以得解决ansible对python编程的各种依赖。

ansible 特性

1、模块化:调用特定的模块,完成特定的任务; 
2、基于Python语言研发主要模块由Paramiko, PyYAML和Jinja2三个核心库实现; 
3、部署简单:agentless; 
4、支持自定义模块,使用任意编程语言; 
5、强大的playbook机制; 
6、具有幂等性;

ansible 基本架构

Modules:模块化 
Core Modules 核心模块 
Customed Modules 自定义模块 
Host Iventory 主机库清单,定义要管理的主机 
Files 可以通过配置文件来实现 
CMDB 也可以通过外部存储来实现 
PlayBooks 剧本,定义每个主机所扮演的角色 
Hosts 哪些主机 
Roles 哪些角色 
Connection Plugins:连接插件,主要连接各管控主机 
Email 
Loggin 
Other

注意,ansible不是服务!千万也不用去想服务的概念

安装及程序环境: 

程序: 
ansible 
ansible-playbook 
ansible-doc 
配置文件: 
/etc/ansible/ansible.cfg 
主机清单: 
/etc/ansible/hosts 
插件目录: 
/usr/share/ansible_plugins/ 

主机清单说明

vim /etc/ansible/hosts # Ex 1: Ungrouped hosts, specify before any group headers. 直接给出主机,IP主机名都可以 ## green.example.com ## blue.example.com ## 192.168.100.1 ## 192.168.100.10 # Ex 2: A collection of hosts belonging to the 'webservers' group 把几个主机分组,用中括号定义组名 ## [webservers] ## alpha.example.org ... ## 192.168.1.100 ... # If you have multiple hosts following a pattern you can specify 对主机进行通配001:006表示到一个范围 ## www[001:006].example.com  # Ex 3: A collection of database servers in the 'dbservers' group 定义一组数据库服务器 ## [dbservers] ## db02.intranet.mydomain.net ... ## 10.25.1.56 ...
基本使用入门,获取模块列表

ansible -doc -l 获取模块列表 ansible-doc -s MOD_NAME 获取指定模块帮助信息
以ping模块为例,测试

[root@localhost ~]# ansible webserver -m ping  //我是定义了webserver组 172.16.5.103 | UNREACHABLE! => {         "changed": false,          "msg": "Failed to connect to the host via ssh.",          "unreachable": true     }     172.16.5.102 | UNREACHABLE! => {         "changed": false,          "msg": "Failed to connect to the host via ssh.",          "unreachable": true     } 以上的测试结果提示没有通过ssh连接到主机,所以我们得配置基于ssh的公钥认证 因为ansible是基于ssh进行认证的 也可以这样:ansible all -m ping --ask-pass -c paramiko //你懂的
设置 SSH 公钥认证,并把生成的公钥拷贝到任意N个主机,实现无密码操作

在Ansible服务端生成密钥,并且复制公钥到节点中。 root@ansible ~]#ssh-keygen //一路回车,文件生成路径root/.ssh/ 使用ssh-copy-id命令来复制Ansible公钥到节点中。 ssh-copy-id -i root@172.16.5.102/103/105
以ping模块再次测试

[root@Centos6 ~]# ansible all -m ping 172.16.5.103 | SUCCESS => {     "changed": false,      "ping": "pong" } 172.16.5.102 | SUCCESS => {     "changed": false,      "ping": "pong" } 172.16.5.105 | SUCCESS => {     "changed": false,      "ping": "pong" } [root@Centos6 ~]#  ok成功......
常用模块举例说明1

常用模块: ping:探测目标主机是否存活;     举例: ansible all -m ping command:在远程主机执行命令;     举例:ansible all -m command -a "ifconfig"     举例:ansible all -m command -a "useradd centos" shell:在远程主机上调用shell解释器运行命令,支持shell的各种功能,如管道等     举例:ansible all -m shell -a "echo centos |passwd --stdin centos" copy:复制文件,给定内容生成文件,mode, owner, group,follow, ...     拷贝文件     举例:ansible all -m copy -a "src=/etc/fstab dest=/tmp/fstab.ansible mode=640"     生成文件     举例:ansible all -m copy -a "content='hell\nworld\n' dest=/tmp/fstab.ansible mode=640" file:设置文件属性     更改文件属主     举例:ansible all -m file -a "path=/tmp/fstab.ansible owner=centos"     删除文件     举例:ansible all -m file -a "path=/tmp/fstab.ansible state=absent"      state 用来定义目标文件状态的     创建指定文件空目录     举例:ansible all -m file -a "path=/tmp/dir.ansible state=directory"      链接文件     举例:ansible all -m file -a "path=/tmp/test.ansible.link src=/tmp/test.ansible      state=link"  fetch:从远程主机拉取一个文件     ansible是用来管理多节点的,从远程拉取多个文件到目标主机显然不近乎仁义。所以用scp就能搞定。略过
常用模块举例说明2

cron:用来管理crontab的周期性任务     定义一个任务     举例:ansible all -m cron -a "minute'*/5' job='/usr/sbin/ntpdate 10.1.0.1 &>/dev/null'           name='sync time'"          crontab -l      删除一个任务     举例:ansible all -m cron -a "name='sync time' state=absent"     只删除用ansible定义的名 hostname:定义主机名     举例: yum:使用yum包管理器,完成程序包管理      举例:ansible all -m yum -a "name=httpd" 安装     举例:ansible all -m yum -a "name=httpd state=absent" 删除 service:控制服务,控制服务是否开机自动启动     举例:ansible all -m service -a "name=httpd state=started enbaled=true"  group:添加或者删除组     举例: user:管理组账号     举例: setup:收集远程各主机的各种属性之和     举例:ansible all -m setup 以上内容就到这里,我们该定义一个剧本了
定义一个PlayBook,我们来唱剧本
playbook是由一个或多个”play”组成的列表。play的主要功能在于将事先归为一组的主机装扮成事先通过ansible中的task定义好的角色。从根本上来将,所谓的task无非是调用ansible的一个module。将多个paly组织在一个playbook中,即可以让他们联通起来按事先编排的机制同唱一台大戏。 
YAML是用来写配置文件的,接下来的配置文件都是以yaml为后缀

[root@Centos6 ~]# yum info PyYAML 核心元素:     Tasks:任务,由模块定义的操作的列表;     Variables:变量     Templates:模板,即使用了模板语法的文本文件;     Handlers:由特定条件触发的Tasks;     Roles:角色;自包含,有完整独立实体 playbook的基础组件:     Hosts:运行指定任务的目标主机,可多个;     remote_user:在远程主机以哪个用户身份执行;     sudo_user:非管理员需要拥有sudo权限;     tasks:给出任务列表,执行完一个,执行第二个          模块,模块参数:          格式:            (1) action: module arguments //任务执行过程             (2) module name: arguments //指定运行的模块
示例;利用playbook指挥三台主机都创建mygrp组

[root@Centos6 ~]# vim group.yaml  - hosts: all //任务运行在所有主机   remote_user: root //在远程主机以哪个用户执行   tasks: //任务列表1   - name: install a group //任务名     group: name=mygrp system=true //调用group模块创建组mygrp   - name: install a user //任务名     user: name=user1 group=mygrp system=true //创建user1 组mygrp - hosts: webserver //任务运行在webserver组内的主机   remote_user: root //在远程主机以哪个用户执行   tasks: //任务列表2    - name: install httpd package //任务名      yum: name=httpd //调用yum模块安装httpd    - name: start httpd service //任务名      service: name=httpd state=started //调用service模块启动服务     检查语法,测试运行 annsible-playbook --syntax-check group.yaml annsible-playbook --list-hosts --list-tasks group.yaml
示例;利用playbook指挥webserver组内主机安装httpd并监听8080端口

vim httpd.yaml - hosts: webserver   remote_user: root   tasks:   - name: install httpd package     yum: name=httpd state=latest     tags: installpkg //指明跑某个标签 -t installpkg   - name: install conf file     copy: src=/root/httpd.conf dest=/etc/httpd/conf/httpd.conf     tags: installconf //指明跑某个标签 -t installconf     notify: restart httpd service  通知给《===httpd   - name: start httpd service     service: name=httpd state=started   handlers: //处理器,也是任务,但是在一定条件下触发   - name: restart httpd service //handlers名字     service: name=httpd state=restarted 语法检查,测试运行 annsible-playbook --syntax-check  -t installconf  --list-tags httpd.yaml annsible-playbook --syntax-check httpd.yaml annsible-playbook --list-hosts --list-tasks httpd.yaml
注意: 
handlers:是指在一定条件下触发,指明在一个需要让别人重启服务才生效的任务上使用notify,通知一定是handlers名字 
tags:只执行playbook中指定的tags标签,满足部分需要,多个任务可指明一个同tags 
也可以一次调用两个标签,如下 
annsible-playbook -t installconf,installpkg httpd.yaml

自定义变量Variables,可自定义安装任意程序包

[root@Centos6 ~]# cat name.yaml  - hosts: webserver   remote_user: root   vars:    - pkgname: memcached //playbook中使用的变量Variables   tasks:   - name: install a package     yum: name=` pakgname ` state=present //自定义变量 [root@Centos6 ~]#  语法测试 ansible-playbook --syntax-check name.yaml  ansible-playbook -e pkgname=httpd/vsftpd/ name.yaml  注意:在执行时命令行中给出的值要优先于playbook内置变量 如:ansible-playbook -e pkgname=httpd name.yaml 检查:rpm -ql httpd memcached传递给主机单独变量,实现某些主机安装不同程序包

编辑主机清单在每个主机后面指定调用变量并赋值 vim /etc/ansible/hosts [webserver] 172.16.5.102 pkgname=nginx 172.16.5.103 pkgname=httpd [webserver:vars] //为一个组内不同主机定义相同变量,效果同上 webserver组内有一组变量vars,其中变量名是pkgname值是memcached pkgname=memcached vim name.yaml     - hosts: webserver       remote_user: root       tasks:       - name: install a package         yum: name=` pkgname ` state=present 语法测试 ansible-playbook --syntax-check name.yaml
Inventory还可以使用参数: 
用于定义ansible远程连接目标主机使用的属性,而非传递给playbook的变量 
如: [webserver] 
172.16.5.102 ansible_ssh_user= ansible_ssh_pass ansible_sudo_pass 
不再是传递给playbook变量,而是主机本身。

playbook模版

模版本身是文本文件,内部嵌套有模板语言脚本(使用模板语言编写jinjia2) 
Jinja2 是仿照 Django 模板的 Python 模板语言。 它速度快,被广泛使用,并且提供了可选的沙箱模板执行环境保证安全。只介绍简单使用,不过多阐述,语言啊 
jinjia2是用来写模版文件的,接下来的模版文件都是以j2为后缀

语法格式:     支持字面量:     字符串:使用单引号或双引号;      数字:整数、浮点数;     列表:[item1, item2, ...]     元组:(item1, item2, ...)     字典:{key1:value1, key2:value2, ...}     布尔型:true/false                   算术运算:+, -, *, /, //, %, **     比较操作:==, !=, >, <, >=, <=         逻辑运算:and, or, not基于模版把nginx配置文件对应的虚拟cpu值改成不是auto

安装nginx程序包,我们要使用nginx的配置文件当模版 
yum install nginx 
cp /etc/nginx/nginx.conf . 
vim nginx.conf 
worker_processes ` ansible_processor_vcpus `; //由auto改成这样 
vim nginx.yaml 
– hosts: webserver 
remote_user: root 
tasks: 
– name: copy a nginx file 
template: src=/root/nginx.conf dest=/tmp/nginx.conf 
语法测试 
ansible-playbook –syntax-check nginx.yaml

完整安装nginx程序,并调用nginx.conf.j2模版

vim nginx.yaml 
– hosts: nginxserver //指定组 
remote_user: root 
tasks: 
– name: install nginx package //安装nginx程序包 
yum: name=nginx state=latest //调用的yum模块 
– name: install conf file 
template: src=/root/nginx.conf.j2 dest=/etc/nginx.conf //调用的配置文件模版 
tags: ngxconf //标签 
notfiy: reload nginx service //通知让标签干什么 
– name: start nginx service 
service: name=nginx state=started enabled=true //启动服务,并开机启动 
handlers: //触发器,当某个条件满足时将触发,也是任务 
– name: reload nginx service 
shell: /usr/sbin/nginx -s reload 
语法测试 
ansible-playbook –syntax-check nginx.yaml

使用when条件判断语句,判断基于不同发行版使用不同命令来重启nginx服务

vim nginx2.yaml - hosts: all   remote_user: root   tasks: - name: install nginx package   yum: name=nginx state=latest - name: start nginx service on CentOS6   shell: service nginx start   when: ansible_distribution == "CentOS" and ansible_distribution_major_version == "6" - name: start nginx service   shell: systemctl start nginx.service   when: ansible_distribution == "CentOS" and ansible_distribution_major_version == "7" 语法测试 ansible-playbook --syntax-check nginx2.yaml基于字符串列表给出元素循环:迭代,需要重复执行的任务; 
对迭代项的引用,固定变量名为”item”,使用with_item属性给定要迭代的元素; 
元素列表有两种:字符串,字典

vim web.yaml - hosts: webserver   remote_user: root   tasks:   - name: install package     yum: name=` item ` state=latest     with_items:     - httpd     - php     - php-mysql     - php-mbstring     - php-gd 语法测试 ansible-playbook --syntax-check web.yaml基于字典列表给出元素循环:迭代,需要重复执行的任务; 
之前我们讲过我们要批量在组内的机器上创建用户是可以的。无非调用user模块并指明组就可以,但是在不同组内的机器上创建的,可能用户名与组名都是不相同的,那我们想要它都同样该怎么办呢? 
这个时候我们就可以通过固定变量item来实现 增加两条name,一个指明用户,一个指明组名

vim creat.yaml - hosts: webserver   remote_user: root   tasks:   - name: creat groups //第一个任务   yum: name=` item ` state=latest   with_items:   - groupx1   - groupx2   - groupx3   - name: creat users //第二个任务 user: name={{ item.name }} group={{ item.group }} state=present   with_items: //元素列表   - {name: 'userx1', group: 'groupx1'} //name键值队   - {name: 'userx1', group: 'groupx1'} //name键值队   - {name: 'userx1', group: 'groupx1'} //name键值队 语法测试:ansible-playbook --check creat.yaml 注释: item.name表示调用第一个键name里的值userx1 item.group表示调用第一个键group里的值groupx1

角色(自包含,按照目录结构来组织)

指定由哪些主机去对应的完成哪个已定义好的角色

roles是以特定的层级目录结构进行组织的tasks、variables、handlers、templates… 
role_name/ 
files/: 
存储由copy或script等模块调用的文件; 
tasks/: 
此目录中至少应该有一个名为main.yml的文件,用于定义各task;其它的文件需要由main.yml进行“包含”调用; 
handlers/: 
此目录中至少应该有一个名为main.yml的文件,用于定义各handler;其它的文件需要由main.yml进行“包含”调用; 
vars/: 
此目录中至少应该有一个名为main.yml的文件,用于定义各variable;其它的文件需要由main.yml进行“包含”调用; 
templates/: 
存储由template模块调用的模板文本; 
meta/: 
此目录中至少应有一个名为main.yml文件,定义当前角色的特殊设定及其依赖关系;其它文件需要由main.yml进行“包含”调用; 
default/: 
此目录中至少应该有一个名为main.yml的文件,用于设定默认变量;

举例:在webserver组内机器分别各自安装nginx,memcached,msql-server通过roles调用tasks 
创建目录 
mkdir -pv ./{nginx,memcached,httpd,mysql}/{files,templates,vars,handlers,meta,tasks,default}

安装nginx 1、在nginx目录tasks目录下创建main.yml文件     [root@Centos6 tasks]# vim main.yml      - name: copy nginx package to remote host //先拷贝安装程序       copy: src=nginx-1.10.1-1.el7.x86_64.rpm              dest=/tmp/nginx-nginx-1.10.1-1.el7.x86_64.rpm       tags: cppkg     - name: install nginx package //再安装程序包       yum: name=/tmp/nginx-1.10.0-1.el7.nginx.x86_64.rpm  state=present     - name: install conf file nginx.conf //然后提供配置文件       template: src=nginx.conf.j2 dest=/etc/nginx/nginx.conf       tags: nginxconf //加了一个标签,按需执行       notify: reload nginx service //通知标签要干什么,我们需要在handlers目录下创建触发器     - name: install conf file default.conf //再提供nginx默认文件       template: src=default.conf.j2 dest=/etc/nginx/conf.d/default.conf       tags: nginxconf       notify: reload nginx service      - name: start nginix service //启动服务       service : name=nginx enabled=true state=started 2、在nginx目录handlers目录下创建main.yml文件       [root@Centos6 handlers]# cat main.yml          - name: reload nginx service            service: name=nginx state=restarted         [root@Centos6 handlers]#    3、拷贝nginx.conf文件到templates目录下做模版         [root@Centos6 roles]# cp /etc/nginx/nginx.conf nginx/templates/nginx.conf.j2         更改 worker_processes ` ansible_processor_vcps `;    4、拷贝default.conf文件到templates目录下做模版           [root@Centos6 roles]# cp /etc/nginx/conf.d/default.conf nginx/default/default.conf.j2           更改    listen       ` nginxport `;  //变量定义   5、nginx/vars目录下创建main.yml 调用变量           写入 nginxport: "8090"   6、在ansible目录下创建nginx.yml文件来调用以上各种组织好的nginx角色           [root@Centos6 roles]# vim nginx.yml                 - hosts: webserver                   remote_user: root                   roles: //定义角色                   - { role: nginx, ngxport: 8080 }//即能调角色,又能向角色传变量                   - nginx //角色调用   7、编辑ansible.cfg文件启用roles_path让roles去找所定义的文件           [root@Centos6 ansible]# vim ansible.cfg            启用把前面注释去掉 roles_path    = /etc/ansible/roles 8、要注意,避免错误,最好定义好文件后各自做个语法测试 9、然后就可以让剧本跑一遍了 10、确保你的系统selinux是disabled,不然服务起不来      ansible-playbook --syntax-check nginx.yml安装memcached [root@Centos6 memcached]# ls ../memcached/* ../memcached/handlers: main.yml - name: reload memcached   service: name=memcached state=restarted ../memcached/tasks: main.yml - name: install memcached   yum: name=memcached state=latest - name: install conf file   template: src=memcached.j2 dest=/etc/sysconfig/memcached   tags: mcconf   notify: reload memcached - name: start memcached service    service: name=memcached state=started enabled=true ../memcached/templates: memcached.j2     PORT="11211"     USER="memcached"     MAXCONN="1024"     CACHESIZE="{{ ansible_memtotal_mb //4 }}"     OPTIONS="" [root@Centos6 memcached]#安装mysql vim mysql/tasks/main.yml  mysql/tasks: main.yml - name: install mysql-server   yum: name=mysql-server state=latest   when: ansible_distribution == "Centos" and ansible_distribution_major_version == "6" - name: install mariadb-server   yum: name=mariadb-server state=latest   when: ansible_distribution == "Centos" and ansible_distribution_major_version == "7" - name: start mysql service   service: name=mysqld state=started   when: ansible_distribution == "Centos" and ansible_distribution_major_version == "6" - name: start mariadb service   service: name=mariadb state=started   when: ansible_distribution == "Centos" and ansible_distribution_major_version == "7" [root@Centos6 ansible]# vim mysql.yml      - hosts: webserver       remote_user: root       roles:       - mysql 语法测试: ansible-playbook --syntax-check  mysql.yml done!!!以上配置环境皆基于CentOS 7.2来实现并完成,如有错误请指出,我们共同学习......


有关Ansible自动化运维工具阐述及配置实现的更多相关文章

  1. ruby-on-rails - 使用 Ruby on Rails 进行自动化测试 - 最佳实践 - 2

    很好奇,就使用ruby​​onrails自动化单元测试而言,你们正在做什么?您是否创建了一个脚本来在cron中运行rake作业并将结果邮寄给您?git中的预提交Hook?只是手动调用?我完全理解测试,但想知道在错误发生之前捕获错误的最佳实践是什么。让我们理所当然地认为测试本身是完美无缺的,并且可以正常工作。下一步是什么以确保他们在正确的时间将可能有害的结果传达给您? 最佳答案 不确定您到底想听什么,但是有几个级别的自动代码库控制:在处理某项功能时,您可以使用类似autotest的内容获得关于哪些有效,哪些无效的即时反馈。要确保您的提

  2. ruby-on-rails - 独立 ruby​​ 脚本的配置文件 - 2

    我有一个在Linux服务器上运行的ruby​​脚本。它不使用rails或任何东西。它基本上是一个命令行ruby​​脚本,可以像这样传递参数:./ruby_script.rbarg1arg2如何将参数抽象到配置文件(例如yaml文件或其他文件)中?您能否举例说明如何做到这一点?提前谢谢你。 最佳答案 首先,您可以运行一个写入YAML配置文件的独立脚本:require"yaml"File.write("path_to_yaml_file",[arg1,arg2].to_yaml)然后,在您的应用中阅读它:require"yaml"arg

  3. ruby - RuntimeError(自动加载常量 Apps 多线程时检测到循环依赖 - 2

    我收到这个错误:RuntimeError(自动加载常量Apps时检测到循环依赖当我使用多线程时。下面是我的代码。为什么会这样?我尝试多线程的原因是因为我正在编写一个HTML抓取应用程序。对Nokogiri::HTML(open())的调用是一个同步阻塞调用,需要1秒才能返回,我有100,000多个页面要访问,所以我试图运行多个线程来解决这个问题。有更好的方法吗?classToolsController0)app.website=array.join(',')putsapp.websiteelseapp.website="NONE"endapp.saveapps=Apps.order("

  4. ruby - 如何根据特征实现 FactoryGirl 的条件行为 - 2

    我有一个用户工厂。我希望默认情况下确认用户。但是鉴于unconfirmed特征,我不希望它们被确认。虽然我有一个基于实现细节而不是抽象的工作实现,但我想知道如何正确地做到这一点。factory:userdoafter(:create)do|user,evaluator|#unwantedimplementationdetailshereunlessFactoryGirl.factories[:user].defined_traits.map(&:name).include?(:unconfirmed)user.confirm!endendtrait:unconfirmeddoenden

  5. Ruby Sinatra 配置用于生产和开发 - 2

    我已经在Sinatra上创建了应用程序,它代表了一个简单的API。我想在生产和开发上进行部署。我想在部署时选择,是开发还是生产,一些方法的逻辑应该改变,这取决于部署类型。是否有任何想法,如何完成以及解决此问题的一些示例。例子:我有代码get'/api/test'doreturn"Itisdev"end但是在部署到生产环境之后我想在运行/api/test之后看到ItisPROD如何实现? 最佳答案 根据SinatraDocumentation:EnvironmentscanbesetthroughtheRACK_ENVenvironm

  6. 世界前沿3D开发引擎HOOPS全面讲解——集3D数据读取、3D图形渲染、3D数据发布于一体的全新3D应用开发工具 - 2

    无论您是想搭建桌面端、WEB端或者移动端APP应用,HOOPSPlatform组件都可以为您提供弹性的3D集成架构,同时,由工业领域3D技术专家组成的HOOPS技术团队也能为您提供技术支持服务。如果您的客户期望有一种在多个平台(桌面/WEB/APP,而且某些客户端是“瘦”客户端)快速、方便地将数据接入到3D应用系统的解决方案,并且当访问数据时,在各个平台上的性能和用户体验保持一致,HOOPSPlatform将帮助您完成。利用HOOPSPlatform,您可以开发在任何环境下的3D基础应用架构。HOOPSPlatform可以帮您打造3D创新型产品,HOOPSSDK包含的技术有:快速且准确的CAD

  7. 华为OD机试用Python实现 -【明明的随机数】 2023Q1A - 2

    华为OD机试题本篇题目:明明的随机数题目输入描述输出描述:示例1输入输出说明代码编写思路最近更新的博客华为od2023|什么是华为od,od薪资待遇,od机试题清单华为OD机试真题大全,用Python解华为机试题|机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南华为o

  8. Vscode+Cmake配置并运行opencv环境(Windows和Ubuntu大同小异) - 2

    之前在培训新生的时候,windows环境下配置opencv环境一直教的都是网上主流的vsstudio配置属性表,但是这个似乎对新生来说难度略高(虽然个人觉得完全是他们自己的问题),加之暑假之后对cmake实在是爱不释手,且这样配置确实十分简单(其实都不需要配置),故斗胆妄言vscode下配置CV之法。其实极为简单,图比较多所以很长。如果你看此文还配不好,你应该思考一下是不是自己的问题。闲话少说,直接开始。0.CMkae简介有的人到大二了都不知道cmake是什么,我不说是谁。CMake是一个开源免费并且跨平台的构建工具,可以用简单的语句来描述所有平台的编译过程。它能够根据当前所在平台输出对应的m

  9. 基于C#实现简易绘图工具【100010177】 - 2

    C#实现简易绘图工具一.引言实验目的:通过制作窗体应用程序(C#画图软件),熟悉基本的窗体设计过程以及控件设计,事件处理等,熟悉使用C#的winform窗体进行绘图的基本步骤,对于面向对象编程有更加深刻的体会.Tutorial任务设计一个具有基本功能的画图软件**·包括简单的新建文件,保存,重新绘图等功能**·实现一些基本图形的绘制,包括铅笔和基本形状等,学习橡皮工具的创建**·设计一个合理舒适的UI界面**注明:你可能需要先了解一些关于winform窗体应用程序绘图的基本知识,以及关于GDI+类和结构的知识二.实验环境Windows系统下的visualstudio2017C#窗体应用程序三.

  10. ruby-on-rails - 从应用程序中自定义文件夹内的命名空间自动加载 - 2

    我们目前正在为ROR3.2开发自定义cms引擎。在这个过程中,我们希望成为我们的rails应用程序中的一等公民的几个类类型起源,这意味着它们应该驻留在应用程序的app文件夹下,它是插件。目前我们有以下类型:数据源数据类型查看我在app文件夹下创建了多个目录来保存这些:应用/数据源应用/数据类型应用/View更多类型将随之而来,我有点担心应用程序文件夹被这么多目录污染。因此,我想将它们移动到一个子目录/模块中,该子目录/模块包含cms定义的所有类型。所有类都应位于MyCms命名空间内,目录布局应如下所示:应用程序/my_cms/data_source应用程序/my_cms/data_ty

随机推荐