Linux自动化运维(Shell与Ansible)(微课版) 课件 项目8 变量与事实_第1页
Linux自动化运维(Shell与Ansible)(微课版) 课件 项目8 变量与事实_第2页
Linux自动化运维(Shell与Ansible)(微课版) 课件 项目8 变量与事实_第3页
Linux自动化运维(Shell与Ansible)(微课版) 课件 项目8 变量与事实_第4页
Linux自动化运维(Shell与Ansible)(微课版) 课件 项目8 变量与事实_第5页
已阅读5页,还剩59页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Linux自动化运维项目8:变量与事实

学习目标【知识目标】了解Ansible变量的定义和引用基本概念。了解vars和vars_files

关键字的用法。了解事实变量和注册变量基本概念。了解主机和主机组变量、特殊变量基本概念。【技能目标】掌握Ansible变量的定义和调用方法。掌握事实变量的使用方法,能够使用Ansible事实引用受管主机的数据。掌握注册变量的使用方法,能够使用register关键字捕获任务的输出。掌握groups、group_names、inventory_hostname、hostvars

特殊变量的调用方法。【素质目标】培养读者诚信、务实、严谨的职业素养,培养其正确的职业道德观念和职业操守,使其实事求是、严谨治学,以诚信为基础,做一个优秀的职业人员。培养读者系统分析与解决问题的能力,使其能够掌握相关知识点并完成项目任务。变量与事实任务1:变量概述目录/Contents010203定义和引用变量在文件中引用变量布尔值变量04

列表变量05

字典变量01定义和引用变量定义和引用变量变量可以指在计算机存储器里存在值的被命名的存储空间。Ansible使用变量来管理不同主机之间的差异,变量可以是不同类型的值,比如字符串、数字、布尔值、列表、字典等。Ansible可以在命令行、Playbook、清单文件、角色中定义和引用变量,通常使用标准的YAML语法创建变量。通过使用变量,可以让自动化任务更加灵活,根据每个主机的不同情况自动化适应其配置。在Ansible中定义变量要满足基本的命名规则,并非所有的字符串都是有效的Ansible变量名,变量名只能由字母、数字、下画线组成,变量名不能以数字开头,Python关键字或Playbook关键字不是有效的变量名。而以下画线开头的变量名可以使用,但不能保证其私有性或安全性。Ansible有效和无效变量名示例如表所示:序号有效的变量名无效的变量名1foo*foo,Python关键字,比如async、lambda、for、when等2foo_envPlayboook关键字,比如become、vars、register等3foo_portfoo-port、fooport、foo.port4foo5、_foo5foo、12定义和引用变量使用标准的YAML语法定义一个简单的变量时,只需要使用冒号(:)将变量名和变量值分隔开,如下所示:在定义变量后,使用Jinja2语法来引用变量。Jinja2变量使用双花括号,比如表达式“Myampgoesto{{max_amp_value}}”表示引用变量的基本形式。在Playbook中引用变量时,需要使用{{}}标识变量名,如下所示:-name:Mytaskdebug:msg:Thevalueofmy_varis{{my_var}}my_var:some_value定义和引用变量在YAML文件中,如果在一个值的开头使用了{{my_var}}这样的表达式,它通常用于引用变量。由于YAML语法中使用花括号标识字典,所以解释器无法确定该表达式表示变量还是字典。为了避免这种歧义,需要将整个表达式放在引号中,以便解释器正确地解释整个表达式。如果没有引号,解释器就会解释失败并显示错误消息。-name:Mytaskdebug:msg:"{{my_var}}/18"在Ansible中,vars关键字用于在Playbook中定义变量,这些变量可以直接在任务中使用,使Playbook更加灵活和可配置。vars关键字的基本语法如下:vars:var1:value1var2:value2var3:value3定义和引用变量在下面的示例中,使用var关键字定义一个名为my_var的变量,它的值是字符串“Hello,World!”,在任务中使用debug模块和msg选项来输出这个变量的值。-name:Defineandprintavariablehosts:localhostvars:my_var:"Hello,World!"tasks:-debug:msg:"{{my_var}}"02在文件中引用变量在文件中引用变量在Ansible中,vars_files关键字用于在Playbook中引用存储变量的文件,这些文件可以是YAML格式或JSON格式的。vars_files关键字的基本语法如下:vars_files:-path/to/varfile1.yml-path/to/varfile2.yml其中,path/to/varfile1.yml和path/to/varfile2.yml是包含变量的YAML文件的路径。在文件中引用变量在上面的示例中,vars_files关键字用于从vars.yml文件中加载变量,这些变量可以在Playbook的任务中使用。#变量文件vars.yml---var1:value1var2:value2var3:value3#在Playbook中引用文件中的变量-name:Exampleplaybookhosts:web_serversvars_files:-vars.ymltasks:-name:Task1debug:msg:Var1is{{var1}},var2is{{var2}},var3is{{var3}}在Playbook中,使用vars_files关键字来加载vars.yml文件中定义的变量:03布尔值变量布尔值变量在Ansible中,布尔值变量可以用不同的形式来表示,包括true/false、1/0、yes/no、True/False等。在匹配有效字符串时,不区分字母大小写。ansible-lint是一个用于检查AnsiblePlaybook是否符合规范的工具,该工具更倾向于使用true/false作为布尔值,文档中的示例也采用这种方式,保持与ansible-lint默认设置的兼容性。常见的布尔值表示形式如表所示:序号布尔值布尔值表示1真值True、'true'、't'、'yes'、'y'、'on'、'1'、1、1.02假值False、'false'、'f'、'no'、'n'、'off'、'0'、0、0.004列表变量列表变量列表变量是一种常见的变量类型,是由变量名和多个值组合在一起的单个变量。列表变量可以通过定义一个包含多个值的项目化列表,或使用方括号[]包含多个值并用逗号分隔来创建。列表变量可以包含多种类型的值,比如字符串、数字、布尔值、其他列表等,常用于存储一组相关的值,比如IP地址列表、文件路径列表。在Playbook中,可以使用列表变量来定义任务的目标主机、执行特定模块的参数、应用特定配置文件的路径等。列表变量可以使用YAML格式的语法定义,示例如下:my_list:-value1-value2-value3列表变量在这个示例中,我们定义了一个名为my_list的列表变量,它包含3个字符串值value1、value2和value3。引用列表变量时,可以通过指定其索引来访问列表中的特定项。在列表中,第一个项的索引为0,第二个项的索引为1,以此类推。可以仅使用列表中的特定项来执行特定任务,而不必引用整个列表。在Playbook中引用列表变量my_list中的第二个值,示例如下:-name:Printthesecondvalueinmy_listdebug:msg:"Thesecondvalueofmy_varis{{my_list[1]}05字典变量字典变量字典是将数据存储在键值对中的一种数据结构,其中每个键值对表示一个特定的数据项。字典变量可以包含多种类型的值,比如字符串、数字、布尔值、列表、其他字典等。在使用字典变量时,可以使用键来访问特定的值,以便执行特定的任务或操作。在Ansible中,可以使用YAML语法定义字典变量,示例如下:my_dict:key1:value1key2:value2key3:value3在上述示例中,定义了一个名为my_dict的字典变量,它包含3个键值对,其中键是key1、key2和key3,值分别为value1、value2和value3。字典变量引用字典变量时,可以使用方括号或点号来访问该字典中的单个特定键值。在Playbook中引用字典变量my_dict中的key2键的值value2,示例如下:-name:Printthevalueofkey2inmy_dictdebug:msg:"Thethevalueofkey2inmy_dictis{{my_dict['key2']}-name:Printthevalueofkey2inmy_dictdebug:msg:"Thethevalueofkey2inmy_dictis{{my_dict.key2}上述两个示例都引用了相同的值value2。在Ansible中使用字典变量时,推荐使用方括号形式来访问特定的键值。字典变量在Ansible中,注册变量、事实变量、特殊变量存储的数据都是嵌套类型的数据结构。引用嵌套变量示例如下:-name:Printcompanyinformationhosts:localhostvars:web_servers:-name:webserver1ip:ports:-80-443-name:webserver2ip:ports:-80-443db_servers:-name:dbserver1ip:ports:-3306tasks:-name:Printweb_serverIPAddressdebug:msg:"Thisisweb_serverip{{web_servers[0].ip}}"-name:Printdb_serversIPAddressdebug:msg:"Thisisdb_serversip{{db_servers[0].name}}"在示例中,定义了两个列表,一个是web_servers,另一个是db_servers,每个列表中都包含一个或多个嵌套的变量。web_servers列表中的每个元素都是一个字典,包含名字、IP地址和端口信息。同样,db_servers列表中的每个元素也是一个字典,包含名字、IP地址和端口信息。字典变量要引用嵌套变量的值,可以使用点号表示法或方括号表示法。获取web_servers列表中第一个元素的IP地址,可以使用{{web_servers[0].ip}};获取db_servers列表中第一个元素的名字,可以使用{{db_servers[0]['name']}}。注意:如果变量的键名以两个下划线开头和结尾(如__example__),则在这种情况下,使用点符号直接引用变量的特定值可能导致错误。为避免潜在冲突,推荐使用方括号方式来引用变量的值。谢谢变量与事实任务2:主机(组)变量、注册变量01主机和主机组变量主机和主机组变量在Ansible中,可以通过多种方式定义变量,可以在Playbook中定义、在清单文件中定义或者在任务中定义,而使用group_vars和host_vars目录定义变量可以使代码更加模块化、可读性更强、可维护性更高,并且能够更好地组织和共享变量。定义主机和主机组变量的首选做法是在与清单文件相同的目录中,创建group_vars和host_vars两个目录,这两个目录分别包含用于定义组变量和主机变量的文件。主机和组变量文件必须使用YAML语法,其有效的文件扩展名包括.yml、.yaml、.json等,但扩展名不是必需的。主机和主机组变量使用group_vars和host_vars目录定义基于主机和主机组的变量文件时,group_vars目录中定义的变量将自动应用于组内的所有主机,host_vars目录中定义的变量仅应用于指定的主机。典型的group_vars和host_vars目录结构和变量文件如下所示:├──group_vars│├──all││├──vars.yml││└──secrets.yml│├──db││└──vars.yml│└──web│└──vars.yml├──host_vars│├──mysqlserver.yml│├──pgserver.yml│├──│└──├──playbook.yml└──inventory└──ansible.cfg主机和主机组变量在group_vars目录中创建名为all的子目录,它可以为所有主机设置全局变量。这意味着在all目录下的变量文件中定义的变量将适用于所有主机,而不仅仅是某个组或某个主机。在下面的清单文件中,有两个主机组,分别是web组和db组,web组包括两个主机,分别是、,db组也包括两个主机,分别是mysqlserver、pgserver。[web][db]mysqlserverpgserver主机和主机组变量group_vars目录包含按组定义的变量文件,可以在group_vars目录中分别创建名为web和db的YAML格式文件来定义与组相关的变量。#group_vars/web.ymlhttp_port:80https_port:443#group_vars/db.ymlmysql_version:80pg_version:12host_vars目录包含按主机定义的变量文件。可以在host_vars目录中创建一个名为的YAML格式文件来定义与对应主机相关的变量。root_document:/var/www/htmlconfig_file:vhost.conf主机和主机组变量在Playbook文件中编写任务,可以直接调用变量。----name:Exampleplaybook1hosts:webtasks:-name:PrintHTTPportandHTTPdocumentdebug:msg:"HTTPportis{{http_port}},HTTPdocumentis{{root_document}},HTTPconfigurationfileis{{config_file}}"-name:Exampleplaybook2hosts:dbtasks:-name:Displaydatabaseserverversiondebug:msg:"MySQLversionis{{mysql_version}}andPostgreSQLversionis{{pg_version}}"02注册变量注册变量注册变量是Ansible中的一种特殊变量,用于保存任务执行后产生的输出结果。运维工程师或系统工程师通常会根据模块的返回值来判断自动化任务执行成功或失败,但模块返回值通常不能满足这个需求,这时就可以使用注册变量来保存任务的输出结果,以便在后续任务中使用。注册变量的主要作用是在后续的任务或模块中使用模块的执行结果,实现模块之间的数据共享。通过使用注册变量,可以避免在不同的模块中重复执行相同的任务。同时,注册变量也可以用于任务执行状态的检查和错误信息的处理,以提高任务执行的可靠性和稳定性。注册变量可以是简单变量、列表变量、字典变量或复杂嵌套数据结构。注册变量存储在内存中,只在当前Playbook运行期间有效。注册变量注册变量使用register关键字在任务中定义,任务可将结果保存到指定的变量中。在示例中,第1个任务使用shell模块运行了df-h命令,并将输出结果存储到了一个名为disk_space的注册变量中;在第2个任务中,使用debug模块输出了disk_space变量的stdout_lines属性,该属性包含df-h命令的输出结果;第3个任务使用stat模块检查/path/to/file.txt这个文件是否存在,并将结果存储在file_stat变量中;第4个任务使用debug模块输出一条消息,消息内容是Fileexists:{{file_stat.stat.exists}},这里使用了{{file_stat.stat.exists}}来判断文件是否存在,如果存在则输出true,否则输出false。-name:Getdiskspaceshell:df-hregister:disk_space-name:Printdiskspacedebug:var:disk_space.stdout_lines-name:Checkiffileexistsstat:path:/path/to/file.txtregister:file_stat-name:Printfileexistsstatusdebug:msg:"Fileexists:{{file_stat.stat.exists}}"谢谢变量与事实任务3:事实变量目录/Contents01事实变量简介02setup模块03set_fact模块01事实变量简介事实变量简介在Ansible中,事实信息是指与主机系统相关的数据,包括操作系统版本、内核版本、内存、CPU、网络地址、主机名、文件系统等。事实信息是Ansible在执行任务时自动收集的,不需要额外配置,它可以帮助用户获取目标主机的环境信息、IT基础设施状态,或者作为条件和参数用于后续任务中,以便根据目标主机的系统信息执行不同的任务。Ansible事实变量就是存储事实信息的数据结构,通过ansible_facts变量或带有ansible_前缀的顶级变量引用具体的事实信息。事实变量简介常见的事实变量如表所示:序号事实变量名描述1ansible_distribution目标主机的操作系统发行版名称,如Ubuntu、CentOS等2ansible_distribution_version目标主机的操作系统版本号,如7、8、9、18.04等3ansible_fqdn目标主机的完全限定域名4ansible_hostname目标主机的主机名5ansible_default_ipv4目标主机默认IPv4地址6ansible_memtotal_mb目标主机的内存容量,单位为MB7ansible_processor_vcpus目标主机的处理器虚拟核心数量8ansible_architecture目标主机的系统架构,如x86_64等9ansible_date_time目标主机的日期和时间信息,包括当前时间、日期、时区等10ansible_mounts目标主机当前系统挂载的文件系统信息,包括挂载点、文件系统类型、设备名称、容量、使用情况等信息11ansible_interfaces目标主机网络接口信息12ansible_devices目标主机上的设备信息,包括硬盘、分区、磁盘容量等调用事实变量Ansible使用ansible_facts变量存储事实信息。ansible_facts使用基于Python字典类型的数据结构存储数据,字典是一种无序的键值对集合,字典变量中的键是代表系统信息的字符串,而值是与键相关联的系统信息数据。默认情况下,常见的Ansible事实信息可以作为顶级变量访问,这些变量以ansible_开头。比如可以使用ansible_distribution变量获取远程主机的操作系统发行版名称,使用ansible_facts['default_ipv4']['address']变量获取远程主机的默认IPv4地址。这些变量可以在AnsiblePlaybook中直接使用。调用事实变量在示例中,第1个任务使用debug模块输出所有事实信息;第2个任务使用debug模块输出ansible_facts['default_ipv4']['address']事实信息,即输出远程主机的操作系统发行版名称;第3个任务使用debug模块输出ansible_all_ipv4_addresses变量,将INJECT_FACTS_AS_VARS的值设置为false,不需要在ansible_default_ipv4['address']前面添加ansible_facts,即可输出默认的IPv4地址。----name:Printfactsmessagehosts:webtasks:-name:Printallavailablefactsdebug:var:ansible_facts-name:Printsystemfactsbeginwiththeansibleprefixdebug:var:ansible_facts['ansible_distribution’]-name:PrintsystemfactswithINJECT_FACTS_AS_VARSdisableddebug:var:ansible_default_ipv4['address’]vars:INJECT_FACTS_AS_VARS:false调用事实变量默认情况下,Ansible会在每个play开始时收集事实信息,也可以通过在Playbook中设置gather_facts来禁用事实信息收集。收集主机的事实信息可能会占用一定的时间和资源,因此在执行大规模自动化任务或需要快速执行任务的情况下,可以通过将gather_facts设置为false来禁用事实信息收集,从而提高Ansible的执行效率。-name:Exampleplaybookhosts:allgather_facts:falsetasks:-name:Exampletaskshell:echo"Hello,world!"需要注意的是,如果某些任务需要调用事实信息才能正确运行,禁用事实信息收集可能会导致这些任务无法正常执行。在这种情况下,可以手动指定所需的事实信息,或者在任务中使用delegate_to或local_action将任务委托给另一个主机或本地执行。02setup模块setup模块setup模块是用于收集主机事实信息的内置模块。此模块可在Playbook中通过任务自动调用,也可以通过/usr/bin/ansible直接执行。当使用setup模块时,可以使用filter参数来指定要收集的系统信息的子集,filter参数可接收一个字符串列表,其中每个字符串都是一个要收集的系统信息的名称或模式。setup模块示例如表所示:序号示例描述1ansibleall-mansible.builtin.setup-a'filter=ansible_eth[0-2]'在所有主机上执行setup模块,收集主机的事实信息,并只显示与过滤器ansible_eth[0-2]匹配的网络接口(eth0、eth1、eth2)的信息2ansibleall-mansible.builtin.setup-a'gather_subset=network,virtual'在所有主机上执行setup模块,只收集与网络和虚拟化有关的事实信息4ansibleall-mansible.builtin.setup-a'gather_subset=!all'只收集默认的最小事实集5ansibleall-msetup-a"filter=*ipv4*只返回包含ipv4的事实信息,比如过滤器匹配了ansible_default_ipv4和ansible_all_ipv4_addresses两个键,因此会返回包含这两个键的所有事实信息6ansibleall-msetup-a"filter=*mem*"只返回包含mem的事实信息,输出结果是每个主机的ansible_facts字典的所有键中包含mem字符串的事实信息,例如内存容量和使用情况等03set_fact模块set_fact模块set_fact模块的主要作用是在Playbook运行过程中设置或修改变量,这些变量可以根据实际需求进行调整,并在Playbook的其他任务中使用,从而实现更灵活的任务控制与参数传递。set_fact模块的基本语法如下:其中,variable_name表示要设置或修改的变量名,variable_value表示要设置或修改的变量值,可以是字符串、数字或其他合法的YAML数据。-name:Setvariablevalueset_fact:variable_name:variable_valueset_fact模块set_fact设置变量示例:-name:Printsetfactvarhosts:localhostvars:my_variable:"original_value"tasks:-name:Setanewvariableset_fact:new_variable:"new_value"-name:Modifyanexistingvariableset_fact:my_variable:"modified_value"-name:Printthevariablesdebug:msg:|Thisis{{my_variable}}Thisisother{{new_variable}}在上述示例中,首先定义了一个名为my_variable的变量,并将其设置为字符串original_value。第1个任务使用set_fact模块创建一个名为new_variable的变量,并将其设置为字符串new_value。第2个任务使用相同的set_fact模块,但将my_variable的值更改为字符串modified_value。第3个任务使用debug模块输出两个变量的值。谢谢变量与事实任务4:特殊变量目录/Contents010203特殊变量简介groups变量group_names变量04inventory_hostname变量05hostvars变量01特殊变量简介特殊变量简介特殊变量是Ansible中预定义的一组变量,用于存储有关目标主机、执行环境和运行状态的信息。这些变量可以在Playbook或模板中直接引用,而无须事先定义或声明。通过特殊变量可以管理和操作主机的连接方式、事实信息,以及控制Ansible的行为和输出。常见的特殊变量类型如表所示:序号特殊变量类型描述1ConnectionVariables连接类型的特殊变量,用于控制连接目标主机的方式和参数,例如ansible_connection、ansible_host、ansible_become_user、ansible_user、ansible_python_interpreter等2FactsVariables事实变量,用于存储目标主机的事实信息,例如ansible_facts、ansible_local等3MagicVariables魔术变量或者魔法变量,用于控制Ansible的行为和输出,例如ansible_loop、ansible_skip_tags、ansible_play_batch、groups、group_names、inventory_hostname、hostvars等02groups变量groups变量groups变量用于表示当前主机所属的所有组,它是一个字典类型的变量,其中键是组名,值是该组中所有主机的列表。比如清单文件中有两个组,分别是webserver和dbserver。[webserver][dbserver]在Playbook中使用groups变量,其中包含所有主机组的名称,以及对应组内的所有主机信息。{"all":["","","",""],"webserver":["",""],"dbserver":["",""]}groups变量使用groups变量在Playbook中输出webserver组的所有主机。-name:Exampleplaybookhosts:webservertasks:-name:Showallhostsinwebserversgroupdebug:msg:"{{groups['webserver']}}"示例用于显示"webserver"主机组中的所有主机。Debug是Ansible的内置模块,用于打印调试信息。msg:“{{groups[‘webserver’]}}”是debug模块的参数,用于指定要打印的消息。{{groups['webserver']}}是一个Jinja2模板表达式,用于获取名为"webserver"的主机组中的所有主机。groups是一个Ansible内置的变量,用于访问主机组信息。TASK[Showallhostsinwebserversgroup]ok:[]=>{"msg":["",""]}执行Playbook,在名为“webserver”的主机组中找到了两个主机,并将它们作为消息打印出来。03group_names变量group_names变量groups变量用于表示当前主机所属的所有组,它是一个字典类型的变量,其中键是组名,值是该组中所有主机的列表。比如清单文件中有两个组,分别是webserver和dbserver。[webserver][dbserver][devops]

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论