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

[经验分享] Ansible Playbook Variables

[复制链接]

尚未签到

发表于 2018-1-2 12:55:35 | 显示全部楼层 |阅读模式
  

  {{ foo [ 0 ] }}  

Magic Variables, and How To Access Information About Other Hosts
  即使您没有自己定义它们,Ansible会为您自动提供一些变量。 其中最重要的是hostvars , group_names和groups 。 用户不应该自己使用这些名称,因为它们是保留的。  environment也保留。
  hostvars可让您询问另一个主机的变量,包括已经收集到关于该主机的事实。 如果在这一点上,你还没有在剧本或剧集中玩过这个主机,那么你仍然可以得到这些变量,但是你将无法看到事实。
  如果您的数据库服务器想要使用另一个节点的“事实”值,或者分配给另一个节点的清单变量,那么在一个模板甚至一个动作行中可以轻松实现:
  

  {{ hostvars [ ' test.example.com' ] [ 'ansible_distribution' ] }}  

  

  另外, group_names是当前主机所有组的列表(数组)。这可以在使用Jinja2语法的模板中使用,以使得根据主机的组成员资格(或角色)而变化的模板源文件
  

{% if 'webserver' in group_names %}  
   # some part of a configuration file that only applies to webservers
  
{% endif %}
  groups是清单中所有组(和主机)的列表。 这可以用于枚举组内的所有主机。 例如:
  

{% for host in groups['app_servers'] %}  
   # something that applies to all app servers.
  
{% endfor %}
  一个经常使用的成语是走一个组来查找该组中的所有IP地址
  

{% for host in groups['app_servers'] %}  
   {{ hostvars[host]['ansible_eth0']['ipv4']['address'] }}
  
{% endfor %}
  一个例子可能包括将前端代理服务器指向所有应用服务器,在服务器之间设置正确的防火墙规则等。您需要确保这些主机的事实已经填充,例如,通过运行如果事实最近还没有被缓存,那么他们就会玩这个游戏(在Ansible 1.8中添加了事实缓存)。
  

  此外, inventory_hostname是在Ansible的清单主机文件中配置的主机名的名称。 当您不想依赖于发现的主机名ansible_hostname或其他神秘原因时,这可能很有用。 如果你有一个很长的FQDN, inventory_hostname_short也包含第一个时间段,没有其余的域。
  play_hosts在2.2中已被弃用,它与新的ansible_play_batch变量相同。
  新版本2.2。
  ansible_play_hosts是当前播放中仍然有效的所有主机的完整列表。
  新版本2.2。
  ansible_play_batch可用作播放当前“批”的范围内的主机名列表。 批量大小由serial定义,当不设置它相当于整个播放(使其与ansible_play_hosts相同)。
  版本2.3中的新功能。
  ansible_playbook_python是用于调用可执行命令行工具的python可执行文件的路径。
  这些变量可能对于填写具有多个主机名的模板或将列表注入到负载均衡器的规则中是有用的。
  除非你认为你需要,否则不要担心这些。 你会知道你什么时候做的
  inventory_dir也是可用的目录,该目录包含Ansible的库存主机文件, inventory_file是路径名,文件名指向Ansible的库存主机文件。
  playbook_dir包含playbook基本目录。
  然后我们有role_path ,它将返回当前角色的路径名(自1.8)。 这只能在一个角色中发挥作用。
  最后, ansible_check_mode (在版本2.1中添加),一个布尔魔术变量,如果您使用--check运行可执行文件,则将其设置为True 。

Variable File Separation
  这是一个很好的主意,让您的Playbook受到源代码的控制,但您可能希望将Playbook的来源公开,同时保留某些重要的变量。 同样,有时您可能只想将某些信息保存在不同的文件中,远离main playbook。
  您可以通过使用外部变量文件或文件来执行此操作,如下所示:
  

---  

  
- hosts: all
  remote_user: root
  vars:
  favcolor: blue
  vars_files:
  - /vars/external_vars.yml
  

  tasks:
  

  - name: this is just a placeholder
  command: /bin/echo foo
  这可以消除与他人共享您的手册源的敏感数据的风险。
  

  每个变量文件的内容是一个简单的YAML字典,如下所示:
  

---  
# in the above example, this would be vars/external_vars.yml
  
somevar: somevalue
  
password: magic
  

Passing Variables On The Command Line
  

除了vars_prompt和vars_files ,还可以通过可执行命令行发送变量。 在编写通用发行版手册时,您可能希望通过要部署的应用程序版本,这一点尤其有用:  

  

  ansible-playbook>  这对于设置play的主机组或用户而言非常有用。
  

---  

  
- hosts: '{{ hosts }}'
  remote_user: '{{ user }}'
  

  tasks:
  - ...
  


  
ansible-playbook>  从Ansible 1.2开始,您还可以传入额外的var,如引用的JSON,如下所示:
  

  

--extra-vars'{“pacman”:“mrs”,“ghosts”:[“inky”,“pinky”,“clyde”,“sue”]}  

  key=value形式显然更简单,但是如果需要它就在那里!
  从Ansible 1.3起,可以使用@语法从JSON文件中加载额外的var:
  

  

  --extra-vars“@ some_file.json”  

  

  也可以从Ansible 1.3,额外的vars可以格式化为YAML,无论是在命令行还是在上面的文件中。

Variable Precedence: Where Should I Put A Variable?
  很多人可能会问,变量如何覆盖另一个。 最终,Ansible的理念是更好地知道在哪里放一个变量,然后你必须考虑一下。
  避免在47个位置定义变量“x”,然后询问“哪个x被使用”的问题。 为什么? 因为那不是禅宗的做事哲学。
  只有一个帝国大厦。 一个蒙娜丽莎等,找出定义变量的位置,不要复杂。
  但是,让我们继续前进吧! 它存在 这是一件真实的事情,你可能会用它。
  如果在不同的地方定义了相同名称的多个变量,则它们将按照一定的顺序被覆盖。
  在1.x中,优先级如下(最后列出的变量获得优先级排序):



  • “role defaults”,其优先于所有事物,并且是最容易被覆盖的
  • inventory中定义的变量
  • 在有关系统中发现的facts
  • “most everything else”(命令行开关,play中的变量,include变量,角色变量等)
  • 连接变量( ansible_user等)
  • 额外的vars( -e在命令行中)最优先

  注意
  在1.5.4之前的版本中,有关系统的事实发现在上述的“其他一切”类别中。
  在2.x中,我们使优先顺序更具体(最后列出的变量获得优先级排序):



  • role defaults[1]
  • inventory文件或脚本组vars [2]
  • inventory group_vars / all
  • playbook group_vars / all
  • inventory group_vars / *
  • playbook group_vars / *
  • inventory 文件或脚本主机vars [2]
  • inventory host_vars / *
  • playbook host_vars / *
  • host facts
  • play facts
  • play vars_prompt
  • play vars_files
  • role vars(在role / vars / main.yml中定义)
  • block 变量(仅适用于块中的任务)
  • 任务变量(仅用于任务)
  • 角色(和include_role)参数
  • include参数
  • include_vars
  • set_facts / registered vars
  • 额外的vars(总是赢得优先)

  基本上,进入“角色默认值”(角色中的默认文件夹)的任何东西都是最有价值的,容易被覆盖的。 该角色的vars目录中的任何内容都会覆盖该命名空间中该变量的先前版本。 这里要遵循的一个想法是,在范围上越明确,命令行-e额外的vars总是胜出越多的优先级。 主机和/或库存变量可以胜过角色默认值,但不显式包括vars目录或include_vars任务。

运维网声明 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-430796-1-1.html 上篇帖子: ansible 原理配置篇 下篇帖子: ansible学习
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

扫描微信二维码查看详情

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


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


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


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



合作伙伴: 青云cloud

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