• ansible自定义变量 一介凡人


    变量的定义:

    • 变量名应该由字母、数字下划数组成
    • 变量名必须以字母开头
    • ansible内置关键字不能作为变量名

    一、在Inventory中定义变量

     1、 定义主机变量(在主机清单里定义)

    1.1 内置主机变量

    所谓内置变量其实就是ansible.cfg配置文件中的选项,在其前加上ansible_即成为内置变量。当然内置变拥有比ansible.cfg中选项更高的优先级,而且针对不同的主机,可以定义不同的值。

    # 一般连接
    ansible_ssh_host     #用于指定被管理的主机的真实IP
    ansible_ssh_port     #用于指定连接到被管理主机的ssh端口号,默认是22
    ansible_ssh_user     #ssh连接时默认使用的用户名
    
    # 特定ssh连接
    ansible_connection     #SSH连接的类型:local, ssh, paramiko,在ansible 1.2 之前默认是paramiko,后来智能选择,优先使用基于ControlPersist的ssh(如果支持的话)
    
    ansible_ssh_pass     #ssh连接时的密码
    ansible_ssh_private_key_file  #秘钥文件路径,如果不想使用ssh-agent管理秘钥文件时可以使用此选项
    
    ansible_ssh_executable  #如果ssh指令不在默认路径当中,可以使用该变量来定义其路径
    
    # 特权升级
    ansible_become  #相当于ansible_sudo或者ansible_su,允许强制特权升级
    ansible_become_user #通过特权升级到的用户,相当于ansible_sudo_user或者ansible_su_user
    ansible_become_pass  # 提升特权时,如果需要密码的话,可以通过该变量指定,相当于ansible_sudo_pass或者ansible_su_pass
    
    ansible_sudo_exec     #如果sudo命令不在默认路径,需要指定sudo命令路径
    
    # 远程主机环境参数
    ansible_shell_executable # 设置目标机上使用的shell,默认为/bin/sh
    
    ansible_python_interpreter  #用来指定python解释器的路径,默认为/usr/bin/python 同样可以指定ruby 、perl 的路径
    ansible_*_interpreter     #其他解释器路径,用法与ansible_python_interpreter类似,这里"*"可以是ruby或才perl等其他语言
    

    实例:

    [test]
    192.168.1.1 ansible_ssh_user=root ansible_ssh_pass='P@ssw0rd'
    192.168.1.2 ansible_ssh_user=breeze ansible_ssh_pass='123456'
    192.168.1.3 ansible_ssh_user=bernie ansible_ssh_port=3055 ansible_ssh_pass='456789'
    

    1.2 定义主机组变量

    变量也可以通过组名,应用到组内的所有成员:

    [wuhan]
    web1
    web2
    
    [suizhou]
    web4
    web3
    
    [hubei:children]
    wuhan
    suizhou
    
    [hubei:vars]
    ntp_server=192.168.1.10
    zabbix_server=192.168.1.10
    

    二、在Playbook中定义变量

    2.1 变量的定义方式

    2.1.1 通过vars关键字定义

    - name: use vars define invrionmemnt
      hosts: test
      user: ansible
      vars: 
        http_port: 80
        server_name: localhost
        conf_file: /etc/nginx/conf/default.conf
    

    2.1.2  通过vars_files关键字引入变量文件

    - hosts: all
      remote_user: root
      vars:
        favcolor: blue
      vars_files:
        - vars/external_vars.yml
        - vars/user_vars.yml
    
    # vars/user_vars.yml示例:
    users:
      bjones:
        first_name: Bob
        last_name: Jones
        home_dirs: /users/bjones
      acook:
        first_name: Anne
        last_name: Cook
        home_dirs: /users/acook
    

    2.1.3  在playbook中通过host_vars和group_vars目录定义变量

    下面这是一个项目的playbook目录结构。这个项目中,包含一个ansible.cfg文件,一个inventory文件,一个playbook.yml文件,一个group_vars目录和一个host_vars目录:

    # tree /etc/ansible/playbooks/project
    /etc/ansible/playbooks/project
    ├── ansible.cfg
    ├── group_vars
    │   ├── datacenter1
    │   ├── datacenter2
    │   └── datacenters
    ├── host_vars
    │   ├── demo1.example.com
    │   ├── demo2.example.com
    │   ├── demo3.example.com
    │   └── demo4.example.com
    ├── inventory
    └── playbook.yml
    

    其中inventory文件的示例如下:

    [datacenter1]
    demo1.example.com
    demo2.example.com
    
    [datacenter2]
    demo3.example.com
    demo4.example.com
    
    [datacenters:children]
    datacenter1
    datacenter2
    

    可以看到group_vars目录中,定义了三个文件,分别以inventory文件中的三个主机组命名,所以这三个文件中定义的就分别是这三个组可以使用的变量。

    此种自定义变量比较常见,inventory.ini主机清单中主机组的[datacenter1]对应group_vars下的datacenter1.yml文件

    在host_vars目录中,定义了三个文件,分别以inventory文件中的四个主机命名,所以这四个文件中定义的就分别是这四个主机可以使用的变量。

    # cat demo1.example.com 
    package: httpd
    
    # cat demo2.example.com 
    package: apache
    
    # cat demo3.example.com 
    package: mariadb-server
    
    # cat demo4.example.com 
    package: mysql-server
    

    假如主机组定义的变量与主机冲突,主机变量优先级最高

    2.1.4 注册变量

    在有些时候,可能需要将某一条任务执行的结果保存下来,以便在接下的任务中调用或者做些判断。可以通过register关键字来实现将某一任务结果保存为一个变量。

    - name: register variables
      hosts: test
      tasks:
        - name: capture output of whoami command
          command: whoami
          register: login
    

    注册变量的应用场景:

    • 在一台远端的服务器获取一个目录下的一列表的文件,然后下载这些文件
    • 在handler执行之前,发现前面一个task发生了changed,然后执行一个指定的task
    • 获取远端服务器的ssh key的内容,构建出known_hosts文件

    2.1.5 设置变量set_fact

    ---
    - hosts: 192.168.40.132
      remote_user: root
      tasks:
      - set_fact:
          testvar: "2022-1-9"
      - debug:
          msg: "{{testvar}}"
    

    2.1.6  通过命令行设置变量

    ---
    - hosts: '{{ hosts }}'
      remote_user: '{{ user }}'
      tasks:
         - ...
    ansible-playbook release.yml --extra-vars "hosts=vipers user=starbuck"
    
    或者
    --extra-vars '{"hosts":"vipers","user":"starbuck"}'

    三、变量优先级

    ansible中变量的优先级

    • -e (--extra-vars 选项指定的变量)最高
    • inventory 主机清单中定义的变量(ansible_ssh_user等)
    • play剧本中vars、vars_files定义的变量
    • 系统的facts变量
    • 角色定义的默认变量 最低

    从上到下优先级逐渐降低,高优先级会覆盖掉低优先级的变量

    变量的优先级
    变量的优先级指的是优先级越高的会覆盖优先级低的,下边的优先级由低到高进行排列:

    • role defaults
    • inventory vars
    • inventory group_vars
    • inventory host_vars
    • playbook group_vars
    • playbook host_vars
    • host facts
    • play vars
    • play vars_prompt
    • play vars_files
    • registered vars
    • set_facts
    • role and include vars
    • block vars (only for tasks in block)
    • task vars (only for the task)
    • extra vars (always win precedence)



     

    https://www.cnblogs.com/mauricewei/p/10054300.html   很详细

  • 相关阅读:
    String方法
    多态
    观察者模式
    ArrayList和LinkList
    唐岛湾
    AForge.Net C#的操作视频,照片读写功能
    JqGrid填坑
    日常点滴
    日常点滴
    EF Core 填坑记录
  • 原文地址:https://www.cnblogs.com/zjz20/p/14679129.html
Copyright © 2020-2023  润新知