前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >05-Ansible变量

05-Ansible变量

原创
作者头像
小朋友呢
修改2020-01-14 17:50:24
1.1K0
修改2020-01-14 17:50:24
举报

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

主机变量

代码语言: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=jery\n"
}
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=eric\n"
}

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 }}"

效果同上

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 主机、命令行、剧本、变量
  • 主机组变量
  • 高级主机组变量
  • 注册变量
  • Facts变量
    • 收集facts信息
      • 过滤Facts变量
        • Facts变量的引用
          • 关闭Facts收集
            • 随时开启Facts收集
              • 自定义Facts变量
              • 引用外部变量
                • vars_files
                  • include_vars
                  领券
                  问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档