本文将详细介绍ansible-playbook中roles的各种用法,它允许你将相关的任务、变量、处理器、文件和模板等集合在一起,以便于在不同的项目中复用
组件 | 版本 |
---|---|
操作系统 | Ubuntu 22.04.4 LTS |
ansible | 2.17.6 |
.
├── deploy.hosts
├── deploy.yaml
└── roles
└── base
└── tasks
└── main.yaml
▶ cat deploy.hosts
10.22.11.166
▶ cat deploy.yaml
- name: deploy
hosts: all
remote_user: wilson
gather_facts: no
vars:
ansible_ssh_pass: '123456'
ansible_Python_interpreter: /usr/bin/python3
roles:
- base
all
代表deploy.hosts文件中所有的机器(也可以指定机器的分类信息)base
base
base
的入口文件▶ cat roles/base/tasks/main.yaml
- name: first
command: echo 'hello world'
base
当前只有1个任务,就是登录到目标机器,执行hello world
▶ ansible-playbook -i deploy.hosts deploy.yaml
PLAY [deploy] ****************************************************************************************************
TASK [base : first] **********************************************************************************************
changed: [10.22.11.166]
PLAY RECAP *******************************************************************************************************
10.22.11.166 : ok=1 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
需要改造roles/base/tasks/main.yaml
▶ cat roles/base/tasks/main.yaml
- name: first
command: echo 'hello world'
register: display_result
- name: display
debug:
msg: "{{ display_result }}"
把结果放入变量display_result
,然后通过模版语言打印出来,并且是json格式的
运行:
▶ ansible-playbook -i deploy.hosts deploy.yaml
PLAY [deploy] ****************************************************************************************************
TASK [base : first] **********************************************************************************************
changed: [10.22.11.166]
TASK [base : display] ********************************************************************************************
ok: [10.22.11.166] => {
"msg": {
"changed": true,
"cmd": [
"echo",
"hello world"
],
"delta": "0:00:00.002740",
"end": "2024-11-19 07:22:22.226036",
"failed": false,
"msg": "",
"rc": 0,
"start": "2024-11-19 07:22:22.223296",
"stderr": "",
"stderr_lines": [],
"stdout": "hello world",
"stdout_lines": [
"hello world"
]
}
}
PLAY RECAP *******************************************************************************************************
10.22.11.166 : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
将操作系统的环境变量传入,可以通过lookup
来引用,比如:要使用PATH,可以通过lookup('env', 'PATH')
改造roles/base/tasks/main.yaml
▶ cat roles/base/tasks/main.yaml
- name: first
debug:
msg: "{{ lookup('env', 'PATH') }}"
运行:
▶ ansible-playbook -i deploy.hosts deploy.yaml
PLAY [deploy] ****************************************************************************************************
TASK [base : first] **********************************************************************************************
ok: [10.22.11.166] => {
"msg": "/home/wilson/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/snap/bin:/usr/local/Go/bin:/usr/local/go/bin"
}
PLAY RECAP *******************************************************************************************************
10.22.11.166 : ok=1 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
这里的ansible变量,其中一部分ansible默认的变量,一部分是ansible运行的时候,会默认去采集目标机器的基本信息,比如操作系统、cpu、内存、磁盘等等的基本信息
变量名 | 描述 |
---|---|
inventory_hostname | 当前任务执行的主机名(来自 Inventory 文件) |
ansible_facts | 包含所有收集到的主机事实(facts) |
hostvars | 所有主机变量的集合,包含当前和其他主机 |
需要把之前采集ansible基本信息的开关打开gather_facts: yes
,打开之后会牺牲运行速度
改造roles/base/tasks/main.yaml
- name: first
debug:
msg: "{{ hostvars }}"
运行:
由于数据量太大,只展示部分,并且json格式,可以直接拿想要的值
▶ cat deploy.hosts
10.22.11.166
0
上面已经演示过,只需要gather_facts: yes
即可
ansible-playbook可以通过-e
传入变量使用
▶ cat deploy.hosts
10.22.11.166
1
运行:
▶ cat deploy.hosts
10.22.11.166
2
1)将主机分组
修改deploy.hosts文件
▶ cat deploy.hosts
10.22.11.166
3
2)改造入口文件
▶ cat deploy.hosts
10.22.11.166
4
将hosts改在成为'{{h}}'
,通过传入h变量来动态定义
3)运行
指定h
为ga
▶ cat deploy.hosts
10.22.11.166
5
指定h
为gb
▶ cat deploy.hosts
10.22.11.166
6
▶ cat deploy.hosts
10.22.11.166
7
通过-e
传入的变量来产生临时变量
▶ cat deploy.hosts
10.22.11.166
8
运行:
▶ cat deploy.hosts
10.22.11.166
9
1)新增role: advance
▶ cat deploy.yaml
- name: deploy
hosts: all
remote_user: wilson
gather_facts: no
vars:
ansible_ssh_pass: '123456'
ansible_Python_interpreter: /usr/bin/python3
roles:
- base
0
2)直接在入口文件deploy.yaml引用
▶ cat deploy.yaml
- name: deploy
hosts: all
remote_user: wilson
gather_facts: no
vars:
ansible_ssh_pass: '123456'
ansible_Python_interpreter: /usr/bin/python3
roles:
- base
0
运行:
▶ cat deploy.yaml
- name: deploy
hosts: all
remote_user: wilson
gather_facts: no
vars:
ansible_ssh_pass: '123456'
ansible_Python_interpreter: /usr/bin/python3
roles:
- base
2
3)在roles base
中引用 advance
▶ cat deploy.yaml
- name: deploy
hosts: all
remote_user: wilson
gather_facts: no
vars:
ansible_ssh_pass: '123456'
ansible_Python_interpreter: /usr/bin/python3
roles:
- base
3
▶ cat deploy.yaml
- name: deploy
hosts: all
remote_user: wilson
gather_facts: no
vars:
ansible_ssh_pass: '123456'
ansible_Python_interpreter: /usr/bin/python3
roles:
- base
4
▶ cat deploy.yaml
- name: deploy
hosts: all
remote_user: wilson
gather_facts: no
vars:
ansible_ssh_pass: '123456'
ansible_Python_interpreter: /usr/bin/python3
roles:
- base
5
运行:
▶ cat deploy.yaml
- name: deploy
hosts: all
remote_user: wilson
gather_facts: no
vars:
ansible_ssh_pass: '123456'
ansible_Python_interpreter: /usr/bin/python3
roles:
- base
6
这个例子呈现了:
version
是共用的role_pipe_from_advance
可以跨role持续至此,本文结束
在下才疏学浅,有撒汤漏水的,请各位不吝赐教...