0
点赞
收藏
分享

微信扫一扫

五月学习之Ansible Variables

三、Ansible Variables

1、什么是变量

变量提供了便捷的方式来管理 ansible 项目中的动态值。 比如 nginx-1.12,可能后期会反复的使用到这个版本的值,那么如果将此值设置为变量,后续使用和修改都将变得非常方便。

2、变量定义的方式

在 Ansible 中定义变量分为如下三种方式:
1) 通过命令行传递变量参数定义
2) 在play文件中进行定义变量
  2.1) 通过vars定义变量
  2.2) 通过vars_files定义变量
3) 通过inventory在主机组或单个主机中设置变量
  3.1) 通过host_vars对主机进行定义
  3.2) 通过group_vars对主机组进行定义

问题:如果定义的变量出现重复,造成冲突,如何解决?

3、在Playbook中定义变量

3.1 vars方式定义变量

cat f1.yml
- hosts: webservers
  vars:
    - web_packages: httpd
    - ftp_packages: vsftpd
  tasks:
    - name: Output Vaiables
      debug:
        msg:
          - "{{ web_packages }}"
          - "{{ ftp_packages }}"

3.2 vars_files方式定义变量

五月学习之Ansible Variables_文件名

在 playbook 中使用 vars_files 指定文件作为变量文件,好处就是其他的 playbook 也可以调用;

cat vars.yml
web_packages: httpd
ftp_packages: vsftpd

cat f2.yml
- hosts: webservers
  vars_files: ./vars.yml
  tasks:
    - name: Output Vaiables
      debug:
        msg:
          - "{{ web_packages }}"
          - "{{ ftp_packages }}"

3.3 在Inventory中定义变量

vim /etc/ansible/hosts
[webservers]
172.16.1.7 myid=1 state=master
172.16.1.8 myid=2 state=backup
[webservers:vars]
port=80   # 组变量

cat p3.yml
- hosts: webserverss
  tasks:
    - name: Output Vaiables
      debug:
        msg:
          - "{{ myid }} {{ state }} {{ port }}"

3.4 使用host_vars定义变量

在项目目录中创建 host_vars目录,然后在创建一个文件,文件的文件名称要与 inventory 清单中的主机名称要保持完全一致,如果是ip地址,则创建相同ip地址的文件即可

cat hosts
[webserver]
172.16.1.7
172.16.1.8

mkdir host_vars
cat host_vars/172.16.1.7
web_packages: zlib-static
ftp_packages: zmap

cat f6.yml
- hosts: 172.16.1.7
  tasks:
    - name: Output Vaiables
      debug:
        msg:
          - "{{ web_packages }}"
          - "{{ ftp_packages }}"
          
- hosts: 172.16.1.8
  tasks:
    - name: Output Vaiables
      debug:
        msg:
          - "{{ web_packages }}"
          - "{{ ftp_packages }}"

3.5 使用group_vars定义变量

在项目目录中创建 group_vars目录,然后在创建一个文件,文件的文件名称要与 inventory 清单中的组名称保持完全一致;
cat hosts
[webservers]
172.16.1.7
172.16.1.8

mkdir group_vars
cat group_vars/webservers
web_packages: wget
ftp_packages: tree

cat f6.yml
- hosts: webservers
  tasks:
    - name: "Output Vaiables"
      debug:
        msg:
          - "{{ web_packages }}"
          - "{{ ftp_packages }}"
          
测试其他组能否使用 webservers 组中定义的变量;测试后会发现无法调用;
cat f6.yml
- hosts: lbservers #使用lbservers
  tasks:
    - name: Output Vaiables
      debug:
        msg:
          - "{{ web_packages }}"
          - "{{ ftp_packages }}"
          
但是系统提供了特殊的 all 组,也就说在group_vars 目录下创建一个 all 文件,定义变量对所有的主机组都生效;
cat group_vars/all
web_packages: wget
ftp_packages: tree

cat f6.yml
- hosts: lbserver #无论哪个组使用该变量,都没有任何的问题
  tasks:
    - name: Output Vaiables
      debug:
        msg:
          - "{{ web_packages }}"
          - "{{ ftp_packages }}"

3.6 通过执行Playbook传递变量

在执行Playbook时,可以通过命令行 --extra-vars 或 -e 外置传参设定变量;
cat f5.yml
- hosts: webserver
  tasks:
    - name: Output Vaiables
      debug:
        msg:
          - "{{ web_packages }}"
          - "{{ ftp_packages }}"
          
ansible-playbook f5.yml -i hosts -e "web_packages=GeoIP"

传递多个外置变量的方式
ansible-playbook f5.yml -i hosts -e "web_packages=GeoIP" -e "ftp_packages=telnet"

3.7 变量优先级测试

定义相同的变量不同的值,来测试变量的优先级。操
作步骤如下
1)在plabook中定义vars变量
2)在playbook中定义vars_files变量
3)在host_vars中定义变量
4)在group_vars中定义变量
5)通过执行命令传递变量
结果: 命令行传参-->play中的vars_files-->play中的vars-->host_vars-->group_vars-->group_vars/all

举报

相关推荐

0 条评论