Loading... <blockquote>在本博客中,ansible是一个系列文章,我们会尽量以通俗易懂的方式总结ansible的相关知识点。 ansible系列博文直达链接:<a href="https://www.zsythink.net/archives/tag/ansible/" target="_blank" rel="noopener">ansible轻松入门系列</a> “ansible系列”中的每篇文章都建立在前文的基础之上,所以,请按照顺序阅读这些文章,否则有可能在阅读中遇到障碍。</blockquote> 在ansible中使用变量,能让我们的工作变得更加灵活,在ansible中,变量的使用方式有很多种,我们慢慢聊。 先说说怎样定义变量,变量名应该由字母、数字、下划线组成,变量名需要以字母开头,ansible内置的关键字不能作为变量名。 由于之前的几篇文章都是在通过剧本举例,所以我们先聊聊怎样在playbook中使用变量。 如果我们想要在某个play中定义变量,可以借助vars关键字,示例如下 <div class="enlighter-default enlighter-v-standard enlighter-t-enlighter enlighter-hover enlighter-overflow-scroll"> <div class="enlighter-toolbar"> <div class="enlighter-btn enlighter-btn-raw"></div> <div class="enlighter-btn enlighter-btn-copy"></div> <div class="enlighter-btn enlighter-btn-window"></div> </div> <div class="enlighter"> <div class=""> <div><span class="enlighter-text">---</span></div> </div> <div class=""> <div><span class="enlighter-text">- hosts: test70</span></div> </div> <div class=""> <div><span class="enlighter-text"> vars:</span></div> </div> <div class=""> <div><span class="enlighter-text"> testvar1: testfile</span></div> </div> <div class=""> <div><span class="enlighter-text"> remote_user: root</span></div> </div> <div class=""> <div><span class="enlighter-text"> tasks:</span></div> </div> <div class=""> <div><span class="enlighter-text"> - name: task1</span></div> </div> <div class=""> <div><span class="enlighter-text"> file:</span></div> </div> <div class=""> <div><span class="enlighter-text"> path: /testdir/</span><span class="enlighter-g1">{{</span><span class="enlighter-text"> testvar1 </span><span class="enlighter-g1">}}</span></div> </div> <div class=""> <div><span class="enlighter-text"> state: touch</span></div> </div> </div> </div> 上例中,先使用vars关键字,表示在当前play中进行变量的相关设置。 vars关键字的下一级定义了一个变量,变量名为testvar1,变量值为testfile 当我们需要使用testvar1的变量值时,则需要引用这个变量,如你所见,使用”{{变量名}}”可以引用对应的变量。 也可以定义多个变量,示例如下。 <div class="enlighter-default enlighter-v-standard enlighter-t-enlighter enlighter-hover enlighter-overflow-scroll"> <div class="enlighter-toolbar"> <div class="enlighter-btn enlighter-btn-raw"></div> <div class="enlighter-btn enlighter-btn-copy"></div> <div class="enlighter-btn enlighter-btn-window"></div> </div> <div class="enlighter"> <div class=""> <div><span class="enlighter-text">vars:</span></div> </div> <div class=""> <div><span class="enlighter-text"> testvar1: testfile</span></div> </div> <div class=""> <div><span class="enlighter-text"> testvar2: testfile2</span></div> </div> </div> </div> 除了使用上述语法,使用YAML的块序列语法也可以定义变量,示例如下 <div class="enlighter-default enlighter-v-standard enlighter-t-enlighter enlighter-hover enlighter-overflow-scroll"> <div class="enlighter-toolbar"> <div class="enlighter-btn enlighter-btn-raw"></div> <div class="enlighter-btn enlighter-btn-copy"></div> <div class="enlighter-btn enlighter-btn-window"></div> </div> <div class="enlighter"> <div class=""> <div><span class="enlighter-text">vars:</span></div> </div> <div class=""> <div><span class="enlighter-text"> - testvar1: testfile</span></div> </div> <div class=""> <div><span class="enlighter-text"> - testvar2: testfile2</span></div> </div> </div> </div> 在定义变量时,还能够以类似”属性”的方式定义变量,示例如下 <div class="enlighter-default enlighter-v-standard enlighter-t-enlighter enlighter-hover enlighter-overflow-scroll"> <div class="enlighter-toolbar"> <div class="enlighter-btn enlighter-btn-raw"></div> <div class="enlighter-btn enlighter-btn-copy"></div> <div class="enlighter-btn enlighter-btn-window"></div> </div> <div class="enlighter"> <div class=""> <div><span class="enlighter-text">---</span></div> </div> <div class=""> <div><span class="enlighter-text">- hosts: test70</span></div> </div> <div class=""> <div><span class="enlighter-text"> remote_user: root</span></div> </div> <div class=""> <div><span class="enlighter-text"> vars:</span></div> </div> <div class=""> <div><span class="enlighter-text"> nginx:</span></div> </div> <div class=""> <div><span class="enlighter-text"> conf80: /etc/nginx/conf.</span><span class="enlighter-m3">d</span><span class="enlighter-text">/</span><span class="enlighter-n0">80.</span><span class="enlighter-m3">conf</span></div> </div> <div class=""> <div><span class="enlighter-text"> conf8080: /etc/nginx/conf.</span><span class="enlighter-m3">d</span><span class="enlighter-text">/</span><span class="enlighter-n0">8080.</span><span class="enlighter-m3">conf</span></div> </div> <div class=""> <div><span class="enlighter-text"> tasks:</span></div> </div> <div class=""> <div><span class="enlighter-text"> - name: task1</span></div> </div> <div class=""> <div><span class="enlighter-text"> file:</span></div> </div> <div class=""> <div><span class="enlighter-text"> path: </span><span class="enlighter-s0">"{{nginx.conf80}}"</span></div> </div> <div class=""> <div><span class="enlighter-text"> state: touch</span></div> </div> <div class=""> <div><span class="enlighter-text"> - name: task2</span></div> </div> <div class=""> <div><span class="enlighter-text"> file:</span></div> </div> <div class=""> <div><span class="enlighter-text"> path: </span><span class="enlighter-s0">"{{nginx.conf8080}}"</span></div> </div> <div class=""> <div><span class="enlighter-text"> state: touch</span></div> </div> </div> </div> 如上例所示,我定义了两个变量,两个变量的值对应两个nginx配置文件路径 <div class="enlighter-default enlighter-v-standard enlighter-t-enlighter enlighter-hover enlighter-overflow-scroll"> <div class="enlighter-toolbar"> <div class="enlighter-btn enlighter-btn-raw"></div> <div class="enlighter-btn enlighter-btn-copy"></div> <div class="enlighter-btn enlighter-btn-window"></div> </div> <div class="enlighter"> <div class=""> <div><span class="enlighter-text"> vars:</span></div> </div> <div class=""> <div><span class="enlighter-text"> nginx:</span></div> </div> <div class=""> <div><span class="enlighter-text"> conf80: /etc/nginx/conf.</span><span class="enlighter-m3">d</span><span class="enlighter-text">/</span><span class="enlighter-n0">80.</span><span class="enlighter-m3">conf</span></div> </div> <div class=""> <div><span class="enlighter-text"> conf8080: /etc/nginx/conf.</span><span class="enlighter-m3">d</span><span class="enlighter-text">/</span><span class="enlighter-n0">8080.</span><span class="enlighter-m3">conf</span></div> </div> </div> </div> 当我们需要引用这两个变量时,有两种语法可用 语法一 <div class="enlighter-default enlighter-v-standard enlighter-t-enlighter enlighter-hover enlighter-overflow-scroll"> <div class="enlighter-toolbar"> <div class="enlighter-btn enlighter-btn-raw"></div> <div class="enlighter-btn enlighter-btn-copy"></div> <div class="enlighter-btn enlighter-btn-window"></div> </div> <div class="enlighter"> <div class=""> <div><span class="enlighter-s0">"{{nginx.conf80}}"</span></div> </div> </div> </div> 语法二 <div class="enlighter-default enlighter-v-standard enlighter-t-enlighter enlighter-hover enlighter-overflow-scroll"> <div class="enlighter-toolbar"> <div class="enlighter-btn enlighter-btn-raw"></div> <div class="enlighter-btn enlighter-btn-copy"></div> <div class="enlighter-btn enlighter-btn-window"></div> </div> <div class="enlighter"> <div class=""> <div><span class="enlighter-s0">"{{nginx['conf8080']}}"</span></div> </div> </div> </div> 这样使用变量在逻辑上比较清晰,可以看出conf80与conf8080都属于nginx相关的配置。 细心如你一定发现了,上例中,我在引用变量时使用了双引号,而在本文的第一个示例中引用变量时却没有使用双引号,这是因为,第一个示例中的变量在被引用时,并没有处于”开头的位置”,第一个示例中变量被引用时如下 <div class="enlighter-default enlighter-v-standard enlighter-t-enlighter enlighter-hover enlighter-overflow-scroll"> <div class="enlighter-toolbar"> <div class="enlighter-btn enlighter-btn-raw"></div> <div class="enlighter-btn enlighter-btn-copy"></div> <div class="enlighter-btn enlighter-btn-window"></div> </div> <div class="enlighter"> <div class=""> <div><span class="enlighter-text">path: /testdir/</span><span class="enlighter-g1">{{</span><span class="enlighter-text"> testvar1 </span><span class="enlighter-g1">}}</span></div> </div> </div> </div> 当file模块的path参数引用对应的变量时,先写入了’/testdir/’,然后才引用了”testvar1″变量,{{ testvar1 }}并没有处于”开头的位置”,换句话说就是,{{ testvar1 }}前面还有字符串’/testdir/’ 而在上述后面的示例中引用变量时,变量被引用时如下,处于”开头的位置” <div class="enlighter-default enlighter-v-standard enlighter-t-enlighter enlighter-hover enlighter-overflow-scroll"> <div class="enlighter-toolbar"> <div class="enlighter-btn enlighter-btn-raw"></div> <div class="enlighter-btn enlighter-btn-copy"></div> <div class="enlighter-btn enlighter-btn-window"></div> </div> <div class="enlighter"> <div class=""> <div><span class="enlighter-text">path: </span><span class="enlighter-s0">"{{nginx.conf80}}"</span></div> </div> </div> </div> 这种情况下,我们引用变量时必须使用双引号引起被引用的变量,否则会报语法错误。 其实,上述情况也有例外 前文中有描述过,当在playbook中为模块的参数赋值时,可以使用”冒号”,也可以使用”等号”,当使用”等号”为模块的参数赋值时,则不用考虑引用变量时是否使用”引号”的问题,示例如下 <div class="enlighter-default enlighter-v-standard enlighter-t-enlighter enlighter-hover enlighter-overflow-scroll"> <div class="enlighter-toolbar"> <div class="enlighter-btn enlighter-btn-raw"></div> <div class="enlighter-btn enlighter-btn-copy"></div> <div class="enlighter-btn enlighter-btn-window"></div> </div> <div class="enlighter"> <div class=""> <div><span class="enlighter-text">---</span></div> </div> <div class=""> <div><span class="enlighter-text">- hosts: test70</span></div> </div> <div class=""> <div><span class="enlighter-text"> remote_user: root</span></div> </div> <div class=""> <div><span class="enlighter-text"> vars:</span></div> </div> <div class=""> <div><span class="enlighter-text"> nginx:</span></div> </div> <div class=""> <div><span class="enlighter-text"> conf80: /etc/nginx/conf.</span><span class="enlighter-m3">d</span><span class="enlighter-text">/</span><span class="enlighter-n0">80.</span><span class="enlighter-m3">conf</span></div> </div> <div class=""> <div><span class="enlighter-text"> conf8080: /etc/nginx/conf.</span><span class="enlighter-m3">d</span><span class="enlighter-text">/</span><span class="enlighter-n0">8080.</span><span class="enlighter-m3">conf</span></div> </div> <div class=""> <div><span class="enlighter-text"> tasks:</span></div> </div> <div class=""> <div><span class="enlighter-text"> - name: task1</span></div> </div> <div class=""> <div><span class="enlighter-text"> file:</span></div> </div> <div class=""> <div><span class="enlighter-text"> path=</span><span class="enlighter-g1">{{</span><span class="enlighter-text">nginx.</span><span class="enlighter-m3">conf80</span><span class="enlighter-g1">}}</span></div> </div> <div class=""> <div><span class="enlighter-text"> state=touch</span></div> </div> <div class=""> <div><span class="enlighter-text"> - name: task2</span></div> </div> <div class=""> <div><span class="enlighter-text"> file:</span></div> </div> <div class=""> <div><span class="enlighter-text"> path=</span><span class="enlighter-g1">{{</span><span class="enlighter-text">nginx</span><span class="enlighter-g1">[</span><span class="enlighter-s0">'conf8080'</span><span class="enlighter-g1">]}}</span></div> </div> <div class=""> <div><span class="enlighter-text"> state=touch</span></div> </div> </div> </div> 除了能够在playbook中直接定义变量,我们还可以在某个文件中定义变量,然后再在playbook中引入对应的文件,引入文件后,playbook 即可使用文件中定义的变量,你可能会问,为什么要多此一举呢?这是因为在某些工作场景中这样做很有用,比如,你想要让别人阅读你的playbook,却不想让别人看到某些值,可以使用这种办法,因为别人在阅读playbook时,只能看到引入的变量名,但是看不到变量对应的值,这种将变量分离到某个文件中的做法叫做”变量文件分离”,”变量文件分离”除了能够隐藏某些值,还能够让你将不同类的信息放在不同的文件中,并且让这些信息与剧本主体分开。 先来看看”变量文件分离”的一些小例子 首先,我们来定义一个专门用来存放nginx相关变量的文件(文件名为nginx_vars.yml),在文件中定义变量时,不要使用vars关键字,直接定义变量即可,定义变量的语法与在playbook中定义变量的几种语法相同 <div class="enlighter-default enlighter-v-standard enlighter-t-enlighter enlighter-hover enlighter-overflow-scroll"> <div class="enlighter-toolbar"> <div class="enlighter-btn enlighter-btn-raw"></div> <div class="enlighter-btn enlighter-btn-copy"></div> <div class="enlighter-btn enlighter-btn-window"></div> </div> <div class="enlighter"> <div class=""> <div><span class="enlighter-text">语法一示例:</span></div> </div> <div class=""> <div><span class="enlighter-text"> testvar1: testfile</span></div> </div> <div class=""> <div><span class="enlighter-text"> testvar2: testfile2</span></div> </div> <div class=""> <div><span class="enlighter-text">语法二示例:</span></div> </div> <div class=""> <div><span class="enlighter-text"> - testvar1: testfile</span></div> </div> <div class=""> <div><span class="enlighter-text"> - testvar2: testfile2</span></div> </div> <div class=""> <div><span class="enlighter-text">语法三示例:</span></div> </div> <div class=""> <div><span class="enlighter-text">nginx:</span></div> </div> <div class=""> <div><span class="enlighter-text"> conf80: /etc/nginx/conf.</span><span class="enlighter-m3">d</span><span class="enlighter-text">/</span><span class="enlighter-n0">80.</span><span class="enlighter-m3">conf</span></div> </div> <div class=""> <div><span class="enlighter-text"> conf8080: /etc/nginx/conf.</span><span class="enlighter-m3">d</span><span class="enlighter-text">/</span><span class="enlighter-n0">8080.</span><span class="enlighter-m3">conf</span></div> </div> </div> </div> 你可以选择你觉得较为舒适的语法定义变量,如下所示,直接在nginx_vars.yml文件中定义变量即可。 <div class="enlighter-default enlighter-v-standard enlighter-t-enlighter enlighter-hover enlighter-overflow-scroll"> <div class="enlighter-toolbar"> <div class="enlighter-btn enlighter-btn-raw"></div> <div class="enlighter-btn enlighter-btn-copy"></div> <div class="enlighter-btn enlighter-btn-window"></div> </div> <div class="enlighter"> <div class=""> <div><span class="enlighter-c0"># cat nginx_vars.yml</span></div> </div> <div class=""> <div><span class="enlighter-text">nginx:</span></div> </div> <div class=""> <div><span class="enlighter-text"> conf80: /etc/nginx/conf.</span><span class="enlighter-m3">d</span><span class="enlighter-text">/</span><span class="enlighter-n0">80.</span><span class="enlighter-m3">conf</span></div> </div> <div class=""> <div><span class="enlighter-text"> conf8080: /etc/nginx/conf.</span><span class="enlighter-m3">d</span><span class="enlighter-text">/</span><span class="enlighter-n0">8080.</span><span class="enlighter-m3">conf</span></div> </div> </div> </div> 在nginx_vars.yml中定义完相关变量后,即可在playbook中引入文件中的变量,在playbook中引入包含变量的文件时,需要使用”vars_files”关键字,被引入的文件需要以”- “开头,以YAML中块序列的语法引入,示例如下 <div class="enlighter-default enlighter-v-standard enlighter-t-enlighter enlighter-hover enlighter-overflow-scroll"> <div class="enlighter-toolbar"> <div class="enlighter-btn enlighter-btn-raw"></div> <div class="enlighter-btn enlighter-btn-copy"></div> <div class="enlighter-btn enlighter-btn-window"></div> </div> <div class="enlighter"> <div class=""> <div><span class="enlighter-text">---</span></div> </div> <div class=""> <div><span class="enlighter-text">- hosts: test70</span></div> </div> <div class=""> <div><span class="enlighter-text"> remote_user: root</span></div> </div> <div class=""> <div><span class="enlighter-text"> vars_files:</span></div> </div> <div class=""> <div><span class="enlighter-text"> - /testdir/ansible/nginx_vars.</span><span class="enlighter-m3">yml</span></div> </div> <div class=""> <div><span class="enlighter-text"> tasks:</span></div> </div> <div class=""> <div><span class="enlighter-text"> - name: task1</span></div> </div> <div class=""> <div><span class="enlighter-text"> file:</span></div> </div> <div class=""> <div><span class="enlighter-text"> path=</span><span class="enlighter-g1">{{</span><span class="enlighter-text">nginx.</span><span class="enlighter-m3">conf80</span><span class="enlighter-g1">}}</span></div> </div> <div class=""> <div><span class="enlighter-text"> state=touch</span></div> </div> <div class=""> <div><span class="enlighter-text"> - name: task2</span></div> </div> <div class=""> <div><span class="enlighter-text"> file:</span></div> </div> <div class=""> <div><span class="enlighter-text"> path=</span><span class="enlighter-g1">{{</span><span class="enlighter-text">nginx</span><span class="enlighter-g1">[</span><span class="enlighter-s0">'conf8080'</span><span class="enlighter-g1">]}}</span></div> </div> <div class=""> <div><span class="enlighter-text"> state=touch</span></div> </div> </div> </div> 上例中使用”vars_files”关键字引入了对应的变量文件,然后使用了文件中定义的变量。 上例中”vars_files”关键字只引入了一个变量文件,也可以引入多个变量文件,每个被引入的文件都需要以”- “开头,示例如下 <div class="enlighter-default enlighter-v-standard enlighter-t-enlighter enlighter-hover enlighter-overflow-scroll"> <div class="enlighter-toolbar"> <div class="enlighter-btn enlighter-btn-raw"></div> <div class="enlighter-btn enlighter-btn-copy"></div> <div class="enlighter-btn enlighter-btn-window"></div> </div> <div class="enlighter"> <div class=""> <div><span class="enlighter-text"> vars_files:</span></div> </div> <div class=""> <div><span class="enlighter-text"> - /testdir/ansible/nginx_vars.</span><span class="enlighter-m3">yml</span></div> </div> <div class=""> <div><span class="enlighter-text"> - /testdir/ansible/other_vars.</span><span class="enlighter-m3">yml</span></div> </div> </div> </div> “vars”关键字和”vars_files”关键字可以同时使用,如下 <div class="enlighter-default enlighter-v-standard enlighter-t-enlighter enlighter-hover enlighter-overflow-scroll"> <div class="enlighter-toolbar"> <div class="enlighter-btn enlighter-btn-raw"></div> <div class="enlighter-btn enlighter-btn-copy"></div> <div class="enlighter-btn enlighter-btn-window"></div> </div> <div class="enlighter"> <div class=""> <div><span class="enlighter-text"> vars:</span></div> </div> <div class=""> <div><span class="enlighter-text"> - conf90: /etc/nginx/conf.</span><span class="enlighter-m3">d</span><span class="enlighter-text">/</span><span class="enlighter-n0">90.</span><span class="enlighter-m3">conf</span></div> </div> <div class=""> <div><span class="enlighter-text"> vars_files:</span></div> </div> <div class=""> <div><span class="enlighter-text"> - /testdir/ansible/nginx_vars.</span><span class="enlighter-m3">yml</span></div> </div> </div> </div> 除了上述总结,ansible还有一些其他的关于变量的使用方法,暂且放到下一篇文章吧,希望这篇文章能够帮助到你,加油~ 转载自朱双印日志https://www.zsythink.net/archives/2655 Last modification:May 29, 2024 © Allow specification reprint Like 如果觉得我的文章对你有用,请随意赞赏