Ansible管理变量和Facts
Posted 向阳-Y.
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Ansible管理变量和Facts相关的知识,希望对你有一定的参考价值。
变量的定义和引用
Ansible支持变量功能,能将value(值)存储到变量中,这样就能在
Ansible项目中重复使用了。这样就可以简化项目的创建和维护,减少错误
率。
变量提供了一种方便的方法来管理ansible项目中给定环境的动态值。 变
量可以是要创建的用户,要安装的包,要启动的服务,要删除的文件,要从互联
网下载的文件等等
直接调用变量
创建一个setup.sh
,定义内容如下
输入source setup.sh
即可执行(或者,chmod +x setup.sh
后使用./setup.sh执行
)
下图为111.yml
,playbook脚本也可以进行定义变量,使用vars:
即可,引用时使用"{{ }}"
(即一对引号两对大括号 )
使用ansible-playbook 111.yml
执行即可
下图表示成功!
调用其他文件所定义的变量
可以通过vars_files
调用其他文件所定义的变量
变量文件var1.yml定义如下
aaa: Hello!welcome to this catalog!
package: tree
变量文件var2.yml定义如下
bbb: hello,this is bbb!
fw: firewalld
varplaybook.yml定义如下
---
- name: tasks1
hosts: all
vars_files:
- /home/student/ansible/var1.yml
- /home/student/ansible/var2.yml
tasks:
- name: test_var1.yml
debug:
msg: "{{aaa}}"
- name: test_var2.yml
debug:
msg: "{{bbb}}"
- name: tasks2
hosts: all
vars_files:
- /home/student/ansible/var1.yml
- /home/student/ansible/var2.yml
tasks:
- name: install tree
yum:
name: "{{package}}"
state: present
- name: stop firewalld
service:
name: "{{fw}}"
state: stopped
成功执行:
group变量和host变量
inventory文件内容如下:
[redhat_group] #定义一个分组为redhat_group
redhat user=aoa #为其定义变量user=aoa
redhat_s user=bob #为其定义变量user=bob
[other_group] #定义一个other_group
redhat_sc
[other_group:vars] #other_group的变量为user=coc
user=coc
编写一个useradd.yml内容如下:
---
- name: create user
hosts: all
tasks:
- name: add user
user:
name: "{{user}}"
state: present
执行ansible-playbook useradd.yml
则可以为redhat、redhat_s、redhat_sc分别创建aoa、bob、coc用户(因为ansible本身就会去调用inventory文件,所以只需要将变量写在inventory中即可成功调用
)
将变量定义在host_vars和group_vars目录中
host_vars
目录用于保存主机变量文件,文件名以主机名称
命名
group_vars
目录用于保存组变量文件,文件名以主机组
命名
在inventory
文件中定义如下
[a]
redhat
redhat_s
[b]
redhat_sc
在ansible/group_vars/a
文件中定义如下
web: httpd
在ansible/group_vars/b
文件中定义如下
service: firewalld
在ansible/host_vars/redhat
文件中定义如下
package: tree
在ansible/grou_vars/redhat_s
文件中定义如下
web: httpd
在ansible/test.yml
文件定义如下:
---
- name: 111
hosts: b
tasks:
- name: install "{{web}}"
yum:
name: "{{web}}"
state: present
- name: stop "{{service}}"
service:
name: "{{service}}"
state: stopped
- name: 222
hosts: redhat
tasks:
- name: install "{{package}}"
yum:
name: "{{package}}"
state: present
运行ansible-playbook test.yml
测试即可
内置变量
ansible中有一些内置变量,这些变量无需被定义,可以直接拿来使用
常见的内置变量:
ansible_version:
hostvars:
inventory_dir:
inventory_hostname:
groups:
group_name:
注册变量
debug模块
debug是一个调试模块,用于打印输出信息,常用参数有:
msg:
自定义输出信息
var:
将任务执行的结果注册为变量传递给debug, debug将结果输出出来
register模块
register用于将任务的执行结果注册为变量,通常和debug模块一起使用
debug和register模块使用示例
比较简单,看代码理解:
---
- name: test
hosts: all
tasks:
- name: 使用shell模块输出
shell:
echo "hello world this is a test text!"
register: hello_result
- debug:
var: hello_result
- debug:
var: hello_result.stdout(表示子层)
子层来自输出结果,如图所示
管理Facts
ansible facts
是受管主机上通过ansible
自动发现的一系列变量。
ansible facts
包含了受管主机的详细信息,如主机名,ip地址,系统版本,磁盘分区信息,CPU信息等。这些信息可以在playbook中直接使用
setup模块
在执行playbook时候,ansible会自动执行第一个task
运行setup模块
,用
于收集facts信息。setup模块的作用就是收集受管主机的各种信息,也可以通
过adhoc
方式来运行setup模块。
ansible all -m setup >111.txt
可以在playbook中设置零时关闭facts
gather_facts: no #在yml文件中添加
永久关闭方法:
在ansible.cfg中添加如下配置:
[defaults]
gathering = explicit
使用debug模块输出指定的facts信息
可以先使用ansible all -m setup >111.txt
命令将信息输出到111.txt再vim 111.txt查找内置变量(注意不要将facts关闭了,否则将会报错)
---
- name: debug
hosts: all
tasks:
- debug:
msg: "ip地址: {{ansible_default_ipv4.address}}"
- debug:
msg: "主机名: {{ansible_hostname}}"
- debug:
msg: "域名: {{ansible_fqdn}}"
常用的facts变量(可以通过setup查询)
ansible_facts[‘fqdn’] 受管主机的FQDN名称
ansible_facts.hostname 受管主机的短格式主机名
ansible_facts.default_ipv4.address 默认IPV4地址
ansible_facts[‘interfaces’] 网络接口
ansible_facts[‘kernel’] 内核版本
ansible_facts.bios_version BIOS版本
ansible_facts[‘distribution’] 系统发行厂商
ansible_facts[‘distribution_version’] 系统发行版本
ansible_facts[‘architecture’]系统架构平台
ansible_facts[‘memtotal_mb’] 系统内存大小(以MB为单位)
ansible_facts[‘swaptotal_mb’] 系统交换分区大小
ansible_facts[‘selinux’][‘mode’] SeLinux状态
ansible_facts[‘devices’][‘sda’][‘size’] 磁盘sda的大小
自定义facts变量
创建文件/ansible/myfacts.fact
,文件中定义如下(可以根据需求更改,此处仅做演示):
[genere]
status: enabled
echo: "hello"
package: httpd
创建文件testfact.yml
,文件中定义如下:
代码含义是将刚刚创建的myfacts.fact
文件copy到root目录的/etc/ansible/
处
---
- name: facts
hosts: all
vars:
- remote_dir: /etc/ansible/facts.d
- facts_file: /home/student/ansible/myfacts.fact
tasks:
- name: directory
file:
state: directory
recurse: yes
path: "{{remote_dir}}"
- name: new facts
copy:
src: "{{facts_file}}"
dest: "{{remote_dir}}"
ansible facts是受管主机上通过ansible自动发现的一系列变量
,所以在刚刚一系列交互中,setup自动搜集到了myfacts.fact
信息,此时需要重新使用ansible all -m setup >111.txt
命令生成新的文件,文件中就会包含myfacts.fact的信息
使用/myfacts搜索即可查看到:下次使用时直接调用"{{ansible_local.myfacts}}"
即可!
以上是关于Ansible管理变量和Facts的主要内容,如果未能解决你的问题,请参考以下文章
ansible常用的定义变量方式和变量注册facts缓存和template的使用