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

[经验分享] Ansible之十一:变量详解

[复制链接]

尚未签到

发表于 2018-7-30 07:31:55 | 显示全部楼层 |阅读模式
  一、在Inventory中定义变量
  详见《Ansible2:主机清单》
  二、在Playbook中定义变量
  1、通过vars关键字定义:
  vars:
  http_port: 80
  server_name: localhost
  cert_file: /etc/nginx/ssl/nginx.crt
  key_file: /etc/nginx/ssh/nginx.key
  conf_file: /etc/nginx/conf/default.conf
  2、通过vars_files关键字引入变量文件:
  - hosts: all
  remote_user: root
  vars:
  favcolor: blue
  vars_files:
  - /vars/external_vars.yml
  - /vars/nginx_vars.yml
  /vars/nginx_vars.yml示例:
  http_port: 80
  server_name: localhost
  cert_file: /etc/nginx/ssl/nginx.crt
  key_file: /etc/nginx/ssh/nginx.key
  conf_file: /etc/nginx/conf/default.conf
  3、通过vars_prompt来实现人机交互:
  hosts: all
  remote_user: root
  vars_prompt:
  - name: 'https_passphrase'          #存储数据的变量名
  prompt: 'Key Passphrase'          #手工输入数据
  private: yes                      #当该值为yes,则用户的输入不会被打印
  4、通过playbook的roles定义变量
  详见《ansible10:Playbook的角色与包含》
  三、注册变量
在有些时候,我们希望把某一条任务执行的结果保存下来,可以在接下的任务中调用或者做些判断,可以通过register关键字来实现:下面是个简单的例子,如果/etc/motd文件中包含有'hi'字符串时,则输出"mothd contains ther word hi":- name: test play  hosts: all
  tasks:
  - shell: cat /etc/motd
  register: motd_contents
  - shell: echo "motd contains the word hi"
  when: motd_contents.stdout.find('hi') != -1下面是一个register的变量在循环中使用的例子:- name: registered variable usage as a with_items list
  hosts: all
  tasks:
  - name: retrieve the list of home directories
  command: ls /home
  register: home_dirs
  - name: add home dirs to the backup spooler
  file: path=/mnt/bkspool/{{ item }} src=/home/{{ item }} state=link
  with_items: home_dirs.stdout_lines
  # same as with_items: home_dirs.stdout.split()
  四、通过fact获取远程主机变量
  
我们在之前讲ad-hoc常用模块的时候提到setup模块,用于获取远程主机的相关信息,并可以将这些信息作为变量在playbook里进行调用。而
setup模块获取这些信息的方法就是依赖于fact。在这里,我们不再详细说明获取到的默认fact的内容。ansible除了能获取到预定义的
fact的内容,还支持手动为某个主机定制fact。称之为本地fact。本地fact默认存放于目标主机的/etc/ansible/facts.d目
录下,如果文件为.ini格式或者json格式,ansible会自动识别。以这种形式加载的fact是key为ansible_local的特殊变量。
  下面是一个简单的示例,一个.ini格式的example.fact文件内容如下:
  [book]
  title=Ansible Book
  author=Breeze Yan
  将其复制到目标主机的/etc/ansible/facts.d/目录,通过debug模块打印输出:
  - name: print ansible_local
  debug: var=ansibl_local
  会打印出如下内容:
  ok: [localhost] => {
  "var": {
  "ansible_local": {
  "example": {
  "book": {
  "author": "Breeze Yan",
  "title": "Ansible Book"
  }
  }
  }
  }
  }
  如果不想从fact中获取变量,可以通过如下方法关闭fact:
  - hosts: whatever
  gather_facts: no
  五、使用set_fact模块定义新的变量
  在《ansible7:Playbook常用模块》中有对set_fact模块用法的详细说明
  六、内置变量
  1、hostvars
  
获取某台指定的主机的相关变量。如果有一台web服务器的配置文件中需要指定db服务器的ip地址,我们假定这台db服务器的hostname为
db.exmaple.com,ip地址绑定在eth0网卡上,我们可以通过如下方法在web服务器上调用db服务器的ip地址:
  {{ hostvars['db.example.com'].ansible_eth0.ipv4.address }}
  需要注意的是db.example.com不能使用ip地址来取代,只能使用主机名或别名。
  2、inventory_hostname与inventory_hostname_short
  inventory_hostname是Ansible所识别的当前正在运行task的主机的主机名。如果在inventory里定义过别名,那么这里就是那个别名,如果inentory包含如下一行:
  server1 ansible_ssh_host=192.168.1.1
  则inventory_hostname即为server1
  利用hostvars和inventory_hostname变量,可以输出与当前主机相关联的所有变量:
  - debug: var=hostvars[inventory_hostname]
  
与inventory_hostname相近的还有一个inventory_hostname_short,如果一台主机的
inventory_hostname为server1.exmaple.com,则inventory_hostname_short的值为
server1
  3、group_names
  用于标识当前正在执行task的目标主机位于的主机组。假如我们有三台主机,用来配置成一主二从的mysql服务器。inventory配置如下:
  [mdb]
  db1
  [sdb]
  db2
  db3
  mysql配置文件my.conf.j2示例如下:
  {% if 'db1' in group_names %}
  [mysqld]
  server-id=1
  log-bin=mysql-bin
  log-bin-index=mysql-bin.index
  sync-binlog=1
  innodb_flush_log_at_trx_commit=1    #我们知道db1在mdb组,当db1与当前执行c一组时,我们认为当前主机即在mdb组,所以对当前主机应用mysql master的配置
  {% else %}
  [mysqld]
  server-id=2
  relay-log=relay-log
  relay-log-index=relay-log.index
  read-only = yes
  sync_master_info = 1
  sync_relay_log = 1
  sync_relay_log_info = 1
  relay_log_recovery = 1
  skip_slave_start    #当db1与当前主机不在同一组时,则认为当前主机不在mdb组,即应用my slave的配置
  {% endif %}
  我们执行如下task:
  - name: copy config file to mysql master
  template: src=my.conf.j2 dest=/etc/my.cnf
  4、groups
  当你想要访问一组主机的变量时,groups变量会很有用。假如我们有一个inventory文件定义如下:
  [web]
  server1
  server2
  在配置一台HAproxy的负载均衡器时,我们的配置文件肯定需要web群组的所有服务器的IP,配置文件包含如下片段:
  backend web-backend
  {% for host in groups.web%}
  server `host`.`inventory_hostname` ` host`.`ansible_default_ipv4`.`address `:80
  {% endfor %}
  最终生成的文件如下:
  backend web-backend
  server server1 192.168.1.1
  server server2 192.168.1.2
  再给一个例子,在所有的dbservers组的服务器上创建一个数据库用户kate:
  - name: Create a user for all db servers
  mysql_user: name=kate password=test host={{ hostvars.[item].ansible_eth0.ipv4.address }} state=present
  with_items: groups['dbservers']
  5、play_hosts    #当前playbook会在哪些hosts上运行
  6、ansible_version    #当前ansible的版本
  7、inventory_dir    #主机清单所在目录
  8、inventory_file    #主机清单文件
  七、通过命令行设置变量
  示例如下:
  ---
  - hosts: '` hosts `'
  remote_user: '` user `'
  tasks:
  - ...

  ansible-playbook>  也可以写成类似如下方式:
  --extra-vars '{"pacman":"mrs","ghosts":["inky","pinky","clyde","sue"]}'
为了方便调试,ansible提供了debug模块来很方便的查看模块。用法可以参考通过fact获取主机变量中的打印本地fact的示例九、变量优先级1、extra vars(命令中-e)最优先  2、inventory 主机清单中连接变量(ansible_ssh_user 等)
  3、play 中 vars、vars_files 等
  4、剩余的在 inventory 中定义的变量
  5、系统的 facts 变量
  6、角色定义的默认变量(roles/rolesname/defaults/main.yml)
  注:子组会覆盖父组,主机总是覆盖组定义的变量

运维网声明 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-543270-1-1.html 上篇帖子: Ansible之十:Playbook的角色与包含 下篇帖子: ansible部署tocmat
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

扫描微信二维码查看详情

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


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


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


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



合作伙伴: 青云cloud

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