【ansible】管理变量与事实详解

目录

管理变量与事实

一,变量

1,变量命名

2,变量优先级(高--低)

3,命令行引用

4, 引用playbook中的变量

5, 在主机清单中定义变量

6, 在自定义变量文件中定义变量

7,在目录中定义清单变量

8,使用数组作为变量

9,系统变量register

二,使用ansible vault加密文件

1,创建加密文件(create)

2,查看加密文件内容(view)

3,使用文件内容作为加密密码(--vault-password-file=密码文件)

4,解密加密文件(decrypt)

5,将加密文件解密到指定文件中(--output 指定文件)

6,更改加密文件的密码(rekey)

7,使用文件更改加密文件的密码(rekey   --new-vault-password-file=密码文件)

8,通过剧本加载加密文件(--vault-id @prompt )

三,管理事实

1,描述ansible事实

2,ansible事实实例

3,受管主机收集事实的方式

4,接收事实收集的方法

5,关闭事实收集

6,创建自定义事实


管理变量与事实

事实:主机上的默认定义的变量信息

一,变量

1,变量命名

变量名称必须是以字母开头,并且只能含有字母、数字和下划线。

2,变量优先级(高--低)

  • (1)全局范围:从命令行或ansible配置设置的变量
  • (2)play范围:在play和相关结构中设置的变量
  • (3)主机范围:由清单、事实收集或注册的任务,在主机和个别主机上设置的变量
  • 命令行定义变量--> yaml文件中的变量(vars_file  --->   vars)--->主机清单中单独定义主机变量--->主机清单公共变量

 

3,命令行引用

变量要用两个花括号引起来,变量作为键值对的值必须用引号引起来

(1)在/day04/playbook目录下创建var_test.yml文件

此时的受控主机上node1没有vsftp软件包

[root@node1 ~]# rpm -qa | grep vsftpd

(2)在var_test.yml文件中安装软件包,在命令行把要安装的软件包传入到剧本中的变量

- name: play1

  hosts: all

  tasks: 装包

    - name: task1

      yum:

        name: "{{ pkname }}"

        state: present

(3)在命令行给变量传入变量值,并执行var_test.yml文件,在node1上安装vsftpd

[root@server playbook]# ansible-playbook -e "pkname=vsftpd" var_test.yml

(4)此时在node1主机上查看vsftpd,已经安装成功

[root@node1 ~]# rpm -qa | grep vsftpd

4, 引用playbook中的变量

(1)此时的node1主机上有vsftpd和bind

[root@node1 ~]# rpm -qa | grep vsftpd

[root@node1 ~]# rpm -qa | grep bind

(2) 在var_test.yml中定义变量 vars

在var_test.yml中定义vars

---

- name: play1

  hosts: test1

  vars:

    pkname: vsftpd

  tasks:

    - name: task1

      yum:

        name: "{{ pkname }}"

        state: absent

(3)在命令行定义变量为bind的同时在playbook中定义变量为vfstpd

[root@server playbook]# ansible-playbook -e "pkname=bind" var_test.yml

(4)执行完命令后,再次查看bind和vfstpd包,发现bind被删除了,但是vfstpd包还在

         说明命令行中变量的优先级大于yaml文件中变量的优先级

[root@node1 ~]# rpm -qa | grep bind

[root@node1 ~]# rpm -qa | grep vsftpd

注: 引用变量中间有无空格都可以,变量用作开始一个值得第一元素时,必须使用引号防止ansible将变量引用视为yaml字典的开头。

5, 在主机清单中定义变量

(1)查看此时匹配到的主机清单文件

[root@server playbook]# ansible --version

(2)此时的node1主机与node2主机都有httpd与vsftpd

[root@node1 ~]# rpm -qa | grep httpd
[root@node1 ~]# rpm -qa | grep vsftpd

[root@node2 ~]# rpm -qa | grep vsftpd
[root@node2 ~]# rpm -qa | grep httpd

 

(3)打开主机清单文件,定义变量,对单个主机node1卸载httpd;对主机组node1与node2卸载vsftpd

node1 pkname=httpd

[test]

node1

node2

[test:vars]

pkname=vsftpd

(4)在剧本中定义变量

---

- name: play1

  hosts: all

#  vars:

#    pkname: vsftpd

  tasks:

    - name: task1

      yum:

        name: "{{ pkname }}"

        state: absent

(5)执行剧本var_test.yml

[root@server playbook]# ansible-playbook var_test.yml

(6)此时在node1主机上查看httpd与vsftpd;发现httpd已经被卸载了

[root@node1 ~]# rpm -qa | grep httpd
[root@node1 ~]# rpm -qa | grep vsftpd

(7)在node1主机上查看httpd与vsftpd;发现vsftpd已经被卸载了

[root@node2 ~]# rpm -qa | grep httpd
[root@node2 ~]# rpm -qa | grep vsftpd

说明主机清单中的变量优先匹配单个主机变量,其次匹配主机组中的变量,最后匹配嵌套主机组定义的变量值

6, 在自定义变量文件中定义变量

1,导入var_files文件定义变量

(1)此时的node1主机与node2主机上均存在bind

[root@node2 ~]# rpm -q bind

[root@node1 ~]# rpm -q bind

(2)在packages文件中定义变量(按照yml的语法格式定义)

[root@server playbook]# vim packages

pkname: bind

(3)把变量文件vars_files导入var_test.yml剧本中

---

- name: play1

  hosts: all

#  vars:

#    pkname: vsftpd

  vars_files:

    - packages

  tasks:

    - name: task1

      yum:

        name: "{{ pkname }}"

        state: absent

(4)执行剧本文件var_test.yml

[root@server playbook]# ansible-playbook var_test.yml

(5)此时在node1与node2主机上查看bind,发现已经被卸载

[root@node1 ~]# rpm -q bind

[root@node2 ~]# rpm -q bind

2,定义变量信息的同时导入变量文件

(1)此时的node1主机与node2主机上均没有bind与httpd

[root@node1 ~]# rpm -q bind
[root@node1 ~]# rpm -q httpd

[root@node2 ~]# rpm -q bind
[root@node2 ~]# rpm -q httpd

(2)在var_test.yml文件中定义变量使其安装httpd并导入变量文件packages

---

- name: play1

  hosts: all

  vars_files:

    - packages

  vars:

    pkname: httpd

  tasks:

    - name: task1

      yum:

        name: "{{ pkname }}"

        state: present

---

- name: play1

  hosts: all

  vars_files:

    - packages

  vars:

    pkname: httpd

  tasks:

    - name: task1

      debug:

        msg: pkname={{ pkname }}

(3)编辑变量文件packages

[root@server playbook]# vim packages

pkname: bind

(3)执行var_test.yml剧本文件

[root@server playbook]# ansible-playbook var_test.yml

(8)在node1主机上与node2主机上查看httpd与bind;发现bind已经安装;

[root@node1 ~]# rpm -q httpd
[root@node1 ~]# rpm -q bind

[root@node2 ~]# rpm -q httpd
[root@node2 ~]# rpm -q bind

说明yaml文件中的变量(vars_file  --->   vars)

总的来说:命令行定义变量--> yaml文件中的变量(vars_file  --->   vars)--->主机清单中单独定义主机变量--->主机清单公共变量

3,一次性安装软件包httpd;vsftps;firewalld

(1)可以使用下列方法一次性传入多个参数

---

- name: play1

  hosts: all

  vars:

    pkname:

      - httpd

      - vsftpd

      - firewalld

  tasks:

    - name: task1

      debug:

        msg: pkname={{ pkname }}

(2)执行剧本文件var_test.yml

[root@server playbook]# ansible-playbook var_test.yml

注意:这种做法存在一些缺点,它是清单文件更难处理,在同一文件中混合提供了主机和变量信息,而且采用的也是过时的语法。

使用目录填充主机和组变量-----重要!!!

7,在目录中定义清单变量

建议的做法是使用host_vars和group_vars目录定义清单变量,而不直接在清单文件中定义。

---

- name: play1

  hosts: all

  tasks: 

    - name: task1

      debug:

        msg: pkname={{ pkname }}

(1)创建host_vars主机的变量目录和group_vars主机组的变量目录   目录定义清单变量

[root@server playbook]# mkdir host_vars group_vars

(2)在主机目录下面创建主机变量文件(针对node1主机创建变量文件)

[root@server playbook]# vim host_vars/node1

pkname: httpd

[root@server playbook]# mkdir group_vars/test
[root@server playbook]# vim group_vars/test/var.yml

pkname: vsftpd

(3)查看创建的目录的结构

[root@server playbook]# tree

(4)执行var_test.yml剧本文件

[root@server playbook]# ansible-playbook var_test.yml

(1)创建host_vars/node2目录并编辑文件var.yml

[root@server playbook]# mkdir host_vars/node2
[root@server playbook]# vim host_vars/node2/var.yml

pkname: mod_ssl

(2)查看目录及文件的结构

[root@server playbook]# tree

(3)执行剧本文件var_test.yml

[root@server playbook]# ansible-playbook var_test.yml

 

 

 

8,使用数组作为变量

 数组(Array)是有序的元素序列。 若将有限个类型相同的变量的集合命名,那么这个名称为数组名。组成数组的各个变量称为数 组的分量,也称为数组的元素,有时也称为下标变量。用于区分数组的各个元素的数字编号称为下标。数组是在程序设计中,为了处理方便, 把具有相同类型的若干元素按有序的形式组织起来的一种形式。 这些有序排列的同类数据元素的集合称为数组。

数组是用于储存多个相同类型数据的集合。

 

 

(1)创建目录

[root@server ~]# mkdir /day05/var_test -pv

 

 

(2)在目录/day05/var_test下创建文件ansible.cfg与inventory文件

[root@server var_test]# cp /day04/playbook/ansible.cfg .
[root@server var_test]# cp /day04/playbook/inventory .

 

 

 (3)查看ansible.cfg文件以及inventory文件

[root@server var_test]# cat ansible.cfg

[defaults]

inventory=./inventory

[root@server var_test]# cat inventory

node1

[test]

node1

node2

 

 

(4)在目录/day05/var_test下面创建playbook.yml文件

 [root@server var_test]# vim playbook.yml

  

变量引用方法一:

---

- name: play1

  vars:

    student:

      zhangsan:

        yuwen: 80

        shuxue: 81

        yingyu: 79

      lisi:

        yuwen: 90

        shuxue: 91

        yingyu: 92

  hosts: test

  tasks:

    - name: task1

      debug:

        msg: 语文成绩是:{{ student.zhangsan.yuwen }}

 

 

(5)执行剧本

[root@server var_test]# ansible-playbook playbook.yml

 

变量引用方法二:

---

- name: play1

  vars:

    student:

      zhangsan:

        yuwen: 80

        shuxue: 81

        yingyu: 79

      lisi:

        yuwen: 90

        shuxue: 91

        yingyu: 92

  hosts: test

  tasks:

    - name: task1

      debug:

        msg: 数学成绩是:{{ student['lisi']['shuxue'] }} 

 

 

执行剧本playbook.yml

[root@server var_test]# ansible-playbook playbook.yml

 

方法一:

国家:

        省份:

                城市:

                        县:

                                镇:

方法二:

{{ 国家.省份.城市.县.镇 }}

方法三:

{{ 国家['省份']['城市']['县']['镇'] }}

msg  var  引用变量的区别:

var后面直接跟变量,不需要双引号与花括号

var:  student['lisi']['shuxue']

msg后面需要花括号引用变量

msg: {{ student['lisi']['shuxue'] }}

9,系统变量register

使用register已注册变量捕获命令输出

管理员可以使用register语句捕获命令输出,输出保存在一个临时变量中,稍后再playbook中可用于调试用途或者达成其他目的。

注:msg var的区别msg 引用变量{{ }} var后面直接跟变量名名

eg:

 

 

(1)在目录/day05/var_test下面编辑文件playbook1.yml

---

- name: play1

  hosts: test

  tasks:

    - name: task1

      copy:

        dest: /file

        content: "this is a file\n"

 

(2)执行剧本并没有显示详细信息

[root@server var_test]# ansible-playbook playbook1.yml

 

(3)使用register捕获详细信息存储到results变量中,并在debug模块捕获并显示

---

- name: play1

  hosts: test

  tasks:

    - name: task1

      copy:

        dest: /file

        content: "this is a file\n"

      register: results

    - name: task2

      debug:

        msg: "{{ results }}"

 

 

(4)执行剧本playbook1.yml可以看到捕获到的详细信息如下所示

[root@server var_test]# ansible-playbook playbook1.yml

 

(5)显示上面捕获到的详细信息中的size的信息

---

- name: play1

  hosts: test

  tasks:

    - name: task1

      copy:

        dest: /file

        content: "this is a file\n"

      register: results

    - name: task2

      debug:

        msg: "{{ results }}"

      register: cmd_results

    - name: task3

      debug:

        msg: "{{ cmd_results.msg.size }}"

 

 (6)此时执行剧本playbook1.yml就能看到task3捕获到的size大小

 

 

 

二,使用ansible vault加密文件

 ansible可能需要访问密码或者API秘钥等敏感数据,以便能配置受管主机。通常,此信息可能以纯文本形式存储在清单变量或其他ansible文件中。但若如此,任何有权访问ansible文件的用户或存储这些ansible文件的版本控制系统都能访问如此敏感数据。这显然存在安全风险。

使用ansible随附的ansible vault 可以加密和解密任何由ansible使用的结构化数据文件。若要使用ansible vault,可通过一个名为ansible-vault的命令行共计创建、编辑、加密、解密和查看文件。Ansible vault可以加密任何由ansible使用的结构化数据文件。这可能包括清单变量、playbook中含有的变量文件、在执行playbook时作为参数传递的变量文件,或者ansible角色中定义的变量。

注:ansible-vault并不实施自有的加密函数,而是使用外部python工具。文件通过利用AES256的对称加密(将密码用作机密秘钥)加以保护,这种方式并未得到第三方正式审核。

 

创建加密文件的常用参数:

creat:  创建加密文件

decrypt:   解密

edit:    进入编辑

view:  显示文件信息

encrypt:   加密

encrypt_string:  加密字符串

rekey: 重置

 

在目录/day05/playbook下面创建playbook2.yml文件

---

- name: play1

  hosts: test

  vars_files:

    - user_var.yml

  tasks:

    - name: task1

      user:

        name: "{{ username }}"

        password: "{{ pass }}"

        state: present

 

 

 

 

 

1,创建加密文件(create)

(1)创建加密文件user_var.yml并输入加密文件的密码

[root@server var_test]# ansible-vault create user_var.yml

 

(2)生成加密后的密码

[root@node1 ~]# python3
>>> import crypt
>>> crypt.crypt('123456')

'$6$K37gjva7lG7U4Z0N$.F9RPUC4iHRtH35P/4Y2RhoYm47dwnQeGcNTMi/6eFs8eQYS.WtEkWKP0uWVaIQzl5nUADw3EIbYdXsL3WSJ90'

 

 

(3) 在加密文件中定义变量

username: xiao1

pass: '$6$K37gjva7lG7U4Z0N$.F9RPUC4iHRtH35P/4Y2RhoYm47dwnQeGcNTMi/6eFs8eQYS.WtEkWKP0uWVaIQzl5nUADw3EIbYdXsL3WSJ90'

 

(4)输入密码后会利用默认的编辑器vi打开文件进行编辑。也可通过EDITOR环境变量更改默认编辑器。

例如:将默认编辑器设置为vim,则设置export EDITOR=vim

[root@server var_test]# export EDITOR=vim

 

 

(5)此时查看问价user_var.yml会看到文件已经被加密

[root@server var_test]# cat user_var.yml

 

 

2,查看加密文件内容(view)

(1)输入加密文件的密码查看加密文件user_var.yml的内容

[root@server var_test]# ansible-vault view user_var.yml

 

 

 

 

 

3,使用文件内容作为加密密码(--vault-password-file=密码文件)

(1)创建文件p1

[root@server var_test]# vim p1

 

 

(2) 将p1文件的内容作为加密的密码

[root@server var_test]# ansible-vault create --vault-password-file=p1 v.yml

 

 

 

(3)查看加密文件v.yml文件的内容,用p1文件自动输入密码

[root@server var_test]# ansible-vault view --vault-password-file=p1 v.yml

 

 

 

4,解密加密文件(decrypt)

(1)对加密文件user_var.yml进行解密

[root@server var_test]# ansible-vault decrypt user_var.yml

 

(2)此时查看文件user_var.yml会看到文件未被加密的内容

[root@server var_test]# cat user_var.yml

 

 

 

 

5,将加密文件解密到指定文件中(--output 指定文件)

(1)将加密文件user_var.yml解密到vvv.yml文件中

[root@server var_test]# ansible-vault decrypt user_var.yml --output vvv.yml

 

(2)查看文件vvv.yml的内容

[root@server var_test]# cat vvv.yml

 

(3)注意:此时的文件user_var.yml并未被解密,

[root@server var_test]# cat user_var.yml

 

 

 

6,更改加密文件的密码(rekey)

将加密文件user_var.yml的密码由123456改为111111

[root@server var_test]# ansible-vault rekey user_var.yml

Vault password:                              输入原来的密码

New Vault password:                     输入修改后的密码

Confirm New Vault password:      再次确认密码

Rekey successful

 

 

 

7,使用文件更改加密文件的密码(rekey   --new-vault-password-file=密码文件)

(1)将加密文件v.yml 文件的密码由p1文件的123456改为p2文件的111111

[root@server var_test]# vim p2

111111

 

(2)可以手动输入旧密码确认

[root@server var_test]# ansible-vault rekey --new-vault-password-file=p2 v.yml

 

 

(3)也可以通过文件p1确认旧密码

[root@server var_test]# ansible-vault rekey --vault-password-file=p1 --new-vault-password-file=p2 v.yml

 

 

 

8,通过剧本加载加密文件(--vault-id @prompt )

(1)可以看到playbook2.yml文件中需要加载文件user_var.yml;

[root@server var_test]# vim playbook2.yml

 

(2)而user_var.yml文件为加密文件

[root@server var_test]# cat user_var.yml

 

 

(3)此时,剧本无法直接加载文件playbook2.yml

[root@server var_test]# ansible-playbook playbook2.yml

 

 

(4)需要输入文件的密码才能加载文件,执行剧本文件

[root@server var_test]# ansible-playbook --vault-id @prompt playbook2.yml

Vault password (default):            需要手动输入文件user_var.yml的密码

 

(5)查看剧本的执行结果

[root@node1 ~]# id xiao1

 

 

 

 

 

 

 

三,管理事实

1,描述ansible事实

 ansible事实是ansible在受管主机上自动检测到的变量。事实中含有主机相关的信息,可以像play中的常规变量、条件、循环或者依赖于受管主机收集的任何其他语句那样使用。(收集的系统属性)

 受管主机的事实有(主机名称、内核版本、网络接口、ip地址、操作系统版本、各种变量、CPU数量、提供的或可用的内存、可用磁盘等)

 借助事实我们可以方便检索主机的状态,并根据状态确定要执行的操作。

例如:

1.根据不同的内核版本事实运行条件任务,以此来重新启动服务。

2.根据事实报告的可能内存情况来定义mysql配置文件。

3.可根据事实的值设置配置文件中使用的ipv4的地址。

 

 

 

2,ansible事实实例

  • Ansible2.5之前,事实是作为前缀为字符串ansible_的单个变量注入,而不是作为ansible_facts变量的一部分注入
  • ansible_facts['distribution']事实会被称为ansible_distribution

ansible_facts形式

旧事实变量形式

ansible_facts['hostname']

ansible_hostname

ansible_facts['fqdn']

ansible_fqdn

ansible_facts'default_ipv4'

ansible_default_ipv4['address']

ansible_facts['interfaces']

ansible_interfaces

ansible_facts'devices''partitions'['size']

ansible_devices'vda''vda1'

ansible_facts'dns'

ansible_dns['nameservers']

ansible_facts['kernel']

ansible_kernel

ansible事实的事例

事实

变量

短主机名

ansible_facts['hostname']

完全限定域名

ansible_facts['fqdn']

主机ipv4地址

ansible_facts'default_ipv4' ==== ansibe_facts.default_ipv4.address

网络接口名称列表

ansibel_facts['interfaces']

/dev/vda1磁盘分区大小

ansible_facts'devices''partitions'['size']

DNS服务器列表

ansible_facts'dns' ===ansible_facts'dns'

当前运行的内核版本

ansible_facts['kernel']

 

 

1,显示短的主机名

  msg: "{{ ansible_facts.hostname }}"

 

执行剧本playbook3.yml文件,可以看到短的主机名

[root@server var_test]# ansible-playbook playbook3.yml

 

 

2,显示长的主机名

 msg: "{{ ansible_facts.fqdn }}"

 

执行剧本playbook3.yml文件,可以看到长的主机名

[root@server var_test]# ansible-playbook playbook3.yml

 

 

 

 

3,显示ipv4地址

 msg: "{{ ansible_facts.default_ipv4.address }}"

 

执行剧本playbook3.yml文件,可以看到ipv4的地址

[root@server var_test]# ansible-playbook playbook3.yml

 

 

 

4,显示网络接口名称列表

 msg: "{{ ansible_facts.interfaces }}"

 

执行剧本playbook3.yml文件,可以看到网络接口名称列表

[root@server var_test]# ansible-playbook playbook3.yml

 

 

 

 

3,受管主机收集事实的方式

1. setup模块(变量信息  内置系统中的变量信息)

(1)系统的默认值,不能手动修改

[root@server var_test]# ansible node1 -m setup | less

  

(2)编辑playbook3.yml文件

[root@server var_test]# vim playbook3.yml

(3)过滤出ipv4的地址的值

匹配事实时,可以省略第一个相同的单词

---

- name: play1

  hosts: node1

  gather_facts: yes  # 默认开启接收事实

  tasks:

    - name: task1

      debug:

        msg: "{{ ansible_facts.default_ipv4.address }}"

(4)执行剧本playbook3.yml,可以看到过滤出来的ipv4地址为192.168.206.111

[root@server var_test]# ansible-playbook playbook3.yml

4,接收事实收集的方法

方法一:gather_ facts:  yes

方法二:

- name: task0

      setup:

5,关闭事实收集

gather_facts: no

执行剧本文件playbook3.yml

[root@server var_test]# ansible-playbook playbook3.yml

如果不想从fact中获取变量,或者说整个playbook当中都没有使用到fact变量,可以通过如下方法关闭fact以提升执行效率:

也可以在ansible.cfg中添加如下配置:

[defaults]

gathering = explicit (明确的)

ansible的配置文件中可以修改'gathering'的值为smart、implicit或者explicit。

(1)smart 表示默认收集facts,但facts已有的情况下不会收集,即使用缓存facts;

(2)implicit 表示默认收集facts ;

(3)explicit 则表示默认不收集;

6,创建自定义事实

默认情况下setup模块从受管主机/etc/ansible/facts.d目录下的文件和脚本中加载自定义事实。各个文件名必须以.fact结尾才能使用。动态自定义事实脚本必须输出JSON格式的事实,而且必须是可执行文件。

 

INI和JSON格式编写的静态自定义事实文件。INI格式的自定义事实文件包含由一部分定义的顶层值,后跟用于待定义事实的键值对。

 

(1)在受控主机node1上创建目录/etc/ansible/facts.d并在此目录下创建abc.fact结尾的文件

[root@node1 ~]# mkdir /etc/ansible/facts.d -pv

 

 

(2)在目录/etc/ansible/facts.d下面创建文件abc.fact

[root@node1 facts.d]# touch abc.fact

 

(3)编辑文件abc.fact内容

[users]

user1 = joe

user2 = jane

 

 

(4)在控制端主机server上捕获node1主机的uers1

msg: "{{ ansible_facts.ansible_local.abc.users.user1 }}"

 

 

(5)执行剧本playbook3.yml查看信息捕获到的use1的信息

[root@server var_test]# ansible-playbook playbook3.yml

 

 

(6)过滤出ansible_local对象下所有的值

[root@server var_test]# ansible node1 -m setup -a 'filter=ansible_local'

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/5042.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Linux基础IO - 文件描述符、重定向

前面的文章中我们讲述了C语言中文件相关的操作与系统文件IO的接口,这篇文章中将会讲述文件描述符与重定向的知识。 运行在前文中的系统文件程序,通过观察可以看到图中的数据3非常的奇怪没头没尾的,下面我们就来从这里开始。 通过查看man手册…

console使用方法介绍

console是在写前端Javascript时经常会使用到,我平时使用最多的是console.log,相比大多数人也是如此吧! 下面一起来看一下强大的console吧! 01函数(属性) 包含如下函数 / 属性:memory、assert、c…

Hadoop三大框架之HDFS

一、概述HDFS产生的背景及定义HDFS产生背景随着数据量越来越大,在一个操作系统存不下所有的数据,那么就分配到更多的操作系统管理的磁盘中,但是不方便管理和维护,需要一种系统来管理多台机器上的文件,这就是分布式文件…

日入500+的程序员都在用的“接私活”平台

网上总说程序员的薪资很高,这我可就不同意了: 程序员的薪资哪里是很高,而是非常高!而会接私活的程序员更是能拿到更高的收入!作为一个程序员,这些接私活的网站一定要收藏起来,让你在“八小时外…

ChatGPT transformer 5篇经典论文以及代码和解读

一次性读懂ChatGPT的技术演进路线,根据李沐老师推荐的5篇经典论文,整理了论文原文、论文解读、Github代码实现。 2017Transformer继MLP、CNN、RNN后的第四大类架构2018GPT使用 Transformer 解码器来做预训练2018BERTTransformer一统NLP的开始2019GPT-2更…

区块链概论

目录 1.概述 2.密码学原理 2.1.hash函数 2.2.签名 3.数据结构 3.1.区块结构 3.2.hash pointer 3.3.merkle tree 3.3.1.概述 3.3.2.证明数据存在 3.3.3.证明数据不存在 4.比特币的共识协议 4.1.概述 4.2.验证有效性 4.2.1.验证交易有效性 4.2.2.验证节点有效性 …

YOLOv5源码逐行超详细注释与解读(6)——网络结构(1)yolo.py

前言 在上一篇中,我们简单介绍了YOLOv5的配置文件之一 yolov5s.yaml,这个文件中涉及很多参数,它们的调用会在这篇 yolo.py 和下一篇 common.py 中具体实现。 本篇我们会介绍 yolo.py,这是YOLO的特定模块,和网络构建有…

python【selenium的环境配置】

selenium 1.环境配置 1)在环境设置里面安装selenium第三方库 pip install --user selenium2) from selenium.webdriver import Chrome# 创建谷歌 b Chrome() # 获取网页 b.get(http://www.baidu.com) # 防止自动关闭 input()3)在此之前&…

Rancher系列文章-Rancher v2.6使用脚本实现导入集群

概述 最近在玩 Rancher, 先从最基本的功能玩起, 目前有几个已经搭建好的 K8S 集群, 需要批量导入, 发现官网已经有批量导入的文档了. 根据 Rancher v2.6 进行验证微调后总结经验. 1. Rancher UI 获取创建集群参数 访问Rancher_URL/v3/clusters/,单击右上角“Crea…

第07章_单行函数

第07章_单行函数 🏠个人主页:shark-Gao 🧑个人简介:大家好,我是shark-Gao,一个想要与大家共同进步的男人😉😉 🎉目前状况:23届毕业生,目前在某…

进程地址空间+环境变量

目录 环境变量 进程地址空间 理解虚拟地址空间 进程地址空间区域划分 虚拟内存和物理内存建立联系 深刻理解虚拟地址空间 环境变量 当我们需要使用一个物品的时候,首先要先找到这个物品。同样的,当要运行一个程序(指令)时&a…

大公司为什么禁止SpringBoot项目用Tomcat?

前言 在SpringBoot框架中,我们使用最多的是Tomcat,这是SpringBoot默认的容器技术,而且是内嵌式的Tomcat。同时,SpringBoot也支持Undertow容器,我们可以很方便的用Undertow替换Tomcat,而Undertow的性能和内…

低功耗技术——流水线设计(加法器和乘法器)

文章目录前言一、流水线1、16bit加法器2、无符号4bit乘法器3、编写一个4bit乘法器模块,并例化该乘法器求解c12*a5*b二、降低FPGA功耗1、静态功耗2、动态功耗前言 2023.3.31 今天学习降低功耗的一些方法 一、流水线 电路最高工作频率:取决于最长的组合逻…

Windows下的详细Git安装

网址链接: Githttps://git-scm.com/ 下载后得到这个程序: 这里它给出的是使用Vim, 我改成的是VSCode: 第一种是让 Git 自己选择,名字是 master ,但是未来也有可能会改为其他名字; 第二种是我们自行决定&a…

大文件上传时如何做到秒传?

本文已经收录到Github仓库,该仓库包含计算机基础、Java基础、多线程、JVM、数据库、Redis、Spring、Mybatis、SpringMVC、SpringBoot、分布式、微服务、设计模式、架构、校招社招分享等核心知识点,欢迎star~ Github地址 大家好,我是大彬~ …

Selenium基础篇之Select下拉列表选择

文章目录前言一、页面准备二、场景三、设计1.引入库2.启动浏览器实例3.访问本地演示html文件4.定位到select标签5.选择橘子🍊5.1 通过索引5.2 通过value值5.3 通过text值6.强制等待7.结束webdriver进程结果前言 大家好,我是空空star,本篇给大…

ChatGPT火出圈,80%的设计师无事可做

自从疫情过后,设计行业开始变得很凌乱。很多同行开始打价格战,设计岗位逐渐演变成了一种新型的流水线。在我国,不管什么行业,到最终都会演变成饱和状态。用金融理论来说:供不应求,就赚钱,供过于…

STM32学习(十二)

软件定时原理 使用纯软件(CPU死等)的方式实现定时(延时)功能。 不精准:函数调用压栈进栈需要耗费额外的时间;流水线使得程序执行时间不确定。CPU死等。 定时器定时原理 使用精准的时基,通过…

【大数据之Hadoop】二、Hadoop生产集群搭建之完全分布式集群

1 运行准备 (1)准备3台客户机(关闭防火墙、设置静态IP和主机名称) (2)安装JDK,配置环境变量 (3)安装Hadoop,配置环境变量 (4)配置集群 (5)单点启动 (6)配置ssh (7)群起并测试集群 2 编写集群分发脚本xsync 集群分发脚本 在/hom…

OpenGL | 渲染带透明通道的2D精灵

一、Alpha测试 Alpha 测试的基本原理为:当绘制一个片元时,首先检测其 Alpha 值,若 Alpha 值满足要求,就通过测试,绘制此片元;否则丢弃此片元,不进行绘制。 glEnable(GL_ALPHA_TEST)&#xff1b…