自动化利器 Ansible - 从了解到应用( 四 )

Ansible 变量使用

  • Ansible的变量名仅能由字母、数字和下划线组成,且只能以字母开头 。
  • Python关键字和playbook关键字都不能作为有效的变量名 。
  • Ansible的变量可以被定义在playbook、inventory、yaml格式文件、角色和命令行中,也可以将任务的输出定义为变量 。
Ansible 自定义变量# 方式1:在Inventory中为主机或组定义专用变量[groupname]192.168.56.1 variable_name=value[groupname:vars]variable_name=value[all:vars]ansible_ssh_port="2222"# 方式2:在playbook中通过关键字vars或vars_files定义变量vars:- var_name: value- var_name: valuevars_files:- ./external_vars.yml# 变量文件内容遵循yml格式# 方式3:在playbook中把任务的输出通过关键字register定义为变量,然后用于其他任务tasks:- name: testshell: /usr/bin/fooregister: foo_result# 方式4:在playbook中使用变量,执行palybook时通过命令行传递变量,通过“-e”或“--extra-vars”参数传递的变量优先级更高ansible-playbook test.yml --extra-vars "hosts=Test user=anliven"# 方式5:指定主机角色时通过 roles 传递变量,并在角色内通过` var_name `调用roles:- { role: ROLE_NAME, var: value, ...}Ansible 系统变量# 远程主机的系统信息统称为facts# facts信息是JSON格式的数据结构,ansible_facts是最上层,可以使用 ansible_facts 变量查看所有内容# 此外默认情况下使用 ansible_ 前缀可以将一些fact作为顶级变量访问# 通过 setup 模块可以查看指定主机的所有facts信息 , 通过使用filter参数来查看指定信息ansible <host> -m setup# 查看指定主机的facts信息ansible ta -m setup | grep "xxx"# 获取主机所有facts然后结合grep命令过滤ansible ta -m setup -a "filter=ansible_os_family"# 通过filter参数来查看指定信息ansible ta -m setup -a 'filter="*mem*"' --tree ./facts# 通过filter参数查看指定信息并按主机名保存到facts目录Ansible 引用变量# 普通变量通过 {{ var_name }} 方式引用# 关键字register或系统fact变量- 返回结果集通常是嵌套yaml或者json的数据结构- 通过{{ var_name.stdout }}或 {{ ansible_facts["eth0"]["ipv4"]["address"] }} 的方式引用Ansible 变量优先级# 优先级1. 命令行中定义的变量(用-e或--extra-vars定义的变量)2. 在Inventory中定义的连接变量(比如:ansible_ssh_user)3. 普通变量(命令行转换、play中的变量、included的变量、role中的变量等)4. 在Inventory中定义的其他变量5. Facts变量Ansible 清单定义Ansible 主机清单(Inventory)Ansible通过Inventory(可管理的主机集合)对远端服务器或者主机进行统一操作和管理 , 默认将主机列在一个文本文件中,这个文件称为Inventory文件 。
  • 默认的路径和文件为:/etc/ansible/hosts
  • 可以通过ANSIBLE_HOSTS环境变量、ansible.cfg文件中inventory参数来指定,或者运行ansible和ansible-playbook时使用-i参数临时指定
  • 可以有多个 inventory 文件,也可以通过 Dynamic Inventory 动态生成
  • inventory文件为 INI文件格式,中括号中的字符为组名 。可以将同一个主机同时归并到多个不同的组中
  • 组名建议使用"_"来连接字符 , 例如“aaa_bbb_ccc”
Ansible Inventory文件192.168.56.1# 未分组test.example.com127.0.0.1 ansible_connection=local# 直接访问本地主机,而不是通过SSH[Test]# 已分组名称192.168.56.1192.168.56.2192.168.56.[3:4]# 通过列表方式通配地址192.168.56.[5:6]# 多个通配地址anliven-[a:d].example.com# 通配主机域名[Test:vars]# 定义组变量ansible_ssh_user="anliven"ansible_ssh_pass="anliven"ansible_ssh_port="22"[Test2]# 在分组中指定变量192.168.56.[1:2] ansible_ssh_user=anliven ansible_ssh_pass=Anliven192.168.56.[3:4] ansible_ssh_user=anliven ansible_ssh_pass=Anliven192.168.56.[3:4][Test3]# 在分组中切换root用户192.168.56.[1:2] ansible_ssh_port="22" ansible_ssh_user="anliven" ansible_ssh_pass="anliven"ansible_become_pass="Anliven" [Temp]192.168.56.1:2222# 指定端口192.168.56.2 http_port=8080 var1=test1 var2=test2# 定义主机时为其添加主机变量以便于在playbook中使用[Temp:vars]ansible_ssh_user="anliven"ansible_ssh_pass="anliven"[TestGroup:children]# 嵌套组 , TestGroup为名称,其他为固定格式Test1Test2Test3[TestGroup:vars]# 嵌套组的变量只能在ansible-playbook中使用var1="test1"var2="123"[all:vars]# 类似全局变量,对inventory文件中所有节点都有效ansible_ssh_port="22"Ansible Inventory内置参数Ansible Inventory文件中可使用的行为参数
自动化利器 Ansible - 从了解到应用

文章插图
可以在ansible.cfg中的[defaults]部分更改一些Inventory行为参数的默认值
自动化利器 Ansible - 从了解到应用

推荐阅读