05-Ansible变量

2020-01-14 17:50:24 浏览数 (1)

主机、命令行、剧本、变量

主机变量

代码语言:txt复制
[student@workstation ansible]$ cat inventory 
[dev]
servera

[test]
serverb

[prod]
serverc http_port=8080
serverd http_port=8081

[balancers]
serverb

[webservers:children]
prod

使用-e传递命令行变量

代码语言:txt复制
ansible-playbook -e "cmdvar=hahayaa" myvariables.yaml

剧本变量是用vars来定义的

代码语言:txt复制
- hosts: all
  remote_user: root

  vars:
  - msg: "erererThis is Playbook Variable duoduolalaaamengmeng"
  
  tasks:
  #1.这个是命令行变量
  - name: commandline variables
    copy: content={{ cmdvar }} dest=/tmp/cmd.txt

  #2.这个是playbook变量
  - name: playbook variables
    copy: content={{ msg }} dest=/tmp/msg.txt

  #3.这个是主机列表,写在主机后面的变量
  - name: host inventory variables
    copy: content={{ http_port }} dest=/tmp/port.txt

使用-e 传递一个变量文件,格式@path

代码语言:txt复制
ansible servera -e "@/home/ansible/myvars" -m debug -a "var=password"

主机组变量

也可以单独写主机变量

代码语言:txt复制
[dev:vars]
http_port=8989
server_name=www.example.com

高级主机组变量

上面定义主机变量的方式是直接在hosts文件中,写主机变量,此种方法是把它独立到一个特定文件夹里的文件里面去写(推荐)

1.主机列表存放的目录

代码语言:txt复制
[ansible@workstation ~]$ cat ansible.cfg 
#主机列表存放的目录
[defaults]
inventory      = /home/ansible/inventory/hosts

2.查看主机配置文件

代码语言:txt复制
[ansible@workstation ~]$ cat inventory/hosts 
[dev]
servera user=haha
serverb

3.在主机目录下创建group_vars(主机组变量),host_vars(单个主机变量),注意一定是要在主机列表目录创建这两个文件夹

代码语言:txt复制
[ansible@workstation ~]$ tree .
.
├── ansible.cfg
├── inventory
│   ├── group_vars
│   │   └── dev
│   ├── hosts
│   └── host_vars
│       └── servera
└── roles

4.查看group_var目录文件的内容

代码语言:txt复制
[ansible@workstation ~]$ cat inventory/group_vars/dev 
baobaobao: httpd

5.查看host_vars目录文件的内容

代码语言:txt复制
[ansible@workstation ~]$ cat inventory/host_vars/servera 
user: lalala
home: /home/lalala

6.测试一下结果

使用主机组的变量测试

代码语言:txt复制
[ansible@workstation ~]$ ansible dev -m debug -a
"msg={{ baobaobao }}"
servera | SUCCESS => {
    "msg": "httpd"
}
serverb | SUCCESS => {
    "msg": "httpd"
}

使用主机变量查看结果

代码语言:txt复制
[ansible@workstation ~]$ ansible servera -m debug -a "msg='{{ user }} {{ home }}'"
servera | SUCCESS => {
    "msg": "lalala /home/lalala"
}

注:主机变量优先级高于主机组变量

注册变量

代码语言:txt复制
- hosts: h1
  remote_user: root
  tasks:
  - name: make log
	shell: echo 'hahalalayaya' > /tmp/msg.log
	
	#将shell执行的返回结果以json的形式返回给retmsg
    register: retmsg

  - name: get return values
	#使用debug输出变量
    debug:
     var: retmsg

Shell模块的返回结果,每个模块的返回结果都不一定一样

代码语言:txt复制
ok: [host1] => {
    "retmsg": {
        "changed": true, 
        "cmd": "echo 'hahalalayaya' > /tmp/msg.log",  #执行的命令
        "delta": "0:00:00.002812", #命令执行了多久
        "end": "2019-11-06 15:29:39.912294", #命令结束时间
        "failed": false, 
        "rc": 0,  #$?的结果
        "start": "2019-11-06 15:29:39.909482", #命令开始时间
        "stderr": "",  #标准错误输出
        "stderr_lines": [], 
        "stdout": "",  #标准输出
        "stdout_lines": []
    }
}
代码语言:txt复制
#输出json格式内容的两种方式
    #方式一
  - name: print cmd
debug:
 #注意输出的内容要加双引号
     msg: "{{ retmsg.cmd }}"

	#方式二    
  - name: print status
    debug:
     msg: "result={{ retmsg['rc'] }}"

Facts变量

facts代表主机各种信息

收集facts信息

获取目标主机安装的详细信息

ansible_os_family

获取fqdn信息

ansible_fqdn

获取主机的环境变量信息

ansible_env

获取主机名

ansible_hostname

获取目标主机所有接口信息

ansible_interface

获取默认ipv4地址

ansible_default_ipv4.address

获取默认网卡地址

ansible_default_ipv4.macaddress

获取dns域名信息

ansible_dns.nameservers

获取内核版本号

ansible_kernel

获取操作系统类型

ansible_os_family

获取分区vda的大小

ansible_devices.vda.size

获取目标主机安装的详细信息,放到本机目录中

代码语言:txt复制
ansible all -m setup --tree /tmp/facts

过滤Facts变量

代码语言:txt复制
ansible dev -m setup -a "filter=*ansible_devices*"
ansible dev -m setup -a "filter=*ansible_default_ipv4*"

Facts变量的引用

在playbook文件中,或者在模板文件中引用

代码语言:txt复制
- hosts: all
  tasks:
  - debug:
     msg: 
     - "{{ ansible_hostname }}"
     - "{{ ansible_default_ipv4.address }}"
     - "{{ ansible_dns['nameservers'][0] }}"

关闭Facts收集

关闭facts收集以后,playbook启动的时间会变快

代码语言:txt复制
- hosts: dev
  gather_facts: no
  tasks:
  - debug:
     msg: "closeed facts"

随时开启Facts收集

代码语言:txt复制
- hosts: dev
  gather_facts: no
  tasks:
  - setup:

  - debug:
     msg: 
     - "closeed facts"
     - "{{ ansible_hostname }}"

自定义Facts变量

ansible 在收集主机信息的时候默认是在/etc/ansible/facts.d/目录下,注意是在远程主机目录下!!!

1.自定义目录与内容,两种风格方式都可以

代码语言:txt复制
tail /home/ansible/facts.d/*
==> /home/ansible/facts.d/haha.fact <==
[name]
haha = 123
xixi = 456

==> /home/ansible/facts.d/my.fact <==
{

 "users": {
  "shenqi": {
	 "level":"99",
	 "hobby": "[ 'computer' ,'music']"
	}

 }
}

2.使用fact_path可以指定目录,在所有目标端,都必须要有这个目录以及里面的文件才行!!!

代码语言:txt复制
ansible localhost -m setup -a 'fact_path=/home/ansible/facts.d/ filter=*local*'
localhost | SUCCESS => {
    "ansible_facts": {
        "ansible_local": {
            "haha": {
                "name": {
                    "haha": "123", 
                    "xixi": "456"
                }
            }, 
            "my": {
                "users": {
                    "shenqi": {
                        "hobby": "[ 'computer' ,'music']", 
                        "level": "99"
                    }
                }
            }
        }
    }, 
    "changed": false
}

引用外部变量

vars指令用于定义变量,可以在play中和task中使用

vars_files

vars_files指令用于引用外部定义了变量的文件,只能在play中使用,不能作为task中指令使用。

举例

代码语言:txt复制
[student@workstation ansible]$ cat get_user.yml 
- hosts: servera
  vars_files:
  - users.yml
  
  tasks:
  - debug:
     msg: >
      name={{ item.key }} 
      id={{ item.value.id }} 
      age={{ item.value.age }} 
      alias={{ item.value.alias }}
    with_dict: "{{ users }}"

变量文件

代码语言:txt复制
[student@workstation ansible]$ cat users.yml 
users:
 xiaoming:
   id: 1
   age: 12
   alias: jery
 gouwa:
   id: 6
   age: 9
   alias: eric

执行结果

代码语言:txt复制
[student@workstation ansible]$ ansible-playbook get_user.yml 

PLAY [servera] **************************************************************************************************

TASK [Gathering Facts] **************************************************************************************************
ok: [servera]

TASK [debug] **************************************************************************************************
ok: [servera] => (item={'key': u'xiaoming', 'value': {u'alias': u'jery', u'age': 12, u'id': 1}}) => {
    "item": {
        "key": "xiaoming", 
        "value": {
            "age": 12, 
            "alias": "jery", 
            "id": 1
        }
    }, 
    "msg": "name=xiaoming  id=1  age=12  alias=jeryn"
}
ok: [servera] => (item={'key': u'gouwa', 'value': {u'alias': u'eric', u'age': 9, u'id': 6}}) => {
    "item": {
        "key": "gouwa", 
        "value": {
            "age": 9, 
            "alias": "eric", 
            "id": 6
        }
    }, 
    "msg": "name=gouwa  id=6  age=9  alias=ericn"
}

PLAY RECAP **************************************************************************************************
servera                    : ok=2    changed=0    unreachable=0    failed=0   

include_vars

include_vars即可以在play中使用,也可以在task中用。

代码语言:txt复制
[student@workstation ansible]$ cat get_user.yml 
- hosts: servera
  tasks:
  - name: get user vars
    include_vars: users.yml
  - debug:
     msg: >
      name={{ item.key }} 
      id={{ item.value.id }} 
      age={{ item.value.age }} 
      alias={{ item.value.alias }}
    with_dict: "{{ users }}"

效果同上

0 人点赞