设为首页 收藏本站
查看: 1556|回复: 0

[经验分享] ansible 变量简明入门

[复制链接]
发表于 2018-7-29 07:25:22 | 显示全部楼层 |阅读模式
ansible 为什么需要变量?
  ansible 是用 python 语言编写的,如果连变量都不支持,要它何用?

ansible 的变量用在什么地方?
  我们在安装 ansible 后,最常使用它的方式就是 ansible 和 ansible-playbook。在这两种方式,都可以使用变量。

ansible 的变量从哪里来?
  

例如:  
1. 用户自定义的变量,在playbook 里定义的 vars 关键字,或者在其他文件定义的变量。
  
2. 无需用户自定义,而是来自远程主机收集到的 facts 变量。
  
3. template 文件可以直接使用以上两种变量。
  
4. 从 tasks 执行后返回的结果,可以注册成为一个变量,留待以后继续使用。
  
5. playbook 在执行时,支持临时从外部提供变量。
  

  

ansible 变量的使用举例

1. 用户自定义变量
  

[root@centos_7 roles]# cat a.yml  
---
  - hosts: test
  gather_facts: False
  vars:
  var1: haha
  var2: your name is
  tasks:
  - debug: msg="{{var2}} {{var1}}"
  

  
说明:在 playbook 层的vars 字段后,定义了用户的变量,那么在后面所有地方都能使用这些变量了,除非,在后面有同名的变量,则会覆盖。
  

  
执行结果:
  
[root@centos_7 roles]# ansible-playbook a.yml
  

  
TASK [debug] ****************************************************************************************************************
  
ok: [192.168.188.109] => {
  "msg": "your name is haha"
  
}
  

  
变量覆盖的情况:
  

  
[root@centos_7 roles]# cat a.yml
  
---
  - hosts: test
  gather_facts: False
  vars:
  var1: haha
  var2: your name is
  tasks:
  - debug: msg="{{var2}} {{var1}}"
  vars:
  - var1: hehe
  

  
说明:在tasks 层里的 var1 变量会覆盖playbook 层声明的 var1 变量。
  

  
所以,执行的结果变成:
  

  
TASK [debug] ****************************************************************************************************************
  
ok: [192.168.188.109] => {
  "msg": "your name is hehe"
  
}
  

  

1.1 从playbook 外部文件传入变量
  只要将上面的例子进行一点小修改,就可以了
  

[root@centos_7 roles]# cat a.yml  
---
  
- hosts : test
  gather_facts: False
  vars_files:
  - var_file1.yml
  tasks:
  - debug: msg="{{var1}}"
  

  
说明: 在playbook 里需要使用变量文件,可以通过 vars_files 字段声明,直接声明文件名(相对路径,相对当前执行的playbook 文件),也可以用绝对路径声明变量文件的路径。
  

  
var_file1.yml 里的内容:
  
var1:  hello Han×××
  

  
执行结果:
  
TASK [debug] ****************************************************************************************************************
  
ok: [192.168.188.109] => {
  "msg": "hello Han×××"
  
}
  

2. 远程主机收集的 facts 变量
  

playbook 执行时,默认会运行 setup 模块,收集远程主机的信息。setup 模块收集到的信息,是 jason 格式。  
运行 ansible  test  -m   setup , 可以看到返回的远程主机信息(节选部分的信息而已):
  
192.168.188.109 | SUCCESS => {
  "ansible_facts": {
  "ansible_all_ipv4_addresses": [
  "192.168.188.109"
  ],
  "ansible_all_ipv6_addresses": [
  "fe80::20c:29ff:fe8e:cf65"
  ],
  "ansible_apparmor": {
  "status": "disabled"
  },
  "ansible_architecture": "x86_64",
  "ansible_bios_date": "05/19/2017",
  "ansible_bios_version": "6.00",
  

  
这些 facts 变量,playbook 都是可以直接使用的,如何使用?
  

  
例如,有 playbook 文件:
  
[root@centos_7 roles]# cat a.yml
  
---
  - hosts: test
  tasks:
  - debug: msg="{{ansible_all_ipv4_addresses}} {{ansible_os_family}}"
  

  
执行结果:
  
TASK [debug] ****************************************************************************************************************
  
ok: [192.168.188.109] => {
  "msg": "[u'192.168.188.109'] RedHat"
  
}
  

  
特别说明一点:
  
facts数据的顶级key为ansible_facts,在引用时应该将其包含在变量表达式中。但自动收集的facts比较特殊,它以ansible_facts作为key,ansible每次收集后会自动将其注册为变量,所以facts中的数据都可以直接通过变量引用,甚至连顶级key ansible_facts都要省略。
  

  

3. template 使用变量
  template module在Ansible中很常用,而它在使用的时候又没有显式的指定template文件中的值,有时候用户会对template文件中使用的变量感到困惑,所以在这里再次强调下。
  在playbook中定义的变量,可以直接在template中使用,同时facts变量也可以直接在template中使用,当然也包含在inventory里面定义的host和group变量。只要是在playbook中可以访问的变量,都可以在template文件中使用。
  

Ansible模版文件使用变量的语法是Python的template语言Jinja2。  

  
在下面的例子template index.html.j2中,直接使用了以下变量:
  

  
系统变量 ** {{ ansible_hostname }} **, ** {{ ansible_default_ipv4.address }} **
  

  
用户自定义的变量 ** {{ defined_name }} **
  

  
index.html.j2文件:
  

  
<html>
  
<title>Demo</title>
  
<body>
  
<div>
  <div>
  <h1>#46 Demo \{\{ defined_name \}\}</h1>
  <p>Served by \{\{ ansible_hostname \}\} (\{\{ ansible_default_ipv4.address \}\}).</p>
  </div>
  
</div>
  
</body>
  
</html>
  

4. 从tasks 返回的结果,需要注册成为变量才能使用
  

[root@centos_7 roles]# cat a.yml  
---
  
- hosts : test
  gather_facts: False
  tasks:
  - shell : echo hello world
  register: var
  - debug: msg="{{var}}"
  

  
说明:
  
执行shell 模块后,返回信息是 jason 格式的。再通过 register 注册到 var 变量。
  
然后,通过 debug 模块,输出 var 变量。
  

  
执行结果(截取部分):
  
TASK [debug] ****************************************************************************************************************
  
ok: [192.168.188.109] => {
  "msg": {
  "changed": true,
  "cmd": "echo hello world",
  "delta": "0:00:00.001890",
  "end": "2018-01-18 17:12:00.178123",
  "failed": false,
  "rc": 0,
  "start": "2018-01-18 17:12:00.176233",
  "stderr": "",
  "stderr_lines": [],
  "stdout": "hello world",
  "stdout_lines": [
  "hello world"
  ]
  }
  
}
  

  

4.1 如何对jason 变量引用?
  既然在这里已经说到 jason 变量了,那就顺便说说关于这类变量的引用。
  通常可以用 &quot;.&quot; 或者 index 引用。
  例如,上一个例子中,我们想输出 stdout_lines ,则引用可以有:
  var.stdout
  或者, var['stdout'] 。 这两种方式都是可以的。
  所以,对 playbook 脚本进行一点修改:
  

[root@centos_7 roles]# cat a.yml  
---
  
- hosts : test
  gather_facts: False
  tasks:
  - shell : echo hello world
  register: var
  - debug: msg="{{var.stdout}}"
  

  
执行结果:
  
TASK [debug] ****************************************************************************************************************
  
ok: [192.168.188.109] => {
  "msg": "hello world"
  
}
  

  如果我们要引用的变量是一个列表,例如上一个例子里的 stdout_lines 字段,就是一个列表,我们如何输出呢?可以使用 index 下标引用:
  

[root@centos_7 roles]# cat a.yml  
---
  
- hosts : test
  gather_facts: False
  tasks:
  - shell : echo hello world
  register: var
  - debug: msg="{{var['stdout_lines'][0]}}"
  

  
执行结果:
  
TASK [debug] ****************************************************************************************************************
  
ok: [192.168.188.109] => {
  "msg": "hello world"
  
}
  

  所以,在看到这里,应该能明白,ansible 的 setup 模块收集的 facts 变量,正确的引用方式了吧。

5. 执行playbook 时在外部传入变量
  例子:
  

[root@centos_7 roles]# cat a.yml  
---
  
- hosts : test
  gather_facts: False
  tasks:
  

  - debug: msg="{{var1}}"
  

  
执行:
  
[root@centos_7 roles]# ansible-playbook a.yml -e 'var1="hello LiZimei"'
  

  
结果:
  
[root@centos_7 roles]# ansible-playbook a.yml -e 'var1="hello LiZimei"'
  

5.1 在运行 playbook 时,也可以通过外部文件传入变量
  使用命令的方式:
  ansible-playbook  a.yml  -e '@var_file1.yml'
  用“@”符号引用文件

总结
  上面的内容是 ansible 变量继续深入学习的最基础知识了。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-542745-1-1.html 上篇帖子: Ansible API 2.0的测试 下篇帖子: ansible之生产案例
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表