ansible系列第五篇(变量)
个人博客: http://blog.51cto.com/liyuanjie
变量(1)
注意: 在ubuntu系统经过测试,普通用户和root用户都需要设置密码。
执行playbook脚本时,都需要执行该命令:ansible-playbook -S -R root yaml文件名称
变量由字母,数字,下划线组成。变量名要以字母开头。
在playbook中使用变量
使用vars关键字,表示在当前play中进行变量的相关设置。
使用"{{变量名}}" 可以引用对应的变量。在定义变量时,以类似"属性"的方式定义变量,例如:
cat vars.yaml
---
- hosts: test
remote_user: yuan
vars:
nginx:
hmmconf: /etc/nginx/conf.d/hmm.conf
adminconf: /etc/nginx/conf.d/admin.conf
tasks:
- name: one
file:
path: "{{nginx.hmmconf}}"
state: touch
- name: two
file:
path: "{{nginx.adminconf}}"
state: touch
变量文件分离: 将变量分离到某个文件中,可隐藏某些变量值并将不同类的信息放在不同的文件中,与play剧本分开。
在文件中定义变量时,不要使用vars关键字,直接定义变量即可。例如:
cat nginx_vars.yaml
nginx:
hmmconf: /etc/nginx/conf.d/hmm.conf
adminconf: /etc/nginx/conf.d/admin.conf
在playbook剧本中引入包含变量的文件时,使用"vars_files" 关键字,被引入的文件要以"-" 开头,以YAML中块序列的语法引入。例如:
cat nginx-playbook.yaml
---
- hosts: test
remote_user: yuan
vars_files:
- /home/yuan/fileyaml/vars/nginx_vars.yaml
tasks:
- name: one
file:
path: "{{nginx.hmmconf}}"
state: touch
- name: two
file:
path: "{{nginx['adminconf']}}"
state: touch
执行nginx的playbook剧本:
ansible-playbook -S -R root nginx-playbook.yaml
也可以引入多个变量文件,每个被引入的文件都要以"-"开头。
"vars"关键字和"vars_files"关键字可同时使用。
变量(2)
当运行一个playbook时,默认都会运行一个名为[Gathering Facts]的任务,ansible通过这个默认任务收集远程主机的相关信息。收集到的远程主机信息会保存在对应变量中。
setup模块
查看这个默认任务收集的信息可以使用setup模块。
ansible test -m setup | more
返回信息比较多,但是都是json格式的字符串。就不一一介绍了,相信各位工程师都可以看懂。
通过setup模块的filter参数可指定需要过滤的关键字。
通过关键字对信息进行过滤,例如查看系统信息ansible test -m setup -a 'filter=ansible_lsb'
返回信息为:
使用通配符,进行模糊过滤。
ansible test -m setup -a "filter=*ip*"
ansible test -m setup -a "filter=*inter*"也可以在远程主机中写入自定义信息,自定义信息需要写在/etc/ansible/facts.d目录下的以".fact"为后缀的文件中,文件内容格式必须是ini或者json格式。
ansible默认会去远程主机的/etc/ansible/facts.d目录下查找主机中的自定义信息。
在远程主机创建目录
sudo mkdir /etc/ansible/facts.d -p
sudo vim /etc/ansible/facts.d/testnode01.fact
内容如下:
[testnode01]
node=ansible-node01
host=xiao
user=yuan在被控机本地自定义的信息被称为"local facts".
可通过"ansible_local"关键字过滤远程主机的"local facts"信息。
在管控机执行:ansible test -m setup -a "filter=ansible_local"
输出信息为:
debug模块
可以使用msg参数输出自定义信息,也可以使用var参数直接输出变量中的信息。
例如:
cat debug.yaml
---
- hosts: test
remote_user: yuan
vars:
testvars: this is a debug messages.
tasks:
- name: debug
debug:
var: testvars
使用debug的msg参数时也可以引用变量的值。{{变量名}}。
cat memory.yaml
---
- hosts: test
remote_user: yuan
tasks:
- name: debug node01
debug:
msg: "ansible-node01 host memory: {{ansible_memory_mb}}"
执行: ansible-playbook -S -R root memory.yaml
输出信息如下:
变量(3)
注册变量
注册变量:将模块的返回值写入到变量中的方法。
使用"register"关键字指定对应的变量名即可。
cat register.yaml
---
- hosts: test
remote_user: yuan
tasks:
- name: node01
shell: "echo 'test node01' > /opt/nodefile"
register: nodevar
- name: return nodefile values
debug:
var: nodevar
执行: ansible-playbook -S -R root register.yaml
输出的信息如下:
如果要获取到返回值中的某一项特定值,只需要指定键值对中的key即可。例如: {{nodevar.cmd}}
提示用户输入信息并写入变量
将用户输入的信息存入指定的变量中,当需要输入信息时,引用对应的变量即可。
cat input.yaml
---
- hosts: test
remote_user: yuan
vars_prompt:
- name: "hostname"
prompt: "remote host hostname"
- name: "username"
prompt: "remote host sudo use username"
tasks:
- name: output vars
debug:
msg: remote hostname is {{hostname}},remote host sudo user is {{username}}
输出信息如下:
命令执行后默认情况下不显示用户输入的信息。要显示用户输入时的信息,可以使用private关键字。将属性设置为no即可。
为提示信息设置默认值
cat defaultinput.yaml
---
- hosts: test
remote_user: yuan
vars_prompt:
- name: "qustion"
prompt: "choose the a you want\n
A: node01\n
B: node02\n
C: node03\n"
private: no
default: A
tasks:
- name: output vars
debug:
msg: please can you answer is {{qustion}}
执行命令: ansible-playbook -S -R root defaultinput.yaml 可直接回车也可以选择再进行回车操作。
输出信息如下:
用提示信息创建用户和密码
使用user模块创建用户并设置密码。
使用"encrypt"关键字,对用户输入的字符串进行哈希。encrypt: "sha512_crypt"
表示使用sha512算法对用户输入的信息进行哈希。注意: 当使用"encrypt"关键字对字符串进行哈希时,ansible需要依赖passlib库完成哈希操作。
安装:
python3 -m pip install passlib
也可以用其他算法对字符串进行哈希。参考ansible官网。
例如:
cat useradd.yaml
---
- hosts: test
remote_user: yuan
vars_prompt:
- name: "username"
prompt: "please Enter keybord and input user name"
private: no
- name: "user_password"
prompt: " please input you settings user password"
private: no
encrypt: "sha512_crypt"
tasks:
- name: create user
user:
name: "{{username}}"
password: "{{user_password}}"
- name: output passwd hash string
debug:
msg: "{{user_password}}"
执行命令: ansible-playbook -S -R root useradd.yaml
输出信息如下:
使用"confirm"关键字实现确认密码的功能。
在useradd.yaml文件中,encrypt关键字的下方添加confirm关键字,并设置属性为yes即可。
在远程主机18.18.23.102上,用user用户并输入密码即可登录。
变量(4)
在清单中配置变量
主机变量
配置被控机时也可以配置对应变量。主机变量的生效范围只限于对应主机。
cat /etc/ansible/hosts
[test]
18.18.23.102 ansible_become_pass='123.cn' node=xiao
执行命令:ansible test -m shell -a "echo {{node}}"主机组变量
将多个主机分为一组。为单个组配置组变量。组变量的使用范围为组内所有主机。也可以用YAML格式配置。使用vars关键字指定组变量,vars对应组的下一级。
cat /etc/ansible/hosts
[test]
test1 ansible_host=18.18.23.101 ansible_become_pass='123.cn'
test2 ansible_host=18.18.23.102 ansible_become_pass='123.cn'
[test:vars] # test组配置变量
master='yuan'
node='xiao'执行结果如下:
通过set_fact定义变量
set-fact是一个模块,通过set_fact模块在tasks中定义变量。也可以通过set_fact将一个变量的值赋予另一个变量,例如:
cat setfact1.yaml
---
- hosts: test
remote_user: yuan
vars:
nodename: testone
tasks:
- shell: "echo nodename"
register: shellreturn
- set_fact:
node1: "{{nodename}}"
node2: "{{shellreturn.stdout}}"
- debug:
msg: "{{node1}} {{node2}}"
说明; 先定义变量nodename,再使用register将shell模块的返回值注册到变量shellreturn中,接下来,使用set_fact模块将nodename变量的值赋予给变量node1,将shellreturn变量的stdout信息赋值给node2变量。最后使用debug模块输出node1和node2的值。
变量(5)
清单配置:
cat /etc/ansible/hosts
[test]
test1 ansible_host=18.18.23.101 ansible_become_pass='123.cn'
test2 ansible_host=18.18.23.102 ansible_become_pass='123.cn'
内置变量ansible_version
查看ansible版本号
ansible test2 -m debug -a "msg={{ansible_version}}"
内置变量hostvars
hostvars在操作当前主机时获取到其他主机中的信息。
命令行执行:
ansible test2 -m debug -a "msg={{hostvars}}"
cat hostvars1.yaml
---
- name: "get test2"
hosts: test2
remote_user: yuan
- name: "get test2 and get test1"
hosts: test1
remote_user: yuan
tasks:
- debug:
msg: "{{hostvars.test2.ansible_ens34.ipv4}}"
执行playbook脚本时,都需要执行该命令:
ansible-playbook -S -R root hostvars1.yaml
输出test2的ens34网卡的IP信息:
使用gather_facts关键字可以控制当前play是否收集对应主机的facts信息。
使用hostvars内置变量获取其他主机中的注册变量。例如:
cat buildvar.yaml
---
- hosts: test2
remote_user: yuan
gather_facts: no
tasks:
- shell: "echo register"
register: shellreturn
- hosts: test1
remote_user: yuan
gather_facts: no
tasks:
- debug:
msg: "{{hostvars.test2.shellreturn.stdout}}"
跨play获取其他主机中的变量信息
cat factplay.yaml
---
- hosts: test2
remote_user: yuan
gather_facts: no
tasks:
- set_fact:
node: "xiao"
- debug:
msg: "{{node}}"
- hosts: test1
remote_user: yuan
gather_facts: no
tasks:
- debug:
msg: "{{hostvars.test2.node}}"
内置变量inventory_hostname
通过inventory_hostname变量可以获取到被操作的当前主机的主机名称。
cat /etc/ansible/hosts
[test]
test1 ansible_host=18.18.23.101 ansible_become_pass='123.cn'
ansible_host=18.18.23.102 ansible_become_pass='123.cn'
执行命令:
ansible test -m debug -a "msg={{inventory_hostname}}"
这里的主机名称是对应主机在清单中配置的名称。
内置变量inventory_hostname_short
获取当前play操作的主机在清单中的名称。
返回结果为主机的简短名称。ansible test -m debug -a "msg={{inventory_hostname_short}}"
内置变量play_hosts
获取到当前play所操作的所有主机的主机名列表。
cat /etc/ansible/hosts
[test]
test1 ansible_host=18.18.23.101 ansible_become_pass='123.cn'
test2 ansible_host=18.18.23.102 ansible_become_pass='123.cn'
cat hosts.yaml
---
- hosts: test1,test2
remote_user: yuan
gather_facts: no
tasks:
- debug:
msg: "{{play_hosts}}"
执行hosts.yaml。
总结: inventory_hostname只返回当前被操作的主机的主机名。play_hosts则返回当前play中所有被操作主机的主机名列表。
内置变量groups
通过groups内置变量获取到清单中"所有分组"的分组信息。
cat /etc/ansible/hosts
test1 ansible_host=18.18.23.101 ansible_become_pass='123.cn'
test2 ansible_host=18.18.23.102 ansible_become_pass='123.cn'
[testA]
test3 ansible_host=18.18.23.103
test5 ansible_host=18.18.23.105
[testB]
test1
[test:children]
testA
testB执行命令:
ansible test1 -m debug -a "msg={{groups}}"
获取指定组的分组信息,例如:获取testA信息
ansible test1 -m debug -a "msg={{groups.testA}}"
内置变量group_names
获取当前主机所在分组的组名。
ansible test1 -m debug -a "msg={{group_names}}"
内置变量inventory_dir
获取到ansible主机中清单文件的存放路径。
一般是默认的清单文件路径:/etc/ansible/hosts执行命令:
ansible test1 -m debug -a "msg={{inventory_dir}}"
坚持自己所选择的,方能成就自己想成就的。或许学英语对有些人很简单,但是对于运维人员来说,也是一项不小的挑战。往往最新最火的技术就在官方英文文档中,虽然现在的翻译软件很多,但翻译出来的句子大部分有点词不达意,导致自己误解了官网文档的正确意思。学好英语和思考能力是必不可缺的。小编也会尽量每周更新一篇文章和一小段每日英语,希望能够帮助更多的读者。
每日英语(Daily English Tips)(1)
1-100的英文单词如下:
1 one | 2 two | 3 three |
---|---|---|
4 four | 5 five | 6 six |
7 seven | 8 eight | 9 nine |
10 ten | 11 eleven | 12 twelve |
13 thirteen | 14 fourteen | 15 fifteen |
16 sixteen | 17 seventeen | 18 eighteen |
19 nineteen | 20 twenty | 21 twenty-one |
22 twenty- two | 23 twenty- three | 24 twenty- four |
25 twenty- five | 26 twenty- six | 27 twenty- seven |
28 twenty- eight | 29 twenty- nine | 30 thirty |
31 thirty- one | 32 thirty- two | 33 thirty- three |
34 thirty- four | 35 thirty- five | 36 thirty- six |
37 thirty- seven | 38 thirty- eight | 39 thirty- nine |
40 forty | 41 forty- one | 42 forty- two |
44 forty- four | 45 forty- five | 46 forty- six |
47 forty- seven | 48 forty- eight | 49 forty- nine |
50 fifty | 51 fifty- one | 52 fifty- two |
53 fifty- three | 54 fifty- four | 55 fifty- five |
56 fifty- six | 57 fifty- seven | 58 fifty- eight |
59 fifty- nine | 60 sixty | 61 sixty- one |
62 sixty- two | 63 sixty- three | 64 sixty- four |
65 sixty- five | 66 sixty- six | 67 sixty- seven |
68 sixty- eight | 69 sixty- nine | 70 seventy |
71 seventy- one | 72 seventy- two | 73 seventy- three |
74 seventy- four | 75 seventy- five | 76 seventy- six |
77 seventy- seven | 78 seventy- eight | 79 seventy- nine |
80 eighty | 81 eighty- one | 82 eighty- two |
83 eighty- three | 84 eighty- four | 85 eighty- five |
86 eighty- six | 87 eighty- seven | 88 eighty- eight |
89 eighty- nine | 90 ninety | 91 ninety-one |
92 ninety- two | 93 ninety- three | 94 ninety- four |
95 ninety- five | 96 ninety- six | 97 ninety- seven |
98 ninety- eight | 99 ninety- nine | 100 hundred |