zoukankan      html  css  js  c++  java
  • ansible 变量

    ansible的变量定义可以在很多地方定义,如下:

    1、命令行设置变量

    命令行直接使用变量,在运行playboox的时候,使用--extra-vars或者-e选项指定额外的变量

    #ansible-playbook -e "test=123" install_nginx.yml

    也可以将变量写入到一个JSON或者yaml文件中,命令行通过导入文件来获取变量。

    #ansible-playbook -e "@test.json" install_nginx.yml 
    #ansible-playbook -e "@test.yaml" install_nginx.yml 

    2、playboox中定义变量

    (1)使用vars关键字定义变量

    ---
    - hosts: hadoop
      remote_user: root
      gather_facts: no
      vars:
        test: 123
    
      tasks:
        - name: test var
          debug:
            msg: "return var test ,value is {{ test }}"

    (2)变量写入到文件,在playboox中使用vars_files关键字导入。

    ---
    - hosts: hadoop
      remote_user: root
      gather_facts: no
      vars_files:
        - test.yml
    
      tasks:
        - name: test var
          debug:
            msg: "return var test ,value is {{ test }}"

    3、ansible内置变量,使用setup模块获取到的值。可以在命令行通过如下命令获取所有的变量。

    ansible hadoop -m setup

    4、在主机清单中定义变量

    在hosts(默认是/etc/ansible/hosts)文件中,变量会被定义在主机名的后面或者组名的下方,如下:

    //为某个主机定义变量
    [hadoop]
    192.168.4.50 namenode_state=yes
    //为某个组指定变量,作用范围组内的所有机器。
    [hadoop:vars]
    yarn_state=yes

    当主机过多的时候,在Inventory中定义变量会略显复杂,官方也不建议这么做,其实在执行ansible命令的时候,ansible默认会从/etc/ansible/host_vars和/etc/ansible/group_vars/两个目录下读取变量定义,如果不存在,可以自己创建,并且在这两个目录中创建与主机名或者组名同名的文件来定义变量,当然,也可以创建all文件,表示定义所有的机器的环境变量。

    5、注册变量 register

    所谓的注册变量就是讲操作的结果,包括标准输出和标准错误输出,报错到变量中,然后跟这个变量的内容来进行下一步的操作,在这个过程中用来变成操作结果的变量就叫做注册变量。

    ---
    - hosts: test50
      remote_user: root
      gather_facts: no
      tasks:
        - name: test
          shell: echo 123 > /tmp/aa
          register: testvar
        - name: register var
          debug:
            msg: "echo {{ testvar }}"

    6、数组变量或者叫列表变量

    ---
     - hosts: hadoop
       remote_user: root
       gather_facts: no
       vars:
         test_list:
           - one
           - two
           - three
    
       tasks:
         - name: test vars_list
           debug:
    #         msg: "print {{ test_list[0] }}"     
             msg: "print {{ test_list|first }}"

    调用数组变量的方法有如下两种:建议使用第一种

    (1)test_list[0] 标准的python用法,0表示第一个元素,依次类推。。。

    (2)test_list|first  jinja2语法

    7、字典变量(有点类似字典)

    如ansible的内置变量ansible_br0

    ---
     - hosts: hadoop
       remote_user: root
       gather_facts: yes
    
       tasks:
         - name:
           debug:
             var: ansible_br0

    输出如下:

    [root@manager1 playbook 17:51:14]#ansible-playbook dict_vars.yml 
    
    PLAY [hadoop] ****************************************************************************************************************************************************************************************************************************************************************
    
    TASK [Gathering Facts] *******************************************************************************************************************************************************************************************************************************************************
    ok: [192.168.4.50]
    
    TASK [debug] *****************************************************************************************************************************************************************************************************************************************************************
    ok: [192.168.4.50] => {
        "ansible_br0": {
            "active": true, 
            "device": "br0", 
            "features": {
                "busy_poll": "off [fixed]", 
                "fcoe_mtu": "off [fixed]", 
                "generic_receive_offload": "on", 
                "generic_segmentation_offload": "on", 
                "highdma": "off [requested on]", 
                "hw_tc_offload": "off [fixed]", 
                "l2_fwd_offload": "off [fixed]", 
                "large_receive_offload": "off [fixed]", 
                "loopback": "off [fixed]", 
                "netns_local": "on [fixed]", 
                "ntuple_filters": "off [fixed]", 
                "receive_hashing": "off [fixed]", 
                "rx_all": "off [fixed]", 
            ........

    这种变量有点复杂,如果想要获取其中的值,比如获取IP地址

    可以使用

    {{ ansible_br0.ipv4.address }}或者

    {{ ansible_br0['ipv4']['address'] }}  这种方式有点像python获取字典的值。

    8、hostvars变量

    从一台远程主机获取另外一台远程主机的变量信息。

    用法: {{ hostvars['host']['变量'] }}

    比如:在主机清单中,定义如下:

    [hadoop]
    192.168.4.50 admin_user=root

    这个时候就可以通过hostvars来获取admin_user的变量值

    ---
     - hosts: hadoop
       remote_user: root
       gather_facts: yes
    
       tasks:
         - name:
           debug: 
             msg: "{{ hostvars['192.168.4.50']['admin_user'] }}"

    9、远程设置主机本地变量

    设置远程主机的本地变量,需要定义在/etc/ansible/facts.d目录下,并且文件以.fact结尾,文件格式可以是INI或者JSON。

    例如:

    [root@manager1 playbook 18:16:02]#cat /etc/ansible/facts.d/test.fact 
    [user]
    yjt=nice



    [root@manager1 playbook 18:15:42]#ansible hadoop -m setup -a "filter=ansible_local"   #使用filter进行过滤
    192.168.4.50 | SUCCESS => {
    "ansible_facts": {
    "ansible_local": {
    "test": {
    "user": {
    "yjt": "nice"
    }
    }
    },
    "discovered_interpreter_python": "/usr/bin/python"
    },
    "changed": false
    }

  • 相关阅读:
    面向过程--面向对象
    shiro有哪些组件?
    Redis的特点什么是?
    Spring Boot 有哪些优点?
    什么是 JavaConfig?
    HashMap和Hashtable的区别
    深入理解SQL的四种连接-左外连接、右外连接、内连接、全连接
    Linux指令--tar,gzip
    JQuery 学习总结及实例
    $(this) 和 this 关键字在 jQuery 中有何不同?
  • 原文地址:https://www.cnblogs.com/yjt1993/p/10969266.html
Copyright © 2011-2022 走看看