Ansible基本命令、角色、内置变量与tests判断
- 常用基本命令
- Role目录结构
- 内置变量
- ansible_version
- ansible_distribution
- ansible_python_version
- hostvars
- inventory_hostname
- play_hosts
- groups
- group_names
- inventory_dir
- tests条件判断
- 判断变量
- 判断执行结果
- 判断路径
- 判断字符串
- 判断数字
- 判断列表
- 判断版本号
常用基本命令
查看ansible版本
$ ansible --version
查看ansible的模块
# 查看支持的所有模块
$ ansible-doc -l
# 查看某个模块的介绍(以ping为例)
$ ansible-doc -s ping
执行ad-hoc命令
# 默认inventory路径可省略
$ anisble [-i INVENTORY路径] 主机别名或分组 -m 模块名 -a "模块参数"
$ ansible [-i /etc/ansible/hosts] webserver01 -m ping # 使用主机别名
$ ansible webservers -m shell -a "hostname" # 使用分组
# 使用非默认inventory路径
$ ansible -i /tmp/dbservers all -m shell -a "ip addr" # 使用all关键字
执行playbook
# 检查yaml文件语法
$ ansible-playbook --syntax-check test.yml
# 试运行yaml剧本(模拟运行)
$ ansible-playbook --check test.yml
# 真正执行playbook
$ ansible-playbook [-i /path/hosts] test.yml
Role目录结构
runRole.yml # 用于调用同目录下的角色
testrole # 角色
├── defaults # 定义角色使用的变量的默认值
│ └── main.yml
├── files # 定义角色用到的文件
│ └── main.yml
├── handlers # 定义角色用到的handlers
│ └── main.yml
├── meta # 描述角色属性的元数据
│ └── main.yml
├── tasks # 角色需要执行的主任务文件
│ └── main.yml
├── templates # 角色用到的jinja2模板文件
│ └── test.conf.j2
└── vars # 角色使用的变量值,优先级高于defaults和runRole.yml中定义的变量
└── main.yml
其中,runRole.yml 的内容如下
---
- hosts: webservers
remote_user: root
gather_facts: no
roles:
- role: testrole
vars: # 优先级低于vars/main.yml,高于defaults/main.yml中的同名变量
var1test: "var_in_yaml"
- role: another_role # 可调用多个角色
内置变量
ansible_version
获取ansible版本号
ansible webserver01 -m debug -a "msg={{ansible_version}}"
ansible_distribution
获取到远程主机的操作系统信息,比如RHEL、CentOS。大版本号为 ansible_distribution_major_version
。默认 gather_facts=true
时会收集。
ansible_python_version
获取到远程主机安装的python版本号。默认 gather_facts=true
时会收集。
hostvars
获取远程主机的信息
---
- name: "play 1: Gather facts of server02"
hosts: server02
remote_user: root
#默认gather_facts: yes
- name: "play 2: Get facts of server02 when operating on server01"
hosts: server01
remote_user: root
tasks:
- debug:
msg: "{{hostvars['server02'].ansible_ens35.ipv4}}"
#或者msg: "{{hostvars.server02.ansible_ens35.ipv4}}"
inventory_hostname
获取到被操作的当前远程主机的在inventory中的名称
ansible servergroup -m debug -a "msg={{inventory_hostname}}"
通过 {{inventory_hostname_short}}
也可以获取当前play操作的主机在清单中对应的名称,但是这个名称更加简短。
play_hosts
获取到当前play所操作的所有主机的主机名列表
---
- hosts: server01,server02
remote_user: root
gather_facts: no
tasks:
- debug:
msg: "{{play_hosts}}"
groups
获取到清单中”所有分组”的分组信息
ansible server01 -m debug -a "msg={{groups}}"
ansible server01 -m debug -a "msg={{groups.ungrouped}}"
ansible server01 -m debug -a "msg={{groups.webservers}}"
ansible server01 -m debug -a "msg={{groups['webservers']}}"
group_names
获取到当前主机所在分组的组名
ansible server01 -m debug -a "msg={{group_names}}"
inventory_dir
获取到ansible主机中清单文件的存放路
$ ansible server01 -m debug -a "msg={{inventory_dir}}"
server01 | SUCCESS => {
"changed": false,
"msg": "/etc/ansible"
}
tests条件判断
Ansible没有使用Linux的test命令,而是使用了jinja2的tests,借助tests,我们可以进行一些判断操作,tests会将判断后的布尔值返回。
判断变量
- defined :判断变量是否已经定义,已经定义则返回真;
- undefind :判断变量是否已经定义,未定义则返回真;
- none :判断变量值是否为空,如果变量已经定义,但是变量值为空,则返回真。
---
- hosts: server01
remote_user: root
gather_facts: no
vars:
testvar: "test"
testvar1:
tasks:
- debug:
msg: "Variable is defined"
when: testvar is defined
- debug:
msg: "Variable is undefined"
when: testvar2 is undefined
- debug:
msg: "The variable is defined, but there is no value"
when: testvar1 is none
判断执行结果
- success 或 succeeded:通过任务的返回信息判断任务的执行状态,任务执行成功则返回真;
- failure 或 failed:通过任务的返回信息判断任务的执行状态,任务执行失败则返回真;
- change 或 changed:通过任务的返回信息判断任务的执行状态,任务执行状态为changed则返回真;
- skip 或 skipped:通过任务的返回信息判断任务的执行状态,当任务没有满足条件,而被跳过执行时,则返回真。
---
- hosts: server02
remote_user: root
gather_facts: no
vars:
doshell: "yes"
tasks:
- shell: "cat /testdir/abc"
when: doshell == "yes"
register: returnmsg
ignore_errors: true
- debug:
msg: "success"
when: returnmsg is success
- debug:
msg: "failed"
when: returnmsg is failure
- debug:
msg: "changed"
when: returnmsg is change
- debug:
msg: "skip"
when: returnmsg is skip
判断路径
⚠以下tests的判断均针对于ansible主机中的路径,与目标主机无关。
- file : 判断路径是否是一个文件,如果路径是一个文件则返回真;
- directory :判断路径是否是一个目录,如果路径是一个目录则返回真;
- link :判断路径是否是一个软链接,如果路径是一个软链接则返回真;
- mount:判断路径是否是一个挂载点,如果路径是一个挂载点则返回真;
- exists:判断路径是否存在,如果路径存在则返回真。
---
- hosts: host01 # tests路径与host01无关
remote_user: root
gather_facts: no
vars:
testpath1: "/testdir/test"
testpath2: "/testdir/"
testpath3: "/testdir/testsoftlink"
testpath4: "/testdir/testhardlink"
testpath5: "/boot"
tasks:
- debug:
msg: "file"
when: testpath1 is file
- debug:
msg: "directory"
when: testpath2 is directory
- debug:
msg: "link"
when: testpath3 is link
- debug:
msg: "link"
when: testpath4 is link
- debug:
msg: "mount"
when: testpath5 is mount
- debug:
msg: "exists"
when: testpath1 is exists
判断字符串
- string:判断对象是否是一个字符串,是字符串则返回真;
- lower:判断包含字母的字符串中的字母是否是纯小写,字符串中的字母全部为小写则返回真;
- upper:判断包含字母的字符串中的字母是否是纯大写,字符串中的字母全部为大写则返回真。
---
- hosts: host02
remote_user: root
gather_facts: no
vars:
str1: "abc"
str2: "ABC"
tasks:
- debug:
msg: "This string is all lowercase"
when: str1 is lower
- debug:
msg: "This string is all uppercase"
when: str2 is upper
判断数字
- number:判断对象是否是一个数字,是数字则返回真;
- even :判断数值是否是偶数,是偶数则返回真;
- odd :判断数值是否是奇数,是奇数则返回真;
- divisibleby(num) :判断是否可以整除指定的数值,如果除以指定的值以后余数为0,则返回真。
---
- hosts: host03
remote_user: root
gather_facts: no
vars:
num1: 4
num2: 7
num3: 64
tasks:
- debug:
msg: "An even number"
when: num1 is even
- debug:
msg: "An odd number"
when: num2 is odd
- debug:
msg: "Can be divided exactly by"
when: num3 is divisibleby(8)
判断列表
- subset:判断一个list是不是另一个list的子集,是另一个list的子集时返回真;
- superset : 判断一个list是不是另一个list的父集,是另一个list的父集时返回真。
---
- hosts: host04
remote_user: root
gather_facts: no
vars:
a:
- 2
- 5
b: [1,2,3,4,5]
tasks:
- debug:
msg: "A is a subset of B"
when: a is subset(b)
- debug:
msg: "B is the parent set of A"
when: b is superset(a)
判断版本号
- version:可以用于对比两个版本号的大小,或者与指定的版本号进行对比,使用语法为
version('版本号', '比较操作符')
。
---
- hosts: host05
remote_user: root
vars:
ver: 7.4.1708
ver1: 7.4.1707
tasks:
- debug:
msg: "This message can be displayed when the ver is greater than ver1"
when: ver is version(ver1,">")
- debug:
msg: "system version {{ansible_distribution_version}} greater than 7.3"
when: ansible_distribution_version is version("7.3","gt")