设置主机名
配置主机名非常简单,可以使用shell模块在远程执行相关命令,也可以使用Ansible提供的hostname模块。建议使用hostname模块,它支持多种操作系统。
ansible 变量
---
- name: set hostname
hosts: new
gather_facts: false
vars:
hostnames:
- host: 192.168.200.34
name: new1
- host: 192.168.200.35
name: new2
tasks:
- name: set hostname
hostname:
name: "{{item.name}}"
when: item.host == inventory_hostname
loop: "{{hostnames}}"
vars指令可用于设置变量,可以设置一个或多个变量。下面的设置方式都是合理的:
# 设置单个变量
vars:
var1: value1
vars:
- var1: value1
# 设置多个变量:
vars:
var1: value1
var2: value2
vars:
- var1: value1
- var2: value2
vars可以设置在play级别,也可以设置在task级别:
(1).设置在play级别,该play范围内的task能访问这些变量,其它play范围内则无法访问;
(2).设置在task级别,只有该task能访问这些变量,其它task和其它play则无法访问。
这里只设置了一个变量hostnames,但这个变量的值是一个数组结构,数组的两个元素又都是对象(字典/hash)结构。
所以想要访问主机名new1和它的IP地址192.168.200.34,可以:
tasks:
- debug:
var: hostnames[0].name
- debug:
var: hostnames[0].host
条件判断 when
---
- name: play1
hosts: localhost
gather_facts: false
vars:
- myname: "kate"
tasks:
- name: task will skip
debug:
msg: "myname is: {{myname}}"
when: myname == "liutao"
- name: task will execute
debug:
msg: "myname is: {{myname}}"
when: myname == "kate"
需要注意的是,when指令因为已经明确是做条件判断,所以它的值必定是一个表达式,它会自动隐式地帮我们包围一层{{}},所以在写when指令的条件判断时,不要再手动加上{{}}。
虽然when指令的逻辑很简单:值为true则执行任务,否则不执行任务。但是,它的用法并不简单,概因when指令的值可以是Jinja2的表达式,很多内置在Jinja2中的Python的语法都可以用在when指令中,而这需要掌握Python的基本语法。如果不具备这些知识,那么想要实现某种判断功能可能会感觉到较大的局限性,而且别人写的脚本可能看不懂。
循环loop
除条件判断外,另一种分支控制结构是循环结构。
Ansible提供了很多种循环结构,一般都命名为with_xxx,例如with_items、with_list、with_file等,使用最多的是with_items。事实上with_<lookup>结构是对应lookup插件的,关于with_xxx这些循环结构在以后的文章中再统一介绍。
在这里仅介绍loop循环,它是在Ansible 2.5版本中新添加的循环结构,等价于with_list。大多数时候,with_xxx的循环都可以通过一定的手段转换成loop循环,所以从Ansible 2.5版本之后,原来经常使用的with_items循环都可以尝试转换成loop。
---
- name: play1
hosts: localhost
gather_facts: false
tasks:
- name: create directories
file:
path: "{{item}}"
state: directory
loop:
- /tmp/test1
- /tmp/test2
解释下上面的loop和{{item}}。
loop等价于with_list,从名字上可以知道它是遍历数组(列表)的,所以在loop指令中,每个元素都以列表的方式去定义。列表有多少个元素,就循环执行file模块多少次,每轮循环中,都会将本次迭代的列表元素保存在控制变量item中。
---
- name: set hostname
hosts: new
gather_facts: false
vars:
hostnames:
- host: 192.168.200.34
name: new1
- host: 192.168.200.35
name: new2
tasks:
- name: set hostname
hostname:
name: "{{item.name}}"
when: item.host == inventory_hostname
loop: "{{hostnames}}"
在这个示例中,是对{{hostnames}}进行循环遍历,hostnames中包含两个元素,每个元素都是一个key/value的对象结构。所以,第一次迭代时,item变量的值是:
{
host: "192.168.200.34",
name: "new1"
}
所以item.host和item.name分别对应于192.168.200.34和new1。
1.loop和when结合使用时,when的条件判断是在循环内部执行的。也就是说循环指令(如loop)的解析顺序早于when指令