文章目录
Ansible-PlayBook简介
playbook是一个非常简单的配置管理和多主机部署系统。可作为一个适合部署复杂应用程序的基础
playbook可以定制配置,可以按指定的操作步骤有序执行,支持同步和异步方式
playbook配置文件使用YAML语法,YAML文件的扩展名通常为.yaml或.yml。具有简洁明了、结构清晰等特点。playbook配置文件类似于shell脚本,是一个YAML格式的文件,用于保存针对特定需求的任务列表。上面介绍的ansible命令虽然可以完成各种任务,但是当配置一些复杂任务时,逐条输入就显得效率非常低下了。更有效的方案是在playbook配置文件中放置所有的任务代码,利用ansible-playbook命令执行该文件,可以实现自动化运维
Ansible-PlayBook-核心元素
- hosts:任务的目标主机,多个主机用冒号分隔,一般调用/etclansible/hosts中的分组信息
- remote_user:远程主机上,运行此任务的默认身份为root
- tasks:任务,即定义的具体任务,由模块定义的操作列表
- handlers:触发器,类似tasks,只是在特定的条件下才会触发的任务。某任务的状态在运行后为changed时,可通过“notify"通知给相应的handlers进行触发执行
- roles:角色,将hosts剥离出去,由tasks、handlers等所组成的—种特定的结构集合
Ansible-PlayBook格式注意事项
- playbook由YMAL语言编写。YAML参考了其他多种语言,包括: XML、C语言、Python、Perl等。MAL格式是类似于JSON的文件格式,便于人理解和阅读,同时便于书写
- 通过"来代表项,通过冒号“:“来分隔键和值,整个文件以”—“开始并以”.…."结束
- 所有的"-"和“:"后面均由空格,而且要严格注意缩进和对齐,否则语法可能能会报错
- 每次在执行playbook文件之前,一定要使用"-C"选项来进行预测试。该选项会执行一遍playbook文件,但不会对目标主机进行任何更改,若语法有错或目标主机缺少某个文件,都将报错提示
关于 YAML
- YAML是一种非标记语言。是用来写配置文件的语言,非常简洁和强大
- YAML语法和其他语言类似,也可以表达散列表、标量等数据结构
- 结构通过空格来展示;序列里配置项通过 - 来代表;Map里键值用:来分隔;YAML的扩展名为yaml
基本语法规则
- 大小写敏感
- 使用缩进表示层级关系
- 缩进时不允许使用Tab键,只允许使用空格
- 缩进时不允许使用Tab键,只允许使用空格
YAML支持的数据结构
- 对象:键值对的集合,又称为映射(mapping)/哈希(hashes)/字典(dictionary)
- 数组:一组按次序排列的值,又称为序列(sequence)/列表((list)
- 纯量:单个的、不可再分的值
Ansible-PlayBook示例
Ansible 自动化运维原理介绍+命令模块详细操作过程
安装nginx服务,安装完成后并启动nginx 自启操作
[root@master ~]# vi bbb.yml
- hosts: master
remote_user: root
tasks:
- name: nginx
yum: name=nginx
- name: started nginx
service: enabled=true name=nginx state=started
检查语法
[root@master ~]# ansible-playbook --syntax-check bbb.yml
playbook: bbb.yml
重启bbb.yml
[root@master ~]# ansible-playbook bbb.yml
PLAY [master] ************************
TASK [Gathering Facts] ************************************************************
ok: [20.0.0.3]
TASK [nginx] **********************************************************************
changed: [20.0.0.3]
TASK [started nginx] **************************************************************
changed: [20.0.0.3]
PLAY RECAP ************************************************************************
20.0.0.3 : ok=3 changed=2 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
注:切记不要用Ted键,用空格符 ,格式特别重要
查看master的nginx安装没有与运行中?
[root@master ~]# ansible master -a "systemctl status nginx"
20.0.0.3 | CHANGED | rc=0 >>
● nginx.service - The nginx HTTP and reverse proxy server
Loaded: loaded (/usr/lib/systemd/system/nginx.service; enabled; vendor preset: disabled)
Active: active (running) since 四 2021-01-14 09:31:09 CST; 1 day 2h ago
Handlers案例
介绍
- Handlers也是一些task的列表,和一般的task并没有什么区别
- 是由通知者进行的notify,如果没有被notify,则Handlers不会执行,假如被notify了,则Handlers被执行
注:不管有多少个通知者进行了notify,等到play中的所有task执行完成之后,handlers也只会被执行一次
跟node节点安装httpd服务,handlers下发任务notify执行任务重启服务
- hosts: node
remote_user: root
tasks:
- name: httpd
yum: name=httpd state=latest
notify:
- restart httpd
handlers:
- name: restart httpd
service: name=httpd state=restarted
引入变量案例
给20.0.0.4删除httpd服务
- hosts: 20.0.0.4
remote_user: root
vars:
- aaa: httpd
tasks:
- name: remove httpd
yum: name={
{
aaa}} state=absent
查看node节点httpd服务开启没有?
通过 ansible 命令传递变量值案例
给20.0.0.4设置用户user=lisi
- hosts: 20.0.0.4
remote_user: root
vars:
- aaa:
tasks:
- name: add new user
user: name={
{
aaa}}
ansible 命令传递变量值
ansible-playbook aaa.yml -e "aaa=lisi"
直接引用一些变量案例
[root@master ~]# vi o.yaml
- hosts: all
remote_user: root
tasks:
- name: copy file
copy: content="{
{ansible_all_ipv4_addresses}}" dest=/opt/addr.txt
[root@master ~]# ansible 20.0.0.4 -a "cat /opt/addr.txt"
20.0.0.4 | CHANGED | rc=0 >>
["192.168.122.1", "20.0.0.4"]
引用主机变量案例
[root@master ~]# vi /etc/ansible/hosts
[node]
20.0.0.4 number="66666" # number 的值为 66666
- hosts: 20.0.0.4
remote_user: root
tasks:
- name: vopy number
copy: content="{
{number}}" dest=/opt/a.txt
~
验证
[root@master ~]# ansible 20.0.0.4 -a "cat /opt/a.txt"
20.0.0.4 | CHANGED | rc=0 >>
66666