Loading... <blockquote>在本博客中,ansible是一个系列文章,我们会尽量以通俗易懂的方式总结ansible的相关知识点。 ansible系列博文直达链接:<a href="https://www.zsythink.net/archives/tag/ansible/" target="_blank" rel="noopener">ansible轻松入门系列</a> “ansible系列”中的每篇文章都建立在前文的基础之上,所以,请按照顺序阅读这些文章,否则有可能在阅读中遇到障碍。</blockquote> 承接前文,这篇文章将继续介绍变量的一些使用方法。 <h2 id="wznav_0">注册变量</h2> ansible的模块在运行之后,其实都会返回一些”返回值”,只是默认情况下,这些”返回值”并不会显示而已,我们可以把这些返回值写入到某个变量中,这样我们就能够通过引用对应的变量从而获取到这些返回值了,这种将模块的返回值写入到变量中的方法被称为”注册变量”,那么怎样将返回值注册到变量中呢?我们来看一个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"> tasks:</span></div> </div> <div class=""> <div><span class="enlighter-text"> - name: test shell</span></div> </div> <div class=""> <div><span class="enlighter-text"> shell: </span><span class="enlighter-s0">"echo test > /var/testshellfile"</span></div> </div> <div class=""> <div><span class="enlighter-text"> register: testvar</span></div> </div> <div class=""> <div><span class="enlighter-text"> - name: shell module </span><span class="enlighter-k1">return</span><span class="enlighter-text"> values</span></div> </div> <div class=""> <div><span class="enlighter-text"> debug:</span></div> </div> <div class=""> <div><span class="enlighter-text"> var: testvar</span></div> </div> </div> </div> 上例中共有两个任务,第一个任务使用shell模块在test70主机中创建了一个测试文件 /var/testshellfile,将字符”test”输入到了测试文件中,然后使用”register”关键字将当前shell任务的返回值写入了名为”testvar”的变量中,第二个任务使用debug模块输出了第一个任务中的注册变量的值,没错,注册变量就是这么简单,使用register关键字指定对应的变量名即可。 上述playbook执行后,可以在控制台中看到名为”[shell module return values]”的任务中已经显示了第一个任务的返回值的信息,返回信息如下 <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">TASK </span><span class="enlighter-g1">[</span><span class="enlighter-text">shell module </span><span class="enlighter-k1">return</span><span class="enlighter-text"> values</span><span class="enlighter-g1">]</span> <span class="enlighter-g0">**********************************************************************</span></div> </div> <div class=""> <div><span class="enlighter-text">ok: </span><span class="enlighter-g1">[</span><span class="enlighter-text">test70</span><span class="enlighter-g1">]</span><span class="enlighter-text"> =</span><span class="enlighter-g1">></span> <span class="enlighter-g1">{</span></div> </div> <div class=""> <div><span class="enlighter-s0">"testvar"</span><span class="enlighter-text">: </span><span class="enlighter-g1">{</span></div> </div> <div class=""> <div><span class="enlighter-s0">"changed"</span><span class="enlighter-text">: </span><span class="enlighter-k1">true</span><span class="enlighter-text">, </span></div> </div> <div class=""> <div><span class="enlighter-s0">"cmd"</span><span class="enlighter-text">: </span><span class="enlighter-s0">"echo test > /var/testshellfile"</span><span class="enlighter-text">, </span></div> </div> <div class=""> <div><span class="enlighter-s0">"delta"</span><span class="enlighter-text">: </span><span class="enlighter-s0">"0:00:00.003808"</span><span class="enlighter-text">, </span></div> </div> <div class=""> <div><span class="enlighter-s0">"end"</span><span class="enlighter-text">: </span><span class="enlighter-s0">"2018-06-17 20:42:37.675382"</span><span class="enlighter-text">, </span></div> </div> <div class=""> <div><span class="enlighter-s0">"failed"</span><span class="enlighter-text">: </span><span class="enlighter-k1">false</span><span class="enlighter-text">, </span></div> </div> <div class=""> <div><span class="enlighter-s0">"rc"</span><span class="enlighter-text">: </span><span class="enlighter-n1">0</span><span class="enlighter-text">, </span></div> </div> <div class=""> <div><span class="enlighter-s0">"start"</span><span class="enlighter-text">: </span><span class="enlighter-s0">"2018-06-17 20:42:37.671574"</span><span class="enlighter-text">, </span></div> </div> <div class=""> <div><span class="enlighter-s0">"stderr"</span><span class="enlighter-text">: </span><span class="enlighter-s0">""</span><span class="enlighter-text">, </span></div> </div> <div class=""> <div><span class="enlighter-s0">"stderr_lines"</span><span class="enlighter-text">: </span><span class="enlighter-g1">[]</span><span class="enlighter-text">, </span></div> </div> <div class=""> <div><span class="enlighter-s0">"stdout"</span><span class="enlighter-text">: </span><span class="enlighter-s0">""</span><span class="enlighter-text">, </span></div> </div> <div class=""> <div><span class="enlighter-s0">"stdout_lines"</span><span class="enlighter-text">: </span><span class="enlighter-g1">[]</span></div> </div> <div class=""> <div><span class="enlighter-g1">}</span></div> </div> <div class=""> <div><span class="enlighter-g1">}</span></div> </div> </div> </div> 从上述返回信息可以看出,返回值是json格式的,上述返回值中包含一些键值对,比如 “changed”: true 或 “cmd”: “echo test > /var/testshellfile”等, 如果你只是想要获取到返回值中的某一项特定值,只需要指定键值对中的key即可,假设,我只是想要获取到上述返回信息中cmd的值,则可以使用如下两种语法(前文中已经对如下两种语法进行过示例,此处不再赘述)。 <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"> - name: shell module </span><span class="enlighter-k1">return</span><span class="enlighter-text"> values</span></div> </div> <div class=""> <div><span class="enlighter-text"> debug:</span></div> </div> <div class=""> <div><span class="enlighter-text"> msg: </span><span class="enlighter-s0">"{{testvar.cmd}}"</span></div> </div> <div class=""> <div><span class="enlighter-text">语法二</span></div> </div> <div class=""> <div><span class="enlighter-text"> - name: shell module </span><span class="enlighter-k1">return</span><span class="enlighter-text"> values</span></div> </div> <div class=""> <div><span class="enlighter-text"> debug:</span></div> </div> <div class=""> <div><span class="enlighter-text"> msg: </span><span class="enlighter-s0">"{{testvar['cmd']}}"</span></div> </div> </div> </div> 上述示例的返回信息为shell模块的返回值,如果你想要了解返回值中每一项的含义,则可以查看官方手册,我使用的是2.4版本的ansible,所以我可以参考2.4版本的官网文档,找到shell模块的介绍,官网链接如下 <span class="external-link"><a class="no-external-link" href="https://www.zsythink.net/wp-content/themes/zibll/go.php?url=aHR0cHM6Ly9kb2NzLmFuc2libGUuY29tL2Fuc2libGUvMi40L3NoZWxsX21vZHVsZS5odG1s" target="_blank"><i data-feather="external-link"></i>https://docs.ansible.com/ansible/2.4/shell_module.html</a></span> 不同的模块,返回值也不尽相同,ansible官网对一些常见的返回值进行了总结,链接如下 <span class="external-link"><a class="no-external-link" href="https://www.zsythink.net/wp-content/themes/zibll/go.php?url=aHR0cHM6Ly9kb2NzLmFuc2libGUuY29tL2Fuc2libGUvMi40L2NvbW1vbl9yZXR1cm5fdmFsdWVzLmh0bWw=" target="_blank"><i data-feather="external-link"></i>https://docs.ansible.com/ansible/2.4/common_return_values.html</a></span> 如果你想要查看模块对应的返回值,可以先查找官方手册,但是,并不是所有模块的官方手册中都对模块的返回值进行了描述,你可以使用上述示例中的方法,自己查看模块的返回值,这些返回值不仅仅能够用于输出,通常我们会利用到这些返回值,比如,通过模块的返回值决定之后的一些动作,所以,注册变量在playbook中还是会被经常用到的,在之后的文章中我们会给出示例,此处不用纠结。 <h2 id="wznav_1">提示用户输入信息并写入变量</h2> 在运行某些脚本时,有时候脚本会提示用户输入一些信息,脚本需要根据用户输入的信息决定下一步的动作,这种”交互”有时候是必须的,那么,在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_prompt:</span></div> </div> <div class=""> <div><span class="enlighter-text"> - name: </span><span class="enlighter-s0">"your_name"</span></div> </div> <div class=""> <div><span class="enlighter-text"> prompt: </span><span class="enlighter-s0">"What is your name"</span></div> </div> <div class=""> <div><span class="enlighter-text"> - name: </span><span class="enlighter-s0">"your_age"</span></div> </div> <div class=""> <div><span class="enlighter-text"> prompt: </span><span class="enlighter-s0">"How old are you"</span></div> </div> <div class=""> <div><span class="enlighter-text"> tasks:</span></div> </div> <div class=""> <div><span class="enlighter-text"> - name: output vars</span></div> </div> <div class=""> <div><span class="enlighter-text"> debug:</span></div> </div> <div class=""> <div><span class="enlighter-text"> msg: Your name is </span><span class="enlighter-g1">{{</span><span class="enlighter-text">your_name</span><span class="enlighter-g1">}}</span><span class="enlighter-text">,You are </span><span class="enlighter-g1">{{</span><span class="enlighter-text">your_age</span><span class="enlighter-g1">}}</span><span class="enlighter-text"> years old.</span></div> </div> </div> </div> 如上例所示,我们使用”vars_prompt”关键字创建了两个变量,这两个变量的名称分别为”your_name” 和 “your_age”,当运行上例playbook时,会出现 “What is your name”的提示信息,然后用户输入的信息会存入到”your_name”变量中,之后,会出现 “How old are you”的提示信息,用户输入的信息会存入到”your_age”变量中,上例中的”output vars”任务会输出一句话,这句话中包含了上述两个变量的值,我们来看一下上例的执行效果。 <img class=" lazyloaded" src="https://www.zsythink.net/wp-content/uploads/2018/06/062118_0818_1.png" alt="" data-src="https://www.zsythink.net/wp-content/uploads/2018/06/062118_0818_1.png" style=""> 如上图所示,运行playbook时会提示输入你的名字,输入你的年龄,你输入的内容并不会显示在屏幕上,在完成提示输入的内容后,在”output 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"> vars_prompt:</span></div> </div> <div class=""> <div><span class="enlighter-text"> - name: </span><span class="enlighter-s0">"your_name"</span></div> </div> <div class=""> <div><span class="enlighter-text"> prompt: </span><span class="enlighter-s0">"What is your name"</span></div> </div> <div class=""> <div><span class="enlighter-text"> private: no</span></div> </div> <div class=""> <div><span class="enlighter-text"> - name: </span><span class="enlighter-s0">"your_age"</span></div> </div> <div class=""> <div><span class="enlighter-text"> prompt: </span><span class="enlighter-s0">"How old are you"</span></div> </div> <div class=""> <div><span class="enlighter-text"> private: no</span></div> </div> </div> </div> 如上例所示,我们在定义” vars_prompt”中的变量时,使用private关键字,将变量的private属性设置为no即可, “private: no”表示变量值为非私有的,可见的,默认情况下 private值为yes,表示不可见。 我们还能为提示信息设置默认值,即如果用户不输入任何信息,则将默认值赋予变量,示例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_prompt:</span></div> </div> <div class=""> <div><span class="enlighter-text"> - name: </span><span class="enlighter-s0">"solution"</span></div> </div> <div class=""> <div><span class="enlighter-text"> prompt: </span><span class="enlighter-s0">"Choose the solution you want \n</span></div> </div> <div class=""> <div><span class="enlighter-s0"> A: solutionA\n</span></div> </div> <div class=""> <div><span class="enlighter-s0"> B: solutionB\n</span></div> </div> <div class=""> <div><span class="enlighter-s0"> C: solutionC\n"</span></div> </div> <div class=""> <div><span class="enlighter-text"> private: no</span></div> </div> <div class=""> <div><span class="enlighter-text"> default: A</span></div> </div> <div class=""> <div><span class="enlighter-text"> tasks:</span></div> </div> <div class=""> <div><span class="enlighter-text"> - name: output vars</span></div> </div> <div class=""> <div><span class="enlighter-text"> debug:</span></div> </div> <div class=""> <div><span class="enlighter-text"> msg: The final solution is </span><span class="enlighter-g1">{{</span><span class="enlighter-text">solution</span><span class="enlighter-g1">}}</span><span class="enlighter-text">.</span></div> </div> </div> </div> 如上例所示,我们使用了default关键字设置了”solution”变量的默认值,如果用户没有输入任何值(直接回车),则将”solution”变量的值设置为A,如果用户输入了值,则”solution”变量值为用户输入的值。 之前的示例中,我们提到可以利用提示信息让用户设置密码,有了这项功能,我们就可以编写出一个playbook,这个playbook可以让用户手动输入用户名和密码,然后根据用户输入的信息去创建系统用户了,聪明如你一定想到了,创建系统用户可以使用user模块,前文已经总结过<a title="user模块" href="https://www.zsythink.net/archives/2580" target="_blank" rel="noopener">user模块</a>,此处不再赘述,那么我们来尝试编写一个可交互创建系统用户的playbook吧,经过思考,我编写了如下playbook,你可以帮我看看如下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_prompt:</span></div> </div> <div class=""> <div><span class="enlighter-text"> - name: </span><span class="enlighter-s0">"user_name"</span></div> </div> <div class=""> <div><span class="enlighter-text"> prompt: </span><span class="enlighter-s0">"Enter user name"</span></div> </div> <div class=""> <div><span class="enlighter-text"> private: no</span></div> </div> <div class=""> <div><span class="enlighter-text"> - name: </span><span class="enlighter-s0">"user_password"</span></div> </div> <div class=""> <div><span class="enlighter-text"> prompt: </span><span class="enlighter-s0">"Enter user password"</span></div> </div> <div class=""> <div><span class="enlighter-text"> tasks:</span></div> </div> <div class=""> <div><span class="enlighter-text"> - name: create user</span></div> </div> <div class=""> <div><span class="enlighter-text"> user:</span></div> </div> <div class=""> <div><span class="enlighter-text"> name: </span><span class="enlighter-s0">"{{user_name}}"</span></div> </div> <div class=""> <div><span class="enlighter-text"> password: </span><span class="enlighter-s0">"{{user_password}}"</span></div> </div> </div> </div> 上例的playbook似乎没有什么不妥,但是细心如你一定发现了,user模块的password参数虽然可以指定用户的密码,但是password参数对应的值必须是一个”明文密码哈希过后的字符串”(如果你不明白我在说什么,可以参考之前文章中总结的<a href="https://www.zsythink.net/archives/2580" target="_blank" rel="noopener">user模块</a>的使用方法),而上例中,用户经过提示后输入的密码字符串并未经过哈希操作,所以,即使通过上述playbook可以创建用户,创建后的用户也无法通过设置的密码进行登录,因为保存在/etc/shadow文件中的密码字段是一个未哈希的明文的密码字段。那么,我们该怎么办呢?没错,我们需要对用户输入的密码字符串进行哈希,然后将哈希过后的字符串传入user模块的password参数中,ansible已经为我们考虑到了这一点,我们可以使用”encrypt”关键字,对用户输入的字符串进行哈希,用户输入的信息被哈希以后会存入对应的变量中,示例如下: <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_prompt:</span></div> </div> <div class=""> <div><span class="enlighter-text"> - name: </span><span class="enlighter-s0">"hash_string"</span></div> </div> <div class=""> <div><span class="enlighter-text"> prompt: </span><span class="enlighter-s0">"Enter something"</span></div> </div> <div class=""> <div><span class="enlighter-text"> private: no</span></div> </div> <div class=""> <div><span class="enlighter-text"> encrypt: </span><span class="enlighter-s0">"sha512_crypt"</span></div> </div> <div class=""> <div><span class="enlighter-text"> tasks:</span></div> </div> <div class=""> <div><span class="enlighter-text"> - name: Output the string after hash</span></div> </div> <div class=""> <div><span class="enlighter-text"> debug:</span></div> </div> <div class=""> <div><span class="enlighter-text"> msg: </span><span class="enlighter-s0">"{{hash_string}}"</span></div> </div> </div> </div> 如上例所示(先不要着急运行上述playbook),encrypt关键字表示对用户输入的信息进行哈希,encrypt: “sha512_crypt”表示使用sha512算法对用户输入的信息进行哈希,哈希后的字符串会存入到上例中的”hash_string”变量中,利用encrypt关键字,就可以解决之前遇到的创建用户时指定密码字符串的问题,但是需要注意,当使用”encrypt”关键字对字符串进行哈希时,ansible需要依赖passlib库完成哈希操作,如果未安装passlib库(一个用于哈希明文密码的python库),执行playbook时会报如下错误 ERROR! passlib must be installed to encrypt vars_prompt values 我的ansible主机的操作系统为centos7.4,默认自带python2.7.5,为了能够正常执行上述playbook,需要先安装passlib库。 此处通过pip安装passlib库,由于当前主机也没有安装pip,所以先下载安装pip <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"># tar -xvf pip-10.0.1.tar.gz</span></div> </div> <div class=""> <div><span class="enlighter-c0"># cd pip-10.0.1/</span></div> </div> <div class=""> <div><span class="enlighter-c0"># python setup.py install</span></div> </div> </div> </div> pip安装完成后,通过pip安装passlib库 <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"># pip install passlib</span></div> </div> </div> </div> passlib库安装完成后,执行上例中的剧本,可以看到,你输入的信息在经过哈希以后被输出了,当然,上例中我们指定了使用sha512算法对字符串进行哈希,你也可以指定其他passlib库支持的算法,算法名称可以参考如下连接 <span class="external-link"><a class="no-external-link" href="https://www.zsythink.net/wp-content/themes/zibll/go.php?url=aHR0cHM6Ly9kb2NzLmFuc2libGUuY29tL2Fuc2libGUvMi40L3BsYXlib29rc19wcm9tcHRzLmh0bWw=" target="_blank"><i data-feather="external-link"></i>https://docs.ansible.com/ansible/2.4/playbooks_prompts.html</a></span> 除了能够使用”encrypt”关键字对字符串进行哈希加密,还能够使用”confirm”关键字实现类似确认密码的功能,我们在为用户设置密码时,通常需要输入两次完全相同的密码,才能够设置成功,通过”confirm”关键字就能实现类似的效果,示例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_prompt:</span></div> </div> <div class=""> <div><span class="enlighter-text"> - name: </span><span class="enlighter-s0">"user_name"</span></div> </div> <div class=""> <div><span class="enlighter-text"> prompt: </span><span class="enlighter-s0">"Enter user name"</span></div> </div> <div class=""> <div><span class="enlighter-text"> private: no</span></div> </div> <div class=""> <div><span class="enlighter-text"> - name: </span><span class="enlighter-s0">"user_password"</span></div> </div> <div class=""> <div><span class="enlighter-text"> prompt: </span><span class="enlighter-s0">"Enter user password"</span></div> </div> <div class=""> <div><span class="enlighter-text"> encrypt: </span><span class="enlighter-s0">"sha512_crypt"</span></div> </div> <div class=""> <div><span class="enlighter-text"> confirm: yes</span></div> </div> <div class=""> <div><span class="enlighter-text"> tasks:</span></div> </div> <div class=""> <div><span class="enlighter-text"> - name: create user</span></div> </div> <div class=""> <div><span class="enlighter-text"> user:</span></div> </div> <div class=""> <div><span class="enlighter-text"> name: </span><span class="enlighter-s0">"{{user_name}}"</span></div> </div> <div class=""> <div><span class="enlighter-text"> password: </span><span class="enlighter-s0">"{{user_password}}"</span></div> </div> </div> </div> 具体的执行效果我就不截图了,动手试试吧。 <h2 id="wznav_2">通过命令行传入变量</h2> 除了之前总结过的定义变量的方法,我们还能够在执行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"> tasks:</span></div> </div> <div class=""> <div><span class="enlighter-text"> - name: </span><span class="enlighter-s0">"Passing Variables On The Command Line"</span></div> </div> <div class=""> <div><span class="enlighter-text"> debug:</span></div> </div> <div class=""> <div><span class="enlighter-text"> msg: </span><span class="enlighter-s0">"{{pass_var}}"</span></div> </div> </div> </div> 上例中的playbook中,并没有定义pass_var变量,而是直接引用了pass_var变量,我们可以在调用上述playbook时直接从命令行传入pass_var变量,方法如下 <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">ansible-playbook cmdvar.</span><span class="enlighter-m3">yml</span><span class="enlighter-text"> --extra-vars </span><span class="enlighter-s0">"pass_var=cmdline pass var"</span></div> </div> </div> </div> 如上例所示,在调用playbook时使用 “–extra-vars” 选项可以传递对应的变量与变量值, “–extra-vars” 是长选项,对应的短选项是”-e”,我们也可以一次性传入多个变量,变量之间用空格隔开,如下 <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">ansible-playbook cmdvar.</span><span class="enlighter-m3">yml</span><span class="enlighter-text"> -e </span><span class="enlighter-s0">'pass_var="test" pass_var1="test1"'</span></div> </div> </div> </div> 上例中的playbook中并没有定义pass_var变量,如果在调用playbook时也没有传入pass_var变量,则会报错,其实,我们也可以先在playbook中定义好变量,然后在执行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"> pass_var: test_default</span></div> </div> <div class=""> <div><span class="enlighter-text"> tasks:</span></div> </div> <div class=""> <div><span class="enlighter-text"> - name: </span><span class="enlighter-s0">"Passing Variables On The Command Line"</span></div> </div> <div class=""> <div><span class="enlighter-text"> debug:</span></div> </div> <div class=""> <div><span class="enlighter-text"> msg: </span><span class="enlighter-s0">"{{pass_var}}"</span></div> </div> </div> </div> 上例的playbook中定义了pass_var变量,其值为”test_default”,在执行上述playbook时,从命令行再次传入pass_var变量,命令如下 <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">ansible-playbook cmdvar.</span><span class="enlighter-m3">yml</span><span class="enlighter-text"> -e </span><span class="enlighter-s0">'pass_var="test"'</span></div> </div> </div> </div> 执行上述命令后,你会发现,最终输出的值为”test”而非”test_default”,也就是说,命令行传入的变量的优先级要高于playbook中的变量,通过这种方法,我们就能够更加灵活的指定变量的值了。 不仅ansible-playbook命令可以使用”-e”传递变量,ansible命令也同样可以,所以在执行ad-hoc命令时也可以使用同样的方法传入变量,如下 <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">ansible test70 -e </span><span class="enlighter-s0">"testvar=test"</span><span class="enlighter-text"> -m shell -a </span><span class="enlighter-s0">"echo {{testvar}}"</span></div> </div> </div> </div> 上述的几个示例从命令行中传递变量时,都是使用了”key=value”的形式,除了使用”key=value”的方式传递变量,ansible还支持通过json的格式传入变量,示例如下 通过json格式传入两个变量 <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">ansible-playbook cmdvar.</span><span class="enlighter-m3">yml</span><span class="enlighter-text"> -e </span><span class="enlighter-s0">'{"testvar":"test","testvar1":"test1"}'</span></div> </div> </div> </div> 通过json格式传入稍微复杂一点的变量 <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">ansible-playbook cmdvar.</span><span class="enlighter-m3">yml</span><span class="enlighter-text"> -e </span><span class="enlighter-s0">'{"countlist":["one","two","three","four"]}'</span></div> </div> </div> </div> 在剧本中引用上述命令传入的countlist变量时,如果想要获取到值”one”,则可以使用如下两种语法引用变量 {{countlist[0]}} 或者 {{countlist.0}} 命令行不仅能够传入变量,还能传入变量文件,变量文件中的变量都会一并被传入,变量文件可以是json格式的,也可以是YAML格式的,此处使用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-c0"># cat /testdir/ansible/testvar</span></div> </div> <div class=""> <div><span class="enlighter-text">testvar: testvarinfile</span></div> </div> <div class=""> <div><span class="enlighter-text">countlist:</span></div> </div> <div class=""> <div><span class="enlighter-text">- one</span></div> </div> <div class=""> <div><span class="enlighter-text">- two</span></div> </div> <div class=""> <div><span class="enlighter-text">- three</span></div> </div> <div class=""> <div><span class="enlighter-text">- four</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"> tasks:</span></div> </div> <div class=""> <div><span class="enlighter-text"> - name: </span><span class="enlighter-s0">"Passing Variables On The Command Line"</span></div> </div> <div class=""> <div><span class="enlighter-text"> debug:</span></div> </div> <div class=""> <div><span class="enlighter-text"> msg: </span><span class="enlighter-s0">"{{testvar}} {{countlist[0]}}"</span></div> </div> </div> </div> 如playbook所示,playbook中引用了变量文件中定义的两个变量,那么,我们怎样从命令行中将变量文件中的变量传入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">ansible-playbook cmdvar.</span><span class="enlighter-m3">yml</span><span class="enlighter-text"> -e </span><span class="enlighter-s0">"@/testdir/ansible/testvar"</span></div> </div> </div> </div> 如上述命令所示,使用”@”符号加上变量文件的路径,即可在命令行中传入对应的变量文件,变量文件中的所有变量都可以在playbook中引用,还是很方便的吧。 好了,这篇文章就总结到这里,希望能够对你有所帮助。 转载自朱双印日志https://www.zsythink.net/archives/2680 Last modification:May 29, 2024 © Allow specification reprint Like 如果觉得我的文章对你有用,请随意赞赏