23.Ansible变量

Ansible变量

变量定义的方式

  • 命令行定义变量

  • 在play文件定义变量

  • 在主机清单定义变量

变量的优先级

命令行>playbook文件>lnventory文件

如何定义变量

playbook中定义变量

playbook变量可以通过多种方式进行定义,最简单的方式就是在playbook的开头通过vars进行定义

- hosts: web_group
  vars:
    - pkg: nginx
    - pkg2: tree
  tasks:
    - name: create file
      file:
        path: /root/{{ pkg }}
        state: touch
        
    - name: install {{ pkg2 }}
      yum:
        name: "{{ pkg2 }}"
        state: present

vars_file中定义变量

在playbook中使用vars定义变量,有一个缺陷,就是其他的playbook无法使用该变量。所以我们可以 采取第二种定义变量的方式,在vars_file中定义变量。

vim bianliiang.yml
pkg: httpd
pkg2: tree
pkg3: mariadb-server

vim test_vars.yml

- hosts: web_group
  vars_filles: /root/ansible/bianliang/yml
  tasks:
    - name: create file
      file:
        path: /root/{{ pkg2 }}
        state: touch
        
    - name: install {{ pkg2 }}
      yum:
        name: "{{ pkg2 }}"
        state: present

vim bianliang.yml
pkg:
  - httpd
  - tree
  - mariadb-server
  
## 内置变量
- hosts: web_group
  vars_files: /root/ansible/bianliang.yml
  tasks:
    - name:create file
      file:
        path: /root/{{ ansible_fqdn }}_{{ ansible_default_ipv4.address }}_{{ ansible_memtotal_mb }}
        state: touch

inventory定义变量

注意:在Inventory中定义变量,主机的变量要高于主机组的变量,所以该方法不推荐使用,容易将环境弄乱。

1.命令行
2.playbook
    - vars_file
    - vars
3.主机清单
    - host_vars
    - group_vars
    - inv.host
    - inv.group

官方推荐的变量定义位置

## 1.创建两个目录
group_vars
host_vars

## 2.测试主机清单优先级

/etc/ansible/hosts

[web_group:vars]
filename=inventory_webgroup

[web01:vars]
filename=inventory_web01

[web02:vars]
filename=inventory_web02

[web03:vars]
filename=inventory_web03

hosts_vars
[root@m01 host_vars]# cat ./*
web01
filename: web01
web02
filename: web02
web03
filename: web03
 vim web_group
filename: web_group

变量注册

如上执行结果可见,当我们使用shell模块执行ls -l /时,ansible给我们返回的只有changed我们无法看到执行之后的 结果,所以此时我们需要使用到变量注册

# 编辑playbook
vim register.yml
- hosts: web_group
  tasks:
    - name: test register vars
    shell: "ls -l /"
    register: list_dir
    
# 查看执行结果
[root@m01 ~]# ansible-playbook register.yml

# 只输出自己想要的内容
[root@m01 ~]# vim register.yml
- hosts: web_group
  tasks:
    - name: Test Register Vars
      shell: "ls -l /"
      register: list_dir
    - name: Return Result
      debug:
        msg: "{{ list_dir.stdout_lines }}"
        
# 查看结果
[root@m01 ~]# ansible-playbook register.yml

#debug模块常用参数
msg: 				#调试输出的消息
var: 				#将某个任务执行的输出作为变量传递给debug模块,debug会直接将其打印输出
verbosity:		    #debug的级别(默认是0级,全部显示)

vim test_shell.yml
- hosts: web_group
  tasks:
    - name: xxx
      shell: 'ls -l /etc/passwd /etc/shadow'
      register: suibian
    - name: get result
      debug:
        msg: "{{ suibian.stdout_lines.1 }}"


[root@m01 ~]# vim test_shell.yml
- hosts: web_group
  tasks:
    - name: ifconfig
      shell: 'ifconfig'
      register: suibian
    - name: get result
      debug:
        msg:
          - "{{ suibian.stdout_lines.0 }}"
          - "{{ suibian.stdout_lines.1 }}"
          - "{{ suibian.stdout_lines.2 }}"
          - "{{ suibian.stdout_lines.3 }}"
          - "{{ suibian.stdout_lines.4 }}"
          - "{{ suibian.stdout_lines.5 }}"
          - "{{ suibian.stdout_lines.6 }}"
          - "{{ suibian.stdout_lines.7 }}"
          
          
- hosts: web_group
  tasks:
    - name: ifconfig
      shell: 'ifconfig'
      register: suibian
   - name: get result
     debug:
       msg: "{{ suibian.stdout_lines[0:7] }}"
       
- hosts: web_group
  tasks:
    - name: ifconfig
      shell: 'ifconfig'
      register: suibian
    - name: get result
      debug:
        msg: "{{ suibian.stdout_lines[:7] }}"

层级定义变量

lnmp:
  pkg:
    web: nginx
    db: mariadb-server
    php: php-fpm
    
    
- hosts: web01_zls
  tasks:
    - name: Install {{ lnmp.pkg.db }}
      yum:
       name: "{{ lnmp.pkg.db }}"
       state: present

facts缓存

## 关闭facts缓存
- hosts: web01_aaa
  gather_facts: no
  tasks:
    - name: Install {{ lnmp.pkg.db }}
      yum:
        name: "{{ lnmp.pkg.db }}"
        state: present
posted @ 2021-08-15 17:40  陈金峰  阅读(66)  评论(0)    收藏  举报