Loading... <p><span style="font-size:24px">Ansible变量</span></p> <p> 系统自动化让重复的工作变得更加容易,但是每个系统还是有一些细微的差别,变量就是如何处理系统之间的不同之处。这里将会列出变量的极大部分使用方法。</p> <p> </p> <p><strong>本文假设:你已经知道如何使用Ansible。知道inventory,facts等概念。</strong></p> <p> </p> <p>Ansible定义变量的几中方式</p> <p>1、在清单(inventory)中定义变量</p> <p>2、在playbook中定义变量,使用var,或var_files:</p> <p>3、在role中定义变量</p> <p>4、自定义facts的变量</p> <p>5、Register facts ,使用task返回结果作为变量</p> <p>6、从命令行传递变量</p> <p>使用变量,除了可用使用自定义的变量,还可以使用facts和其它主机的变量。</p> <p> </p> <p><span style="font-size: 20px">一、合法变量名</span></p> <p>1、必须是字符,数字,下划线组成,变量必须以字符开头。</p> <p>2、变量支持字典形式的映射。</p> <p>3、有时候引用变量,使用小数点形式的引用方法可能会和Python内置的属性和方法冲突。建议使用[]形式。</p> <p> </p> <p><span style="font-size: 20px">二、开始定义与使用变量</span></p> <p><strong><span style="font-size:18px">1、清单(inventory)变量</span></strong></p> <p>1.1定义清单主机变量.在对应的主机后面,提供key=value 形式语句,即可。格式如下</p> <pre class="brush:bash;toolbar:false">[webserver] 172.16.1.10 ansible_ssh_user=root inventory_host_var="Host_vars" 172.16.1.20 ansible_ssh_user=root</pre> <p>1.2定义清单组变量,格式如下。</p> <pre class="brush:bash;toolbar:false">[webserver:vars] inventory_group_var="Group_vars"</pre> <p>1.3 可以根据对应的inventory创建文件,写入变量</p> <pre class="brush:bash;toolbar:false">mkdir /etc/ansible/host_vars #Ansible会默认读取此目录下对应的主机名文件 mkdir /etc/ansible/group_vars #同上 vim /etc/ansible/host_vars/all 或者 vim /etc/ansible/host_vars/hostname vim /etc/ansible/group_vars/groupname</pre> <p>在文件中写入变量即可。格式为ymal格式文件。</p> <p><span style="font-size:18px"><br /></span></p> <p><strong><span style="font-size:18px">2、在playbook中定义变量</span></strong></p> <pre class="brush:bash;toolbar:false">--- - hosts: hostname or groupname vars: #playbook中定义变量的关键字 playbook_var: Playbook_vars var_files: #使用变量文件 - filename.yml tasks: - name: Copy Jinja2 file to remote host template: src=/home/aheahe/var_tu.j2 dest=/root/var.conf</pre> <p><span style="font-size:18px"><br /></span></p> <p><strong><span style="font-size:18px">3、在role中定义变量</span></strong></p> <pre class="brush:bash;toolbar:false">mkdir roles/test/{vars,files,templates,tasks,defaults,handlers} -p #创建role结构</pre> <pre class="brush:bash;toolbar:false">vim roles/test/vars/main.yml #1、编辑task文件 --- role_vars_var: Role_vars_var</pre> <pre class="brush:bash;toolbar:false">vim roles/test/defaults/main.yml #2、编辑默认变量文件 --- role_defaults_var: Role_default_var</pre> <pre class="brush:bash;toolbar:false">vim roles/test/tasks/main.yml #3、编辑roles var文件 --- - name: Learn role vars template: src=1.j2 dest=/root/1</pre> <pre class="brush:bash;toolbar:false">vim roles/test/templates/1.j2 #4、编辑模板文件 {{ role_vars_var }} {{ role_defaults_var }}</pre> <pre class="brush:bash;toolbar:false">vim site.yml #5、编辑执行文件 --- - hosts: 172.16.1.10 roles: - /home/aheahe/roles/test</pre> <pre class="brush:bash;toolbar:false">ansible-playbook site.yml #6、执行</pre> <pre class="brush:bash;toolbar:false">[172.16.1.10~]# cat 1 #7、在被管理节点上查看结果 Role_vars_var Role_default_var</pre> <p>Tip:在引用role的时候,还可以传递变量给role</p> <pre class="brush:bash;toolbar:false">- hosts: webservers roles: - common - { role: test, role_defaults_var: 'var_value' }</pre> <p><span style="font-size:18px"><br /></span></p> <p><strong><span style="font-size:18px">4、自定义Facts变量。</span></strong></p> <p>如果在被管理的主机上存在/etc/ansible/facts.d 目录,其中的以.fact 为文件结尾的JSON格式或者YML格式文件都会当做自定义facts。</p> <pre class="brush:bash;toolbar:false">[172.16.1.10]# vim /etc/ansible/facts.d/local.fact #编辑自定义facts文件 [general] Aheahe=aihe local="Local facts"</pre> <pre class="brush:bash;toolbar:false">[ansible ~]$ansible 172.16.1.10 -m setup -a 'filter=ansible_local' #在ansible控制节点查看自定义facts变量是否生效 172.16.1.10 | success >> { "ansible_facts": { "ansible_local": { "local": { "general": { "aheahe": "aihe", "local": "\"Local facts\"" } } } }, "changed": false }</pre> <p> </p> <p>可以像fact一样使用,自定义的fact变量。</p> <pre class="brush:bash;toolbar:false">vim roles/test/templates/1.j2 #使用刚才的角色 {{ role_vars_var }} {{ role_defaults_var }} {{ ansible_local.local.general.local }}</pre> <pre class="brush:bash;toolbar:false">ansible-playbook site.yml #执行刚才的site.yml</pre> <pre class="brush:bash;toolbar:false">[172.16.1.10 -]# cat /root/1 #被管理节点查看结果,显示正确 Role_vars_var Role_default_var "Local facts"</pre> <p>4.1这里还可以在控制节点上面传递自定义变量到被管理节点,编辑如下ymal格式文件。</p> <pre class="brush:bash;toolbar:false">- hosts: webservers tasks: - name: create directory for ansible custom facts file: state=directory recurse=yes path=/etc/ansible/facts.d - name: install custom impi fact copy: src=ipmi.fact dest=/etc/ansible/facts.d - name: re-readfacts after adding custom fact setup: filter=ansible_local</pre> <p></p> <p><strong><span style="font-size:18px">5、定义Register变量,</span></strong></p> <p>Register变量是将task的结果信息当做变量使用。在任务的执行结果后面加上register 关键字即可定义变量</p> <pre class="brush:bash;toolbar:false">vim study.yml --- - hosts: 172.16.1.10 vars: playbook_var: Playbook_vars tasks: - name: Learn Register shell: ifconfig register: command_result - name: Test register shell: date when: command_result.rc == 0</pre> <pre class="brush:bash;toolbar:false">ansible-playbook study.yml -v #执行的时候加上-v 选项。查看输出信息</pre> <p></p> <p><strong><span style="font-size:18px"><br /></span></strong></p> <p><strong><span style="font-size:18px">6、从命令行传递变量.</span></strong></p> <p>相信这点对大家来说已经不成问题了,便不再细说</p> <pre class="brush:bash;toolbar:false">ansible-playbook release.yml --extra-vars "version=1.23.45 other_variable=foo" #传递key=value形式变量 --extra-vars '{"pacman":"mrs","ghosts":["inky","pinky","clyde","sue"]}' #传递JSON格式变量 --extra-vars "@some_file.json" #传递JSON格式文件变量</pre> <p></p> <p><span style="font-size: 20px">三、使用变量</span></p> <p>上面在举例子的时候,已经说明如何使用了。下面介绍如何使用fact变量和一台主机使用另外一台主机的变量。</p> <p>使用实现定义好的变量,在变量两边加上大括号,格式为{{ var_name }} </p> <pre class="brush:bash;toolbar:false">vim var.j2 {{ ansible_hostname }} #这里是使用fact变量,两个主机的结果不一样 {{ hostvars['172.16.1.10']['ansible_hostname'] }} #这里两台主机的结果一样,node2>使用node1的变量</pre> <pre class="brush:bash;toolbar:false">vim test.yml #提供剧本 --- - hosts: webserver tasks: - name: Use fact and other host vars template: src=/home/aheahe/playbook/var.j2 dest=/root/var.conf</pre> <pre class="brush:bash;toolbar:false">ansible-playbook test.yml #执行</pre> <pre class="brush:bash;toolbar:false;">[root@node1]# cat /root/var.conf #这里可以看到node2使用node1的变量。 node1 #这里是使用fact变量,两个主机的结果不一样 node1 #这里两台主机的结果一样,node2使用node1的变量</pre> <p></p> <p><span style="font-size: 20px">四、变量的优先级。处理同一个变量名多处定义的问题。</span></p> <p>3.1、在1.x版本里面,越靠下优先级越高,可以覆盖上面的</p> <p>1、role defaults 中定义的变量,优先级最低</p> <p>2、从被管理系统中收集的facts信息</p> <p>3、inventory中定义的变量</p> <p>4、在playbook中的vars: 或者 roles 中的vars</p> <p>5、一些连接变量,例如ansible_user 。</p> <p>6、命令行的变量 ansible-playbook -e 选项的变量, 优先级别最高。</p> <p>3.2 ,在2.x系列的版本中调整变量优先级的顺序为如下。优先级由低到高</p> <ol class="custom_num1 list-paddingleft-1"> <li class="list-num-2-1 list-num1-paddingleft-1"> <p>role defaults </p> </li> <li class="list-num-2-2 list-num1-paddingleft-1"> <p>inventory vars </p> </li> <li class="list-num-2-3 list-num1-paddingleft-1"> <p>inventory group_vars</p> </li> <li class="list-num-2-4 list-num1-paddingleft-1"> <p>inventory host_vars</p> </li> <li class="list-num-2-5 list-num1-paddingleft-1"> <p>playbook group_vars</p> </li> <li class="list-num-2-6 list-num1-paddingleft-1"> <p>playbook host_vars</p> </li> <li class="list-num-2-7 list-num1-paddingleft-1"> <p>host facts</p> </li> <li class="list-num-2-8 list-num1-paddingleft-1"> <p>registered vars</p> </li> <li class="list-num-2-9 list-num1-paddingleft-1"> <p>set_facts</p> </li> <li class="list-num-2-10 list-num1-paddingleft-1"> <p>play vars</p> </li> <li class="list-num-2-11 list-num1-paddingleft-1"> <p>play vars_prompt</p> </li> <li class="list-num-2-12 list-num1-paddingleft-1"> <p>play vars_files</p> </li> <li class="list-num-2-13 list-num1-paddingleft-1"> <p>role and include vars</p> </li> <li class="list-num-2-14 list-num1-paddingleft-1"> <p>block vars (only for tasks in block)</p> </li> <li class="list-num-2-15 list-num1-paddingleft-1"> <p>task vars (only for the task)</p> </li> <li class="list-num-2-16 list-num1-paddingleft-1"> <p>extra vars</p> </li> </ol> <p><span style="font-size:20px"><br /></span></p> <p><strong><span style="font-size:20px">参考:</span></strong></p> <p>http://docs.ansible.com/ansible/playbooks_variables.html </p> <p></p> <p></p> 最后修改:2021 年 12 月 10 日 10 : 53 AM © 允许规范转载 赞赏 如果觉得我的文章对你有用,请随意赞赏 赞赏作者 支付宝微信