文章目录
- 一,ansible剧本
- 二,ansible playbooks主要特性
- 三,yaml基本语法规则
- 四,剧本playbooks的组成结构
- 五,yaml编写
- 1.示例
- 2.运行playbook
- 2.1 运行
- 2.2 检查yaml文件的语法是否正确
- 2.3 检查tasks任务
- 2.3 检查生效的主机
- 2.4 指定从某个task开始运行
- 3.定义、引用变量
- 4. 指定远程主机sudo切换用户
- 5.when条件判断
- 6.迭代
- 7.Templates 模块
- 8.tags 模块
一,ansible剧本
Ansible Playbooks 是 Ansible 中用于自动化任务和配置管理的一种脚本文件,采用YAML语法编写。它可以描述一系列要执行的任务,例如安装软件、配置系统、部署应用程序等。通过编写Playbooks,用户可以定义需要执行的步骤,并将其应用到多个主机或环境中,实现自动化和一致性管理。
二,ansible playbooks主要特性
- YAML格式:Playbooks使用YAML文件格式,简单易读,结构清晰,便于编写和维护。
- 任务序列:Playbooks可以定义一系列按顺序执行的任务,每个任务描述一个具体操作(如安装软件、修改配置文件、启动服务等)。
- 声明性:Ansible Playbooks声明了系统应该处于的状态,而不是具体如何达到该状态。它会检查当前状态,并根据需要做出最小的更改。
- 模块化:Playbooks中可以调用Ansible模块,如文件管理、包管理、服务控制等模块,使任务执行更加灵活和强大。
- 跨平台支持:可以同时对多个主机组进行操作,并支持跨平台的任务执行(如Linux、Windows等操作系统)。
三,yaml基本语法规则
1大小写敏感
2使用缩进表示层级关系
3缩进时不允许使用tab键、只允许使用空格
4缩进的空格数目不重要,只要相同层级的元素左侧对齐即可
四,剧本playbooks的组成结构
- Tasks:任务,通过 task·调用 ansible 的模板将多个操作组织在一个·playbook 中运行
- Variables:变量
- Templates:模板
- Handlers:处理器,当changed状态条件满足时,(notify)触发执行的操作
- Roles:角色 (重点)
五,yaml编写
1.示例
vim test1.yaml--- #yaml文件以---开头,以表明这是一个yaml文件,可省略
- name: first play #定义一个play的名称,可省略gather_facts: false #设置不进行facts信息收集,这可以加快执行速度,可省略hosts: webservers #指定要执行任务的被管理主机组,如多个主机组用冒号分隔remote_user: root #指定被管理主机上执行任务的用户tasks: #定义任务列表,任务列表中的各任务按次序逐个在hosts中指定的主机上执行- name: test connection #自定义任务名称ping: #使用 module: [options] 格式来定义一个任务- name: disable selinuxcommand: '/sbin/setenforce 0' #command模块和shell模块无需使用key=value格式ignore_errors: True #如执行命令的返回值不为0,就会报错,tasks停止,可使用ignore_errors忽略失败的任务- name: disable firewalldservice: name=firewalld state=stopped #使用 module: options 格式来定义任务,option使用key=value格式- name: install httpdyum: name=httpd state=latest- name: install configuration file for httpdcopy: src=/opt/httpd.conf dest=/etc/httpd/conf/httpd.conf #这里需要一个事先准备好的/opt/httpd.conf文件notify: "restart httpd" #如以上操作后为changed的状态时,会通过notify指定的名称触发对应名称的handlers操作- name: start httpd serviceservice: enabled=true name=httpd state=startedhandlers: #handlers中定义的就是任务,此处handlers中的任务使用的是service模块- name: restart httpd #notify和handlers中任务的名称必须一致service: name=httpd state=restarted
##Ansible在执行完某个任务之后并不会立即去执行对应的handler,而是在当前play中所有普通任务都执行完后再去执行handler,这样的好处是可以多次触发notify,但最后只执行一次对应的handler,从而避免多次重启。
2.运行playbook
ansible-playbook test1.yaml参数:
-k(–ask-pass):用来交互输入ssh密码
-K(-ask-become-pass):用来交互输入sudo密码
-u:指定用户
ansible-playbook test1.yaml --syntax-check #检查yaml文件的语法是否正确
ansible-playbook test1.yaml --list-task #检查tasks任务
ansible-playbook test1.yaml --list-hosts #检查生效的主机
ansible-playbook test1.yaml --start-at-task='install httpd'#指定从某个task开始运行
2.1 运行
ansible-playbook a01.yaml
(1)当被远程机器192.168.88.70 selinux是disabled状态所以报错
(2)忽略报错加这个命令 ignore_errors: True后继续运行
第二条报错提示少http.conf文件
(3)修改httpd.conf文件移到/opt目录下后执行剧本
验证httpd端口改成8080后给192.168.88.70机器,httpd.conf文件覆盖了目的文件
2.2 检查yaml文件的语法是否正确
ansible-playbook a01.yaml --syntax-check #检查yaml文件的语法是否正确
(1)正确的情况
(2)错误的情况
2.3 检查tasks任务
ansible-playbook a01.yaml --list-task #检查tasks任务
(1)正确的情况
(2)错误的情况少个e
2.3 检查生效的主机
ansible-playbook a01.yaml --list-hosts #检查生效的主机
2.4 指定从某个task开始运行
ansible-playbook a01.yaml --start-at-task='install httpd'#指定从某个task开始运行
3.定义、引用变量
---
- name: second playhosts: dbserversremote_user: rootvars: #定义变量- groupname: mysql #格式为 key: value- username: nginxtasks:- name: create groupgroup: name={{groupname}} system=yes gid=306 #使用 {{key}} 引用变量的值- name: create useruser: name={{username}} uid=306 group={{groupname}} - name: copy filecopy: content="{{ansible_default_ipv4}}" dest=/opt/vars.txt #在setup模块中可以获取facts变量信息ansible-playbook test1.yaml -e "username=nginx" #在命令行里定义变量
将用户加入组
总结
定义变量:使用playbook变量进行动态配置,增加任务灵活性和可重用。变量的引用允许代替静态常量值,从而增强playbook的适应性。
4. 指定远程主机sudo切换用户
---
- hosts: dbserversremote_user: zhangsan become: yes #2.6版本以后的参数,之前是sudo,意思为切换用户运行become_user: root #指定sudo用户为root
执行playbook时:ansible-playbook test1.yml -K <密码>
4.1 在dbservers上创建一个zhangsan账号
useradd zhangsan
passwd zhangsan
sudo visudo
zhangsan ALL=(ALL) NOPASSWD: ALL
4.2 在ansible 执行命令
ansible-playbook a02.yaml -K
123456
5.when条件判断
在Ansible中,提供的唯一一个通用的条件判断是when指令,当when指令的值为true时,则该任务执行,否则不执行该任务。
when一个比较常见的应用场景是实现跳过某个主机不执行任务或者只有满足条件的主机执行任务
vim test2.yaml---
- hosts: allremote_user: roottasks:- name: shutdown host command: /sbin/shutdown -r nowwhen: ansible_default_ipv4.address == "192.168.10.14" #when指令中的变量名不需要手动加上 {{}}
或 when: inventory_hostname == "<主机名>"ansible-playbook test2.yaml
5.1
5.2
总结
when:使用来进行条件判断的关键字,其作用是只在指定条件下擦灰执行的下面的任务。当任务为真,任务将会被执行,否则任务就会被跳过
6.迭代
Ansible提供了很多种循环结构,一般都命名为with_items,作用等同于 loop 循环。
vim test3.yaml
---
- name: play1hosts: dbserversgather_facts: falsetasks: - name: create directoriesfile:path: "{{item}}"state: directorywith_items: #等同于 loop:- /tmp/test1- /tmp/test2- name: add usersuser: name={{item.name}} state=present groups={{item.groups}}with_items:- name: test1groups: wheel- name: test2groups: root
或with_items:- {name:'test1', groups:'wheel'}- {name:'test2', groups:'root'}ansible-playbook test3.yaml
6.1
6.2
总结
迭代:通常指持续的playbook 剧本(一种使用YAML编写自动化的任务脚本)进行修改和更新和改进的过程在工作中,需要经常针对一些特定的任务编写并使用 playbook ,而这些任务可能随着动态而变化的迭代提升了自动化的任务的效率和准确性
7.Templates 模块
Jinja是基于Python的模板引擎。Template类是Jinja的一个重要组件,可以看作是一个编译过的模板文件,用来产生目标文本,传递Python的变量给模板去替换模板中的标记。
1.先准备一个以 .j2 为后缀的 template 模板文件,设置引用的变量
cp /etc/httpd/conf/httpd.conf /opt/httpd.conf.j2vim /opt/httpd.conf.j2
Listen {{http_port}} #42行,修改
ServerName {{server_name}} #95行,修改
DocumentRoot "{{root_dir}}" #119行,修改2.修改主机清单文件,使用主机变量定义一个变量名相同,而值不同的变量
vim /etc/ansible/hosts
[webservers]
192.168.10.14 http_port=192.168.10.14:80 server_name=www.accp.com:80 root_dir=/etc/httpd/htdocs[dbservers]
192.168.10.15 http_port=192.168.0.15:80 server_name=www.benet.com:80 root_dir=/etc/httpd/htdocs3.编写 playbook
vim apache.yaml
---
- hosts: allremote_user: rootvars:- package: httpd- service: httpdtasks:- name: install httpd packageyum: name={{package}} state=latest- name: install configure filetemplate: src=/opt/httpd.conf.j2 dest=/etc/httpd/conf/httpd.conf #使用template模板notify:- restart httpd- name: create root dirfile: path=/etc/httpd/htdocs state=directory- name: start httpd serverservice: name={{service}} enabled=true state=startedhandlers:- name: restart httpdservice: name={{service}} state=restartedansible-playbook apache.yaml
7.1准备一个以 .j2 为后缀的 template 模板文件,设置引用的变量
cp /etc/httpd/conf/httpd.conf /opt/httpd.conf.j2vim /opt/httpd.conf.j2
Listen {{http_port}} #42行,修改
ServerName {{server_name}} #95行,修改
DocumentRoot "{{root_dir}}" #119行,修改
7.2修改主机清单文件,使用主机变量定义一个变量名相同,而值不同的变量
vim /etc/ansible/hosts
[webservers]
192.168.88.70 http_port=192.168.88.70:80 server_name=www.aaa.com:80 root_dir=/etc/httpd/htdocs[dbservers]
192.168.88.80 http_port=192.168.88.80:80 server_name=www.bbb.com:80 root_dir=/etc/httpd/htdocs
7.3编写 playbook
总结
template:它是一种用来创建配置文件的工具。会有一些数据经常动态改变,如IP地址、主机名(服务名)、用户端口、名等
需要使用变量来表示。template模块就是将这些变量和静态文本结合起来,生成一个最终的配置文件。
8.tags 模块
可以在playbook中为某个或某些任务定义“标签”,在执行此playbook时通过ansible-playbook命令使用–tags选项能实现仅运行指定的tasks。
playbook还提供了一个特殊的tags为always。作用就是当使用always当tags的task时,无论执行哪一个tags时,定义有always的tags都会执行。
vim webhosts.yaml
---
- hosts: webserversremote_user: roottasks:- name: Copy hosts filecopy: src=/etc/hosts dest=/opt/hoststags:- only #可自定义- name: touch filefile: path=/opt/testhost state=touchtags:- always #表示始终要运行的代码ansible-playbook webhosts.yaml --tags="only"vim dbhosts.yaml
---
- hosts: dbserversremote_user: roottasks:- name: Copy hosts filecopy: src=/etc/hosts dest=/opt/hoststags:- only- name: touch filefile: path=/opt/testhost state=touchansible-playbook dbhosts.yaml --tags="only"
//分别去两台被管理主机上去查看文件创建情况
总结
tags:在playbook中 tags 是一种标记任务或一系列任务的功能