建设银行信用卡中心网站首页,济南网站建设优化,百度推广登陆网址,工厂erp管理系统软件playbook 一、playbook 的概述1. playbook 的概念2. playbook 的构成 二、playbook 的应用1. 安装 httpd 并启动2. 定义、引用变量3. 指定远程主机 sudo 切换用户4. when条件判断5. 迭代6. Templates 模块6.1 添加模板文件6.2 修改主机清单文件6.3 编写 playbook 7. tags 模块 … playbook 一、playbook 的概述1. playbook 的概念2. playbook 的构成 二、playbook 的应用1. 安装 httpd 并启动2. 定义、引用变量3. 指定远程主机 sudo 切换用户4. when条件判断5. 迭代6. Templates 模块6.1 添加模板文件6.2 修改主机清单文件6.3 编写 playbook 7. tags 模块 总结1. playbook 剧本 一、playbook 的概述
1. playbook 的概念 简单来说playbooks是一种简单的配置管理系统与多机器部署系统的基础。与现有的其他系统有不同之处且非常适合复杂应用的部署。 Playbooks 可用于声明配置更强大的地方在于playbooks可以编排有序的去执行过程甚至做到多组机器间来回有序的执行特别指定的步骤并且可以同步或异步的发起任务。
2. playbook 的构成 playbooks 本身由以下各部分组成:
Tasks任务即通过 task 调用 ansible 的模块将多个操作组织在一个 playbook 中运行Variables变量emplates模板Handlers处理器当changed状态条件满足时notify触发执行的操作Roles角色。
二、playbook 的应用
1. 安装 httpd 并启动
#创建一个目录用来存放 playbooks 的文件
cd /etc/ansible/
mkdir playbooks#编写 playbooks 文件
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模块无需使用keyvalue格式ignore_errors: True #如执行命令的返回值不为0就会报错tasks停止可使用ignore_errors忽略失败的任务- name: disable firewalldservice: namefirewalld statestopped #使用 module: options 格式来定义任务option使用keyvalue格式- name: install httpdyum: namehttpd statelatest- 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: enabledtrue namehttpd statestartedhandlers: #handlers中定义的就是任务此处handlers中的任务使用的是service模块- name: restart httpd #notify和handlers中任务的名称必须一致service: namehttpd staterestarted
##Ansible在执行完某个任务之后并不会立即去执行对应的handler而是在当前play中所有普通任务都执行完后再去执行handler这样的好处是可以多次触发notify但最后只执行一次对应的handler从而避免多次重启。#运行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-taskinstall httpd #指定从某个task开始运行2. 定义、引用变量
- name: second playhosts: dbserversremote_user: rootvars: #定义变量- groupname: mysql #格式为 key: value- username: nginxtasks:- name: create groupgroup: name{{groupname}} systemyes gid306 #使用 {{key}} 引用变量的值- name: create useruser: name{{username}} uid306 group{{groupname}} - name: copy filecopy: content{{ansible_default_ipv4}} dest/opt/vars.txt #在setup模块中可以获取facts变量信息ansible-playbook test2.yaml -e usernamenginx #在命令行里定义变量3. 指定远程主机 sudo 切换用户
- name: third playhosts: dbserversremote_user: nginx become: yes #2.6版本以后的参数之前是sudo意思为切换用户运行become_user: root #指定sudo用户为root#目标主机添加用户并提权
vim /etc/sudoers
nginx ALLALL#运行playbook
ansible-playbook test3.yml -k -K 4. when条件判断 在Ansible中提供的唯一一个通用的条件判断是when指令当when指令的值为true时则该任务执行否则不执行该任务。 when一个比较常见的应用场景是实现跳过某个主机不执行任务或者只有满足条件的主机执行任务。
vim test4.yaml
---
- hosts: allremote_user: roottasks:- name: shutdown host command: /sbin/shutdown -r nowwhen: ansible_default_ipv4.address 192.168.145.30 #when指令中的变量名不需要手动加上 {{}}
或 when: inventory_hostname 主机名#运行playbook
ansible-playbook test4.yaml5. 迭代 Ansible提供了很多种循环结构一般都命名为with_items作用等同于 loop 循环。
vim test5.yaml
---
- name: play1hosts: dbserversgather_facts: falsetasks: - name: create filefile:path: {{item}}state: touchwith_items: [ /opt/a, /opt/b, /opt/c, /opt/d ]#运行playbook
ansible-playbook test5.yaml- name: play2hosts: dbserversgather_facts: false vars:test:- /tmp/test1- /tmp/test2- /tmp/test3- /tmp/test4tasks: - name: create directoriesfile:path: {{item}}state: directorywith_items: {{test}}#运行playbook
ansible-playbook test5.yaml6. Templates 模块 Jinja是基于Python的模板引擎。Template类是Jinja的一个重要组件可以看作是一个编译过的模板文件用来产生目标文本传递Python的变量给模板去替换模板中的标记。
6.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行修改6.2 修改主机清单文件
#修改主机清单文件使用主机变量定义一个变量名相同而值不同的变量
vim /etc/ansible/hosts
[webservers]
192.168.145.30 http_port192.168.145.30:80 server_namewww.accp.com:80 root_dir/etc/httpd/htdocs[dbservers]
192.168.145.45 http_port192.168.145.45:80 server_namewww.benet.com:80 root_dir/etc/httpd/htdocs6.3 编写 playbook
vim apache.yaml
---
- hosts: allremote_user: rootvars:- package: httpd- service: httpdtasks:- name: install httpd packageyum: name{{package}} statelatest- 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 statedirectory- name: start httpd serverservice: name{{service}} enabledtrue statestartedhandlers:- name: restart httpdservice: name{{service}} staterestarted#运行playbook
ansible-playbook apache.yaml7. 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 statetouchtags:- always #表示始终要运行的代码#运行playbook
ansible-playbook webhosts.yaml --tagsonlyvim dbhosts.yaml
---
- hosts: dbserversremote_user: roottasks:- name: Copy hosts filecopy: src/etc/hosts dest/opt/hoststags:- only- name: touch filefile: path/opt/testhost statetouch#运行playbook
ansible-playbook dbhosts.yaml --tagsonly#分别去两台被管理主机上去查看文件创建情况总结
1. playbook 剧本
vim xxx.ymal
- name: #指定play名称hosts: #指定主机组remote_user: #执行用户gather_facts: treu/false #是否收集远程主机facts信息vars: #定义变量tasks: #定义任务列表- name: #定义任务名称模块: #定义任务使用的模块和参数with_items: #定义循环when: #定义判断条件( ! )true则执行任务否则不执行任务ignore_errors: true #忽略任务失败notify: #定义task任务changed状态时触发的任务名tags: #指定标签ansible-playbook --tags 仅执行拥有指定tags标签的任务always标签总会执行handlers: #定义notify触发的任务列表task任务 模块语法格式#横向格式
模块名参数选项1值 参数选项2{{变量名}} ...#纵向格式
模块名参数选项1: 值参数选项2: {{变量名}}...with_items 和 变量 的语法格式
#横向格式
with_items: [值1,值2,值3]
#纵向格式:
with_items:
- 值1
- 值2
- 值3
----------------------------------------------
值为对象键值对字段)时:
#横向格式
with_items :
- { key1 : value1, key2 : value2, ... }
- { key1 : value3, key2 : value4, ... }
#纵向格式:
with_items:
- key1: value1key2: value2
- key1: value3key2: value4