Ansible教程(5)playbook的变量定义与调用

Tanglu 系统运维 2020-09-22 20004 0

一、Ansible变量的作用

在Ansible中支持设置主机变量、组变量,变量支持嵌套使用,定义好了的变量可以在playbook中引用。由于Ansible是在每个主机上单独运行命令,所以不同的主机去调用同样的变量,也可以取到不同的值得,这样进行一些配置就更灵活合理


二、Ansible变量定义与调用

方法1:在/etc/ansible/hosts文件中定义变量

# 定义变量
vim /etc/ansible/hosts
[apache] 
192.168.1.36 webdir=/opt/test     #定义单个主机的变量 
192.168.1.33 
[apache:vars]      #定义整个组的统一变量
webdir=/web/test

[nginx] 192.168.1.3[1:2]
[nginx:vars]
webdir=/opt/web

# playbook调用变量
cat variables.yml 
---
- hosts: all
  remote_user: root
  tasks: 
    - name: create webdir 
      file: name={{ webdir }} state=directory   #引用变量

# 执行playbook
[root@ansible PlayBook]# ansible-playbook variables.yml


方法2:在playbook中定义和调用变量

cat apache.yml
- hosts: webservers
  remote_user: root 
  vars:  #开始声明变量 
  - package: httpd  #变量名与变量值 
  - service: httpd
  tasks:
  - name: install apache
    yum: name={{ package }} state=latest  #要引用的变量用"{{ }}"囊括
  - name: install configure file for httpd
    copy: src=/root/conf/httpd.conf dest=/etc/httpd/conf/httpd.conf
  - name: start httpd service
    service: enabled=true name={{ service }} state=started


方法3:使用ansible-playbook -e选项定义变量,命令行变量优先级高于配置文件中的变量

cat app.yml 
---
- hosts: all
  remote_user: root
  tasks: 
    - name: install httpd 
      yum: name="{{ package }}"  #配置文件声明需要引用的变量名

ansible-playbook -e 'package=httpd' app.yml  #通过-e给变量赋值,在app.yml文件全局生效


方法4:调用setup模块获取变量

setup模块主要用于获取主机信息并保存在变量中,如IPv4、IPv6、MAC地址、磁盘分区等。该模块获取到的变量是可以直接调用的,无需定义

ansible webserver -m setup


红框处每个引号内的就是默认变量名,使用双花括号可以直接引用。对于一些包含多个层级的变量(比如磁盘分区会存在sda、sdb、sdc...),可以通过从上级书写的形式,比如{{ansible_devices.sda.partitions.sda.size}}

- hosts: webservers
  remote_user: root
  tasks:
  - name: copy file
    copy: content='{{ ansible_default_ipv4.address }}' dest=/tmp/vars.ans


ansible变量1.png 


方法5:使用独立的YAML文件定义变量

为了方便管理将所有的变量统一放在一个独立的变量YAML文件中,laybook文件直接引用文件调用变量即可

# 定义存放变量的文件
cat var.yml 
var1: vsftpd
var2: httpd

# 编写playbook
cat variables.yml 
---
- hosts: all
  remote_user: root
  vars_files:    #引用变量文件
    - ./var.yml   #指定变量文件的path(这里可以是绝对路径,也可以是相对路径)

  tasks:
    - name: install package
      yum: name={{ var1 }}   #引用变量
    - name: create file
      file: name=/tmp/{{ var2 }}.log state=touch   #引用变量


# 执行playbook
[root@ansible PlayBook]# ansible-playbook  variables.yml

评论