Ansible-Playbook定义变量

  • 2019-09-02
  • 0
  • 0

ansible怎么定义变量和使用变量{{ 变量名称 }}

    1.通过playbook文件中的play进行定义
        通过vars来进行定义变量
        通过vars_files来进行定义变量
    2.通过inventory主机清单进行变量定义
        通过host_vars对主机进行定义
        通过group_vars对主机组进行定义
    3.通过执行playbook时使用-e参数指定变量

1.在playbook文件中的play使用变量

[root@m01 project1]# cat vars_1.yml 
- hosts: web
  vars:
    - web_packages: httpd-2.4.6
    - ftp_packages: vsftpd-3.0.2

  tasks:
    - name: Installed {{ web_packages }} {{ ftp_packages }}
      yum: 
        name:
          - "{{ web_packages }}"
          - "{{ ftp_packages }}"
        state: present  

2.通过定义一个变量文件,然后使用playbook进行调用,变量文件要用yml格式

[root@m01 project1]# cat vars_public.yml 
web_packages: httpd-2.4.6
ftp_packages: vsftpd-3.0.2

[root@m01 project1]# cat vars_1.yml
- hosts: web
#引用变量
  vars_files: ./vars_public.yml

  tasks:
    - name: Installed {{ web_packages }} {{ ftp_packages }}
      yum: 
        name:
          - "{{ web_packages }}"
          - "{{ ftp_packages }}"
        state: present

3.通过inventory主机清单进行变量定义

在项目目录下创建两个变量的目录,host_vars group_vars

3.1、组变量

#1)在当前的项目目录中创建两个变量的目录
[root@ansible project1]# mkdir host_vars
[root@ansible project1]# mkdir group_vars

#2)在group_vars目录中创建一个文件,文件名与inventory清单中的组名称要保持完全一致。
[root@ansible project1]# cat group_vars/web
web_packages: wget
ftp_packages: tree

#3)编写playbook,只需在playbook文件中使用变量即可。
[root@ansible project1]# cat f4.yml 
- hosts: web
  tasks:
    - name: Install Rpm Packages "{{ web_packages }}" "{{ ftp_packages }}"
      yum: 
        name: 
          - "{{ web_packages }}"
          - "{{ ftp_packages }}"
        state: present

注意:
默认情况下,group_vars目录中文件名与hosts清单中的组名保持一致.
比如在group_vars目录中创建了web组的变量,其他组是无法使用web组的变量
系统提供了一个特殊组,all,只需要在group_vars目录下建立一个all文件,编写好变量,所有组都可使用.

比如:

[root@51 group_vars]# pwd
/root/ansible/group_vars
[root@51 group_vars]# cat all 
web_packages: wget
ftp_packages: tree

###3.2 hosts主机清单变量hosts_vars

#1)在host_vars目录中创建一个文件,文件名与inventory清单中的主机名称要保持完全一致
[root@ansible project1]# cat hosts 
[web]
192.168.1.7
192.168.1.8

#2)在host_vars目录中创建文件,给192.168.1.7主机定义变量
[root@ansible project1]# cat host_vars/192.168.1.7 
web_packages: zlib-static
ftp_packages: zmap

#3)准备一个playbook文件调用host主机变量
[root@ansible project1]# cat f4.yml 
- hosts: 192.168.1.7
  tasks:
    - name: Install Rpm Packages "{{ web_packages }}" "{{ ftp_packages }}"
      yum: 
        name: 
          - "{{ web_packages }}"
          - "{{ ftp_packages }}"
        state: present

- hosts: 192.168.1.8
  tasks:
    - name: Install Rpm Packages "{{ web_packages }}" "{{ ftp_packages }}"
      yum: 
        name: 
          - "{{ web_packages }}"
          - "{{ ftp_packages }}"
        state: present

总结:

host_vars 特殊的变量目录,针对单个主机进行变量.
group_vars 特殊的变量目录,针对inventory主机清单中的组进行变量定义. 对A组定义的变量 B组无法调用
group_vars/all 特殊的变量文件,可以针对所有的主机组定义变量.

4.变量的优先级

1.外置传参
2.playbook中指定变量(vars_files--->vars)
3.inventory清单定义变量(host_vars-->group_vars/group_name--->group_vars-all)

5.ansible 变量注册

register 将执行命令的结果存储至check_thhpd变量中
debug通过debug模块,msg方法 输出变量所有的内容,如果希望输出部分内容,后面接上具体变量

[root@m01 project1]# cat vars_9.yml 
- hosts: web
  tasks:
    - name: Installed Httpd Server
      yum: name=httpd state=present

    - name: Service Httpd Server
      service: name=httpd state=started

    - name: Check Httpd Server
      shell: ps aux|grep httpd
      register: check_httpd

    - name: OutPut Variables
      debug:
        msg: "{{ check_httpd.stdout_lines }}"

6.ansible facts变量

用来采集被控端的状态指标,比如: IP地址  主机名称  cpu信息  内存  等等
默认情况的facts变量名都已经预先定义好了, 只需要采集被控端的信息,
然后传递至facts变量即可.

查看全部的变量
shell
[root@51 ansible]# ansible 192.168.1.10 -m setup -i host

如何提取被控端的总内存大小

[root@m01 project1]# ansible 192.168.1.10 -m setup -a "filter=ansible_memtotal_mb" -i host
192.168.1.8 | SUCCESS => {
    "ansible_facts": {
        "ansible_memtotal_mb": 1996, 
     192.168.1   "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": false
}

评论

还没有任何评论,你来说两句吧

提供支持 - 友情链接 - 衫小寨