ansible剧本快速上手
playbook剧本介绍
- 是什么:能户长期保存,且能实现批量配置、部署…的文件
- 格式:yaml格式。用 空格 冒号 头号 句号
- 语法检测:
ansible-playbook --syntax-check install-zabbix.yaml
或则 -C检测 - 取消默认任务:
gather_facts: no
剧本 | ans ad-hoc | |
---|---|---|
共同点 | 批量管理,使用了模块 | |
区别 | 重复使用 | 一次性使用 |
应用场景 | 大规模部署服务 | 用于少量测试 |
ansible命令 | 说明 |
---|---|
-C | --syntax-check | 语法检测 |
–step | 单步运行,每次输入yes进入下一步 |
-t + 自定义的步骤名称 | 只运行指定的步骤 |
---
- hosts: all
tasks:
- name: 01 one
shell: echo 01 >/tmp/one.log
- name: 02 secend
shell: echo 02 >/tmp/two.log
- name: 03 three
shell: echo 03 >/tmp/two.log
使用案例
file和copy
1.在客户端创建/test/dir1
2.把本地hosts文件放入创建好的目录
这是一种简单的写法:
- hosts: all
tasks:
- name: 01 create director
file: path=/test/dir1 state=directory
- name: 02 flader file
copy: src=/etc/hosts dest=/test/dir1
第2中写法,最常用:
- hosts: all
tasks:
- name: 01 create director
file:
path: /test/dir1
state: directory
- name: 02 flader file。
# copy 远端主机的文件到指定目录
copy:
src: /etc/hosts
dest: /test/dir1
3.执行剧本,以方式2为例
ansible-playbook role.yaml -i hosts
查看文件
cat /test/dir1/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
# 这是ansible主机传过来的文件
安装软件
validate_certs: no,不检查证书
- hosts: all
tasks:
- name: 01下载安装软件
get_url:
url: "https://mirrors.tuna.tsinghua.edu.cn/zabbix/zabbix/6.3/rhel/7/x86_64/zabbix-agent-6.4.1-rc2.release1.el7.x86_64.rpm"
dest: /tmp/
validate_certs: no
- name: 02yum安装
yum:
name: /tmp/zabbix-agent-6.4.1-rc2.release1.el7.x86_64.rpm
state: present
- name: 03配置zabbix
debug:
msg: "进行配置zabbix"
- name: 04启动zabbix
systemd:
name: zabbix-agent
enabled: yes
state: started
部署nfs并挂载
- hosts: nfs
tasks:
- name: 01下载nfs
yum:
name: nfs-utils,rpcbind
state: installed
- name: 02修改配置文件
lineinfile:
path: /etc/exports
line: "/backup-nfs 172.16.1.0/24(rw,all_squash,anonuid=666,anongid=666)"
create: true
#也还可以用copy模块
#copy:
#content: "/backup-nfs 172.16.1.0/24(rw,all_squash,anonuid=666,anongid=666)"
#dest: /etc/exports
- name: 02-1创建组www
group:
name: www
gid: 666
state: present
- name: 02-2创建用户www
user:
name: www
uid: 666
group: www
shell: /sbin/nologin
create_home: no
state: present
- name: 03创建共享目录
file:
path: /backup-nfs
state: directory
owner: www
group: www
- name: 04-1启动rpncbind
systemd:
name: rpcbind
enabled: yes
state: started
- name: 04-2启动nfs
systemd:
name: nfs
enabled: yes
state: started
- hosts: web
tasks:
- name: 01安装nfs
yum:
name: nfs-utils
state: present
- name: 02挂载
mount:
src: 172.16.1.31:/backup-nfs
path: /mnt
fstype: nfs
state: mounted
剧本中的变量
自定义变量
手动在剧本中定义
1.在剧本中定义一个目录变量,此变量只会在当前剧本中生效
- hosts: all
# 自定义一个关于目录的变量
vars:
dir: /wzy/wzy/wzy
tasks:
- name: 创建变量中的目录
file:
path: "{{dir}}"
state: directory
- name: debug测试变量空格问题
debug:
msg: "变量内容:{{ dir }}"
引用变量时,什么时候加引号?
1️⃣加引号:应用的变量单独开头时,如上方:path: “{{dir}}”
2️⃣不加引号:变量前有参数了。
path: /test/{{dir}}
- 案例2,定义多个变量
- hosts: nfs
vars:
- p1: tree
- p2: sl
tasks:
- name: 安装软件
yum:
name:
- "{{ p1 }}"
- "{{ p2 }}"
state: present
- 案例3一个变量含有多个值
- hosts: web
vars:
- pk:
- 'sl'
- 'cowsay'
tasks:
- name: 安装软件
yum:
name: "{{ pk }}"
state: present
使用变量文件定义
- 变量文件是:供其他剧本文件调用其中的变量
1.写一个变量文件vars.yaml
user: www
dir: /tmp/wzy/wzy/wzy
file: /etc/hosts
2.写一个普通的yaml文件
- hosts: all
vars_files: ./vars.yaml
tasks:
- name: 引用变量文件中的变量
file:
path: "{{dir}}"
state: directory
- name:
copy:
src: "{{file}}"
dest: /tmp/
分组变量
- 分组变量的特点:自动寻找属于改组的变量
1.准备组变量文件
[root@gitlabansible]# cat group_vars/web/vars.yaml
user: web_user
[root@gitlabansible]# cat group_vars/db/vars.yaml
user: db_user
2.书写剧本
cat 12-group_variable.yaml
- hosts: web
gather_facts: false
tasks:
- name: 测试web组变量是否可用
debug:
msg: "web组的user变量值是{{ user }}"
- hosts: db
gather_facts: false
tasks:
- name: 测试db组变量是否可用
debug:
msg: "db组的user变量值是{{ hostvars['10.0.0.51']['user'] }}"
- name: 获取db组的主机列表
debug:
msg: "db组的主机是{{ groups['db'] }}"
3.host列表如下:
[root@gitlabansible]# cat hosts
[web]
10.0.0.62
[db]
10.0.0.51
4.执行剧本
PLAY [web]
TASK [测试web组变量是否可用]
ok: [10.0.0.62] => {
"msg": "web组的user变量值是web_user"
}
PLAY [db]
TASK [测试db组变量是否可用]
ok: [10.0.0.51] => {
"msg": "db组的user变量值是db_user"
}
TASK [获取db组的主机列表]
ok: [10.0.0.51] => {
"msg": "db组的主机是[u'10.0.0.51']"
}
register注册变量
- 本质是 `反引号` ,把结果赋值给了register
- 通过命令获取的内容都会存放到 Register 变量中
1.使用shell模块把当前时间注册为一个变量
- hosts: all
tasks:
- name: 定义一个shell,获取时间
shell: date +%F
register: result
- name: 打印出date变量
debug:
msg: "date变量结果是{{result}}"
2.运行后发现结果是一堆json格式的数据。在,回车分隔原始数据后:
也叫键|值,也就是原变量|变量值
ok: [10.0.0.7] => {
"msg": "date变量结果是{'stderr_lines': [],
u'changed': True,
u'end': u'2024-04-29 17:08:36.889077',
'failed': False,
u'stdout': u'2024-04-29',
u'cmd': u'date +%F',
u'rc': 0,
u'start': u'2024-04-29 17:08:36.873612',
u'stderr': u'',
u'delta': u'0:00:00.015465',
'stdout_lines': [u'2024-04-29']}"
}
3.若要取出单独的时间,需要改为 msg: "date变量结果是{{result.stdout}}"
,即要标出输出
facts变量
-
facts变量相当于是ansible内置变量,存放被管理机器的基本信息
-
当管理不同的主机 CentOS、Ubuntu 时,可以使用 when 判断配合 facts 变量实现不同的操作
-
用于记录主机信息的变量,关闭facts变量后可以加速剧本的执行
-
默认开启,关闭方法:
gather_facts: no
-
- hosts: web gather_facts: false
-
-
查看主机的facts变量:
ansible -i hosts web -m setup
2.使用facts变量查看主机信息
- hosts: web
tasks:
- name: 收集主机信息
debug:
msg: |
你的系统版本是{{ansible_distribution}}
你的主机名是{{ansible_hostname}}
你的CPU架构是{{ansible_architecture}}
你的eth0 IP是{{ansible_eth0.ipv4.address}}
运行结果如下:
ok: [10.0.0.7] => {
"msg": "你的系统版本是CentOS\n你的主机名是web01\n你的CPU架构是x86_64\n你的eth0 IP是10.0.0.7\n"
}
.j2
模版
- 假设一个文件中含有变量,host=ansible_hostname,传输过去时要体现出host=web01,要怎么实现呢?
- 实现:传输变量文件.j2,不要用copy,而是template
1.编辑 motd.j2 文件
host={{ ansible_hostname }}
2.准备yaml
- hosts: web
gather_facts: false
tasks:
- name: copy motd.j2 到/tmp 下
copy:
src: motd.j2
dest: /tmp/motd
backup: false
- hosts: ub
gather_facts: false
tasks:
- name: copy motd.j2 到/root 下
template:
src: motd.j2
dest: /root
backup: false
3.1查看 web主机:web01/tmp/motd.j2 ,变量没有生效,文件内容依旧是字符串,并没有把内置的facts变量解析出来
[root@web01~]# cat /tmp/motd.j2
host: {{ ansible_hostname }}
3.2查看Ubuntu/root/motd.j2,j2变量已经生效,显示出了主机名
root@U-Desk:~# cat /root/motd.j2
host: U-Desk
案例2 .j2配合vars传输配置文件
- 使用方法:
- templates/conf.j2:{{ 变量1 }}
acts: false
tasks: - name: copy motd.j2 到/root 下
template:
src: motd.j2
dest: /root
backup: false
- templates/conf.j2:{{ 变量1 }}
3.1查看 web主机:web01/tmp/motd.j2 ,变量没有生效,文件内容依旧是字符串,并没有把内置的facts变量解析出来
```bash
[root@web01~]# cat /tmp/motd.j2
host: {{ ansible_hostname }}
3.2查看Ubuntu/root/motd.j2,j2变量已经生效,显示出了主机名
root@U-Desk:~# cat /root/motd.j2
host: U-Desk
案例2 .j2配合vars传输配置文件
- 使用方法:
- templates/conf.j2:{{ 变量1 }}
- vars/main.yml: 变量1: 变量值1