IT评测·应用市场-qidao123.com
标题:
不求甚解--详解ansible-playbook中roles的用法(二)
[打印本页]
作者:
反转基因福娃
时间:
2024-12-13 19:13
标题:
不求甚解--详解ansible-playbook中roles的用法(二)
前言
本文将继续介绍ansible-playbook中roles的各种用法
环境预备
组件版本操作系统Ubuntu 22.04.4 LTSansible2.17.6
基本用法
文件布局
.
├── deploy.hosts
├── deploy.yaml
└── roles
└── base
└── tasks
└── main.yaml
复制代码
界说全局公共变量
新增group_vars目录,并且新增文件
.
├── deploy.hosts
├── deploy.yaml
├── group_vars
│ └── all.yaml
└── roles
└── base
└── tasks
└── main.yaml
复制代码
▶ cat group_vars/all.yaml
info: IT paiqiu
复制代码
▶ cat roles/base/tasks/main.yaml
- name: first
debug:
msg: "hello world {{ info }}"
复制代码
运行:
▶ ansible-playbook -i deploy.hosts deploy.yaml
...
TASK [base : first] **********************************************************************************************
ok: [10.22.11.166] => {
"msg": "hello world IT paiqiu"
}
...
复制代码
界说role级变量
可以覆盖全局变量
在role base 下面新增vars目录,并且新增main.yaml文件
.
├── deploy.hosts
├── deploy.yaml
├── group_vars
│ └── all.yaml
└── roles
└── base
├── tasks
│ └── main.yaml
└── vars
└── main.yaml
复制代码
▶ cat roles/base/tasks/main.yaml
- name: first
debug:
msg: "hello world {{ info }}"
复制代码
▶ cat roles/base/vars/main.yaml
info:
name: wilson
addr: cd
复制代码
运行:
▶ ansible-playbook -i deploy.hosts deploy.yaml
...
TASK [base : first] **********************************************************************************************
ok: [10.22.11.166] => {
"msg": "hello world {'name': 'wilson', 'addr': 'cd'}"
}
...
复制代码
界说静态文件目录
相当于界说role级别的根目录,更好的管理需要传输的文件,在role base下面创建目录files,并且在files下面放入需要传输的文件test.img
.
├── deploy.hosts
├── deploy.yaml
├── group_vars
│ └── all.yaml
└── roles
└── base
├── files
│ └── test.img
├── tasks
│ └── main.yaml
└── vars
└── main.yaml
复制代码
传输test.img至目的机器
- name: first
copy: src=test.img dest=/tmp/test.img
复制代码
test.img默认回去roles/base/files当中寻找,所以前面不需要添加路径
copy模块会主动查抄待传输文件的md5,如果没有变化,那就不会再传输了
界说模版
每次传输文件都会通过输入的变量重新渲染之后再传输,在role base下面创建目录templates,并且创建文件 test.conf
.
├── deploy.hosts
├── deploy.yaml
├── group_vars
│ └── all.yaml
└── roles
└── base
├── files
│ └── test.img
├── tasks
│ └── main.yaml
├── templates
│ └── test.conf
└── vars
└── main.yaml
复制代码
在模版文件中界说了两个变量,一个是手动设置的变量version,一个是ansible内建变量inventory_hostname
▶ cat roles/base/templates/test.conf
{{ version }}
{{ inventory_hostname }}
复制代码
▶ cat roles/base/tasks/main.yaml
- name: first
template: src=test.conf dest=/tmp/test.conf mode=0644
复制代码
运行:
▶ ansible-playbook -i deploy.hosts -e version=2 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
复制代码
登录到目的机器查看:
▶ cat test.conf
2
10.22.11.166
复制代码
2是本次任务传入的变量,10.22.11.166则是目的机器的ip地点
界说变乱驱动
通常用于某些任务完成之后需要触发的动作,比如:发布完某个配置文件之后需要重启服务。在role base下创建目录handlers,并创建文件main.yaml
.
├── deploy.hosts
├── deploy.yaml
├── group_vars
│ └── all.yaml
└── roles
└── base
├── files
│ └── test.img
├── handlers
│ └── main.yaml
├── tasks
│ └── main.yaml
├── templates
│ └── test.conf
└── vars
└── main.yaml
复制代码
创建变乱first handler
▶ cat roles/base/handlers/main.yaml
- name: first handler
debug:
msg: echo 'hello world'
复制代码
▶ cat roles/base/tasks/main.yaml
- name: first
template: src=test.conf dest=/tmp/test.conf mode=0644 notify: first handler
复制代码
运行:
▶ ansible-playbook -i deploy.hosts -e version=2 deploy.yaml
PLAY [deploy] ****************************************************************************************************
TASK [base : first] **********************************************************************************************
changed: [10.22.11.166]
RUNNING HANDLER [base : first handler] ***************************************************************************
ok: [10.22.11.166] => {
"msg": "echo 'hello world'"
}
PLAY RECAP *******************************************************************************************************
10.22.11.166 : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
复制代码
同样的,如果变乱前驱没有发生,那变乱关照也不会发生了,比如变乱前驱是传输一个文件,如果文件没有变化,就不会再传输,那变乱也不会再发生了
新增更多的task任务
当前只有main.yaml,在增长一个专门用于传输文件的任务files.yaml
▶ cat roles/base/tasks/main.yaml
- name: main
include_tasks: files.yaml
vars:
app_version: 0.2
复制代码
▶ cat roles/base/tasks/files.yaml
- name: first
debug:
msg: "version: {{ app_version }}"
复制代码
运行:
▶ ansible-playbook -i deploy.hosts deploy.yaml
PLAY [deploy] ****************************************************************************************************
TASK [base : main] ***********************************************************************************************
included: /home/wilson/workspace/ansible/roles/base/tasks/files.yaml for 10.22.11.166
TASK [base : first] **********************************************************************************************
ok: [10.22.11.166] => {
"msg": "version: 0.2"
}
PLAY RECAP *******************************************************************************************************
10.22.11.166 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
复制代码
如果文件过多,可以通过循环来处理:
- name: main
include_tasks: "{{ yaml_items }}"
loop:
- files.yaml
- packages.yaml
loop_control:
loop_var: yaml_items
vars:
app_version: 0.2
复制代码
增补一下常用的命令
执行命令 shell
- name: display
shell: echo 'hello world'
复制代码
传输文件 copy
copy模块会主动查抄待传输文件的md5,如果没有变化,那就不会再传输了
- name: copy file
copy: src=test.img dest=/tmp/test.img
复制代码
修改文件内容(一行) lineinfile
path: 指定要操作的文件路径(必填)
line: 界说要插入或替换的完整行内容(可选)
regexp: 用于匹配现有行的正则表达式。与 line 共同使用,匹配的行将被替换
state:
present(默认):确保指定行存在
absent:移除匹配的行
create: 如果文件不存在,是否创建文件(默认 yes)
insertafter: 指定插入行的位置(默认 EOF)
EOF:文件末尾
BOF:文件开头
正则表达式:在匹配行之后插入
insertbefore: 和 insertafter 类似,但在匹配行之前插入
通过正则匹配行之后修改当前行
- name: modify
lineinfile: dest=/tmp/test.txt regexp='^DC' line="DC=hello" state=present
复制代码
修改文件内容(多行/块) blockinfile
path: 指定要操作的文件路径(必填)
block: 界说要插入的文本内容(必填)
marker: 指定标志块的开始和结束字符串,默以为 # {mark} ANSIBLE MANAGED BLOCK
state:
present(默认):确保块存在
absent:移除块
create: 如果文件不存在,是否创建文件(默认 yes)
insertafter: 指定插入块的位置(默认 EOF)
可用值:
EOF:文件末尾
BOF:文件开头
正则表达式:在匹配行之后插入
insertbefore: 和 insertafter 类似,但是在匹配行之前插入
1)在某一行下面增长新的内容,并且将增长的内容打上标志
- name: add new content with markers
blockinfile:
path: /tmp/test.txt
marker: "# {mark} by wilson"
insertafter: '^DC'
block: |
name: wilson
city: cd
复制代码
运行之后查看效果
▶ cat /tmp/test.txt
DC=hello
# BEGIN by wilson
name: wilson
city: cd
# END by wilson
复制代码
2)删除已标志的内容
- name: Remove the managed block
blockinfile:
marker: "# {mark} by wilson"
path: /tmp/test.txt
state: absent
复制代码
添加内容块打上标志之后会让修改与删除都变得非常方便
使用模版
- name: hostname config
template: src=etc/hostname dest=/etc/hostname
复制代码
设置文件权限 file
- name: change file 755
file:
path: /tmp/test.txt
owner: wilson
group: wilson
state: file
mode: 755
复制代码
使用循环 with_items
with_items
给多个目录修改权限
- name: change directory 755
file:
path: '{{ item.dir }}'
owner: wilson
group: wilson
state: directory
mode: '{{ item.mode }}'
with_items:
- { dir: '/tmp/1', mode: '0755'}
- { dir: '/tmp/2', mode: '0755'}
复制代码
loop
当然使把with_items 替换成 loop也是可以的
- name: change directory 755
file:
path: '{{ item.dir }}'
owner: wilson
group: wilson
state: directory
mode: '{{ item.mode }}'
with_items:
- { dir: '/tmp/1', mode: '0755'}
- { dir: '/tmp/2', mode: '0755'}
复制代码
嵌套循环 with_nested
输出每一种组合,相当于笛卡尔积
- name: nested loop
debug:
msg: "{{ item[0] }} {{ item[1] }}"
with_nested:
- [ "hello1", "hello2"]
- [ "world1", "world2"]
复制代码
输出效果:
TASK [base : nested loop] ****************************************************************************************
ok: [127.0.0.1] => (item=['hello1', 'world1']) => {
"msg": "hello1 world1"
}
ok: [127.0.0.1] => (item=['hello1', 'world2']) => {
"msg": "hello1 world2"
}
ok: [127.0.0.1] => (item=['hello2', 'world1']) => {
"msg": "hello2 world1"
}
ok: [127.0.0.1] => (item=['hello2', 'world2']) => {
"msg": "hello2 world2"
}
复制代码
文件内容循环 with_file
逐行打印文件内容
- name: display file content
debug:
msg: "{{ item }}"
with_file:
- /tmp/test.txt
复制代码
幂等性
使用roles去管理多设备的时候,编写脚本需要时候注意幂等性,即每一次执行都要包管同样的效果
联系我
联系我,做深入的交流
至此,本文结束
在下才疏学浅,有撒汤漏水的,请各位不吝赐教...
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
欢迎光临 IT评测·应用市场-qidao123.com (https://dis.qidao123.com/)
Powered by Discuz! X3.4