文章目录
1、剧本
2、变量定义
1、主机清单变量
1、主机组变量
[devops@controller ansible]$ cat hosts
[node]
node1 webserver=nginx
node2
# 输出变量
[devops@controller ansible]$ ansible node1 -m debug -a "msg={{webserver}}"
node1 | SUCCESS => {
"msg": "nginx"
}
2、定义主机组的变量
[devops@controller ansible]$ cat hosts
[node]
node1 webserver=nginx
node2
[node:vars]
rhelname=rhce
[devops@controller ansible]$ ansible node -m debug -a "msg={{rhelname}}"
node1 | SUCCESS => {
"msg": "rhce"
}
node2 | SUCCESS => {
"msg": "rhce"
}
3、通过主机和主机组的目录文件定义变量
2、剧本中定义变量
1、vars定义
-
在task任务之前定义即可,可以定义多次变量
-
然后就不用重复写这个内容了,直接调用变量即可
[devops@controller ansible]$ cat play_vars/v1.yaml
- hosts: node
vars: # 定义变量,{{}} 就可以调用变量了
rname: rhel9
rage: 9
tasks:
- name: use shell
shell: echo "{{rname}} {{rage}}" > /opt/fil1
# 使用var变量的话,就直接输出了
[devops@controller ansible]$ cat play_vars/v1.yaml
- hosts: node
vars:
rname: rhel9
rage: 9
tasks:
- debug:
var: rname,rage
2、vars_files定义
- 通过引入文件来定义
- vars_files定义
[devops@controller ansible]$ cat play_vars/v2.yaml
- hosts: node
vars_files:
- /mnt/file1.yaml
tasks:
- shell: echo "{{user.name}}" > /opt/file1
[devops@controller ansible]$ cat /mnt/file1.yaml
user:
name: zhangsan
age: 19
3、注册变量
-
就是将一个任务的执行结果注册为一个变量
-
使用关键字,register去获得任务的执行结果
-
执行后将信息保存到主控节点上面
[devops@controller ansible]$ cat play_vars/v3.yaml
- hosts: node
tasks:
- shell: ls /etc/passwd
register: get_status
- debug:
var: get_status.rc
TASK [debug] **************************************************************************************
ok: [node1] => {
"get_status.rc": "0"
}
ok: [node2] => {
"get_status.rc": "0"
}
3、命令模式定义变量
[devops@controller ansible]$ cat play_vars/v4.yaml
- hosts: node
tasks:
- file:
path: "{{path}}"
state: touch
[devops@controller ansible]$ ansible-playbook play_vars/v4.yaml -e "path=/opt/eee"
# 如果有多个的话,使用-e即可解决
4、fact变量
-
事实变量,收集被控节点的信息,定义一个变量的信息
-
通过setup模块收集被控节点信息,通过facts参数,专门用来收集
-
ansible_facts变量中有很多信息,主机名,网卡设备,ip地址,磁盘和磁盘空间
# 使用filter参数获取指定的值
[devops@controller ansible]$ ansible node -m setup -a "filter=ansible_all_ipv4_addresses"
node2 | SUCCESS => {
"ansible_facts": {
"ansible_all_ipv4_addresses": [
"192.168.200.12"
],
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false
}
node1 | SUCCESS => {
"ansible_facts": {
"ansible_all_ipv4_addresses": [
"192.168.200.11"
],
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false
}
# 可以直接引用fact变量
[devops@controller ansible]$ cat play_vars/v5.yaml
- hosts: node
tasks:
- debug:
var: ansible_all_ipv4_addresses
[devops@controller ansible]$ ansible-playbook play_vars/v5.yaml
PLAY [node] ***************************************************************************************
TASK [Gathering Facts] ****************************************************************************
ok: [node1]
ok: [node2]
TASK [debug] **************************************************************************************
ok: [node1] => {
"ansible_all_ipv4_addresses": [
"192.168.200.11"
]
}
ok: [node2] => {
"ansible_all_ipv4_addresses": [
"192.168.200.12"
]
}
# 禁用facts变量收集
[root@controller opt]# cat facts.yml
- name: facts
hosts: node1
gather_facts: no
tasks:
- debug:
var: ansible_all_ipv4_addresses
5、set_fact变量
- 可以定义一个变量,获取不同主机的版本
[devops@controller ansible]$ cat play_vars/v6.yaml
- hosts: node
tasks:
- set_fact:
get_version: "{{ansible_distribution_version}}---{{ansible_distribution}}"
- debug:
var: get_version
TASK [debug] **************************************************************************************
ok: [node1] => {
"get_version": "9.0---RedHat"
}
ok: [node2] => {
"get_version": "9.0---RedHat"
}
6、lookup变量
-
使用lookup这个参数的,为变量赋值
-
lookup可以从文件,命令,变量中获取
-
需要和set_fact配合使用,也可以不配合使用
1、从文件中赋值变量
# 将这个文件里面的内容拷贝了过去
[devops@controller ansible]$ cat play_vars/v7.yaml
- hosts: node
tasks:
- set_fact:
vs: "{{lookup('file','/etc/passwd')}}"
- copy:
content: "{{vs}}"
dest: /opt/passwd
2、从命令中赋值变量
# 创建一个用户密码加密
[devops@controller ansible]$ cat play_vars/v8.yaml
- hosts: node
tasks:
- user:
name: q11
password: "{{lookup('pipe','openssl passwd -6 redhat')}}"
3、从环境变量中赋值
[devops@controller ansible]$ cat play_vars/v9.yaml
- hosts: node
tasks:
- set_fact:
get_env: "{{lookup('env','HOME')}}"
- debug:
var: get_env
TASK [debug] **************************************************************************************
ok: [node1] => {
"get_env": "/home/devops"
}
ok: [node2] => {
"get_env": "/home/devops"
}
8、魔法变量
-
内置的变量,有特殊含义的变量
-
fact变量只有运行的主机才能调用
1、hostvars
-
获取指定主机的变量信息,不需要获取全部的信息
-
还是获取的setup里面的信息
# 只获取noe1的ip地址
[devops@controller ansible]$ cat play_vars/v10.yaml
- hosts: node
tasks:
- debug:
msg: "{{hostvars['node1'].ansible_default_ipv4.address}}"
2、inventory_hostname
- 列出当前运行任务的主机(通常和when判断一起使用)
[devops@controller ansible]$ cat play_vars/v11.yaml
- hosts: node
tasks:
- debug:
var: ansible_hostname
when: inventory_hostname == "node1"
# 当主机是node1的时候,就执行
TASK [debug] *************************************************************************************
ok: [node1] => {
"ansible_hostname": "node1"
}
skipping: [node2]
3、groups
-
列出主机清单中的所有的主机组,groups.all 列出所有的主机
-
groups_names 显示当前运行的任务的主机属于哪个主机组 when test in groups_names 运行的主机属于test组的话就执行
-
groups.all 列出所有的主机
-
groups.web列出web主机组的主机
[devops@controller ansible]$ cat play_vars/v12.yaml
- hosts: node
tasks:
- debug:
var: groups
# 检查当前运行的主机是否属于node1组,属于的话就执行
[devops@controller ansible]$ cat play_vars/v12.yaml
- hosts: node
tasks:
- debug:
var: ansible_hostname
when: "'node1' in group_names"
9、输出变量
- debug模块使用
[devops@controller ansible]$ cat play_vars/v13.yaml
- hosts: node
vars:
name: zhangsan
tasks:
- debug:
var: name
# 或者使用msg
[devops@controller ansible]$ cat play_vars/v13.yaml
- hosts: node
vars:
NAME: zhangsan
tasks:
- debug:
msg: "{{NAME}}"
3、剧本
1、剧本之前的检查
# 检查语法
[devops@controller ansible]$ ansible-playbook play_vars/v1.yaml --syntax-check
playbook: play_vars/v1.yaml
# -C 选项 预输出
[devops@controller ansible]$ ansible-playbook play_vars/v1.yaml -C
2、剧本有错误,怎么补救
1、handler
- 监听某个任务,然后这个tasks执行后,是changed的话,并且是所有的任务执行完后,最后执行,先触发在执行
[devops@controller ansible]$ cat play_vars/v14.yaml
- hosts: node
tasks:
- shell: ls /etc/passwd
notify: get_status
handlers:
- name: get_status
file:
path: /mnt/file11
state: touch
2、ignore_errors
- true的话,跳过错误任务,继续执行后面的任务
[devops@controller ansible]$ cat play_vars/v15.yaml
- hosts: node
tasks:
- shell: ls /opt/12121212
ignore_errors: true
- shell: ls /opt
3、handler方法
-
如果有错误的话,handler也不会执行,但是加上一个字段force_handlers:yes的话就能执行
-
但是如果监听的任务有错误的话,那就无法执行
[devops@controller ansible]$ cat play_vars/v16.yaml
- hosts: node
force_handlers: yes
tasks:
- shell: ls /opt/
notify: get_status
- shell: ls /opqqwqw
handlers:
- name: get_status
file:
path: /mnt/1111
state: touch