最常见的企业建站程序有,修改wordpress头像自定义,专业网站搭建定做,申请网页要多少钱一、playbook简介
playbook是ansible用于配置#xff0c;部署和管理托管主机剧本#xff0c;通过playbook的详细描述#xff0c;执行其中一系列tasks#xff0c;playbook字面意思是剧本#xff0c;现实中由演员按剧本表演#xff0c;在ansible中由计算机进行安装#x…一、playbook简介
playbook是ansible用于配置部署和管理托管主机剧本通过playbook的详细描述执行其中一系列tasksplaybook字面意思是剧本现实中由演员按剧本表演在ansible中由计算机进行安装部署应用提供对外服务以及组织计算机处理各种各样的事情。 ansible使用playbook来管理自动化taskplaybook是yaml格式的文件其基本内容可以认为是多条ansible的ad-hoc的语句组成。我们完成一个任务例如安装部署一个httpd服务我们需要多个模块一个模块也可以称之为task提供功能来完成。而playbook就是组织多个task的容器他的实质就是一个文件是用yamlYet Another Markup Language语言编写的文件有着特定的组织格式。YAML 是专门用来写配置文件的语言非常简洁和强大远比 JSON 格式方便YAML语法能够简单的表示散列表字典等数据结构。 playbook命令根据自上而下的顺序依次执行。同时playbook开创了很多特性,它可以允许你传输某个命令的状态到后面的指令,如你可以从一台机器的文件中抓取内容并附为变量,然后在另一台机器中使用,这使得你可以实现一些复杂的部署机制,这是ansible命令无法实现的。
二、Playbook核心元素 模块名 注释 Hosts 执行的远程主机列表 Tasks 任务集即通过 task 调用 ansible 的模板将多个操作组织在一个 playbook 中运行 Variables 内置变量或自定义变量在playbook中调用 Templates 模板使用模板语法的文件比如配置文件等 Handlers 处理器当changed状态条件满足时notify触发执行的操作和notity结合使用 tags 标签指定某条任务执行用于选择运行playbook中的部分代码 Roles 角色 三、Playbook语法
playbook使用yaml语法格式后缀可以是yaml,也可以是yml文件中有多个play一个play中只能有一个tasks一个tasks中可以有多个name任务。
在一个playbook文件中可以连续三个连子号(---)区分多个play。还有选择性的连续三个点好(...)用来表示play的结尾也可省略次行开始正常写playbook的内容一般都会写上描述该playbook的功能使用#号注释代码缩进必须统一不能空格和tab混用缩进的级别也必须是一致的同样的缩进代表同样的级别程序判别配置的级别是通过缩进结合换行实现的YAML文件内容和Linux系统大小写判断方式保持一致是区分大小写的k/v的值均需大小写敏感k/v的值可同行写也可以换行写。同行使用:分隔v可以是个字符串也可以是一个列表一个完整的代码块功能需要最少元素包括 name: task
四、playbook 运行方式
ansible-playbook filename.yml ... [options]#检测文件配置
ansible-playbook test.yaml --syntax-check
#执行文件
ansible-playbook test.yaml
ansible-playbook filename.yml [options]# ssh 连接的用户名
-u REMOTE_USER, --userREMOTE_USER# ssh登录认证密码
-k, --ask-pass # sudo 到root用户相当于Linux系统下的sudo命令
-s, --sudo # sudo 到对应的用户
-U SUDO_USER, --sudo-userSUDO_USER # 用户的密码—sudo时使用
-K, --ask-sudo-pass # ssh 连接超时默认 10 秒
-T TIMEOUT, --timeoutTIMEOUT# 指定该参数后执行 playbook 文件不会真正去执行而是模拟执行一遍然后输出本次执行会对远程主机造成的修改
-C, --check # 设置额外的变量如keyvalue 形式 或者 YAML or JSON以空格分隔变量或用多个-e
-e EXTRA_VARS, --extra-varsEXTRA_VARS # 进程并发处理默认 5
-f FORKS, --forksFORKS # 指定 hosts 文件路径默认 default/etc/ansible/hosts
-i INVENTORY, --inventory-fileINVENTORY # 指定一个 pattern对- hosts:匹配到的主机再过滤一次
-l SUBSET, --limitSUBSET # 只打印有哪些主机会执行这个 playbook 文件不是实际执行该 playbook
--list-hosts # 列出该 playbook 中会被执行的 task
--list-tasks # 私钥路径
--private-keyPRIVATE_KEY_FILE # 同一时间只执行一个 task每个 task 执行前都会提示确认一遍
--step # 只检测 playbook 文件语法是否有问题不会执行该 playbook
--syntax-check # 当 play 和 task 的 tag 为该参数指定的值时才执行多个 tag 以逗号分隔
-t TAGS, --tagsTAGS # 当 play 和 task 的 tag 不匹配该参数指定的值时才执行
--skip-tagsSKIP_TAGS # 输出更详细的执行过程信息-vvv可得到所有执行过程信息。
-v, --verbose 检查文件是否有误 ansible-playbook test.yaml --syntax-check 执行文件 ansible-playbook test1.yaml 六、变量
- name: testhosts: testremote_user: rootvars: #定义变量- groupname: testgroup - username: testusertasks:- name: create groupgroup: name{{groupname}} systemyes gid600 #使用 {{key}} 引用变量的值- name: create useruser: name{{username}} uid600 group{{groupname}} - name: copy filecopy: content{{ansible_default_ipv4}} dest/opt/vars.txt #在setup模块中可以获取facts变量信息七、常用模块
1、when 模块 在Ansible中提供的唯一一个通用的条件判断是when指令当when指令的值为true时则该任务执行否则不执行该任务。 when一个比较常见的应用场景是实现跳过某个主机不执行任务或者只有满足条件的主机执行任务 ---
- hosts: allremote_user: roottasks:- name: test when service: namehttpd statestoppedwhen: ansible_default_ipv4.address 192.168.0.1 #when指令中的变量名不需要手动加上 {{}}
# 或 when: inventory_hostname 主机名当主机 IP 是 192.168.0.1 才会启动 httpd 否则不启动 2、with_items 模块 Ansible提供了很多种循环结构一般都命名为with_items作用等同于 loop 循环;案例中with_item 相当于提供了2个变量循环被调用执行任务 ---
- name: playhosts: testgather_facts: falsetasks:- name: create directoriesfile:path: {{item}}state: directorywith_items:- /tmp/test1- /tmp/test2- name: add usersuser: name{{item.name}} statepresent groups{{item.groups}}with_items:- name: test1groups: wheel- name: test2groups: root
或with_items:- {name:test1, groups:wheel}- {name:test2, groups:root}3、template(模板) Ansible 模板是一种强大的工具可用于在自动化任务中以动态方式生成配置、文件和其他工件。模板使用 Jinja2 模板语言这是一种功能强大的模板语言可用于创建复杂的模板。 Jinja2 模板语言使用字面量有下面形式。 字符串使用单引号或者双引号 数字整数、浮点数 列表[item1、item2、......] 元组[item1、item2、......] 字典[key1:value1key2:value2......] 布尔型true/false 算数运算 - * // /%** 比较操作 ! 逻辑运算and、or、not 流表达式If For When template功能根据模块文件动态生成对应的配置文件 template文件必须存放于templates目录下且命名为 .j2 结尾 yaml/yml 文件需和templates目录平级目录结构如下 ./ ├── temnginx.yml └── templates └── nginx.conf.j2 ---
- hosts: 10.0.0.1remote_user: roottasks:- name: install packageyum: nginx- name: copy templatetemplate: src: nginx.conf.j2dest: /etc/nginx/nginx.conf- name: service startservice: namenginx statestarted enabledyes
4、Playbooks中tasks语法使用
4.1、tags 如果写了一个很长的playbook其中有很多的任务这并没有什么问题不过在实际使用这个剧本时可能只是想要执行其中的一部分任务而已或者你只想要执行其中一类任务而已而并非想要执行整个剧本中的全部任务这个时候我们就可以借助 tags 标签实现这个需求。 tags可以帮助我们对任务进行’打标签’的操作与模块名同级当任务存在标签以后我们就可以在执行playbook时借助标签指定执行哪些任务或者指定不执行哪些任务了。 为playbook 添加标签的方式有如下几种
对一个 task 打一个标签对一个 task 打多个标签对多个 task 打一个标签
使用标签的方式
-t 执行指定tag标签对用的任务--skip-tags 执行除 --skip-tags 标签之外的所有任务
---
- hosts: webremote_user: roottasks:- name: test1file:path: /tmp/abc1.txtstate: touchtags: t1,t4- name: test2file:path: /tmp/abc2.txtstate: touchtags: t2- name: test3file:path: /tmp/abc3.txtstate: touchtags: t3,t4
借助标签除了能够指定“需要执行的任务”还能够指定“不执行的任务” 使用--skip-tags 选项
ansible-playbook --skip-tagst2 tags-test1.yaml
其实ansible预置了5个特殊的标签分别是
always 总是会被执行
never 总是不执行
tagged 表示只执行有标签的任务没有标签的任务不会被执行。
untagged 只执行没有标签的任务但是如果某些任务包含always标签那么这些任务也会被执行。
all 特殊标签all表示所有任务会被执行不用指定默认情况下就是使用这个标签。
---
- hosts: webremote_user: roottasks:- name: test1file:path: /tmp/abc1.txtstate: absenttags: t1- name: test2file:path: /tmp/abc2.txtstate: absenttags: t2- name: test3file:path: /tmp/abc3.txtstate: absenttags: t3,always# task3的标签有两个t3和always在执行剧本时候不指定t3但是也会被执行这就是always的作用。
如果不想执行标签中包含always的任务可以使用--skip-tagsalways 跳过他们。4.2、file file模块主要用于远程主机上的文件操作file模块包含如下选项 force 需要在两种情况下强制创建软链接一种是源文件不存在但之后会建立的情况下另一种是目标软链接已存在,需要先取消之前的软链然后创建新的软链选项yes/no group 定义文件/目录的属组 mode 定义文件/目录的权限 owner 定义文件/目录的属主 path 必选项定义文件/目录的路径 recurse 递归的设置文件的属性只对目录有效 src 要被链接的源文件的路径只应用于statelink的情况 dest 被链接到的目标路径只应用于statelink的情况 state directory表示目录如果目录不存在则创建目录。 link创建软链接 hard创建硬链接 touch如果文件不存在则会创建一个新的文件如果文件或目录已存在则更新其最后修改时间 absent删除目录、文件或者取消链接文件。
举例
- hosts: 192.168.0.1remote_user: tomcattasks:- name: mkdir data directoryfile: path/opt/data statedirectory mode0755- name: chmod binfile: dest/opt/bigdata/jdk/bin mode0755 recurseyes- name: link filesfile: src/etc/ssh/sshd_config dest/mnt/sshd_config ownersshd statelink- name: delete filesfile: path/tmp/tomcat.tar.gz stateabsent- name: chown filesfile: path/mnt/test.txt ownernobody groupnobody mode0644
4.3、lineinfile 修改文件某一行文本 常用参数 path 必须参数指定要操作的文件 regexp 使用正则表达式匹配对应的行当替换文本时如果有多行文本都能被匹配则只有最后面被匹配到的那行文本才会被替换当删除文本时如果有多行文本都能被匹配这么这些行都会被删除。 line 指定修改后的文本内容 state 当想要删除对应的文本时需要将state参数的值设置为absentabsent为缺席之意表示删除state的默认值为present backrefs 默认情况下当根据正则替换文本时即使regexp参数中的正则存在分组在line参数中也不能对正则中的分组进行引用除非将backrefs参数的值设置为yesbackrefsyes表示开启后向引用这样line参数中就能对regexp参数中的分组进行后向引用了这样说不太容易明白参考下面的示例命令比较直观一点backrefsyes除了能够开启后向引用功能还有另一个作用默认情况下当使用正则表达式替换对应行时如果正则没有匹配到任何的行那么line对应的内容会被插入到文本的末尾不过如果使用了backrefsyes情况就不一样了当使用正则表达式替换对应行时同时设置了backrefsyes那么当正则没有匹配到任何的行时则不会对文件进行任何操作相当于保持原文件不变如果没有理解就按照下面的示例命令动手操作一下吧那样更加直观 insertafter 借助insertafter参数可以将文本插入到“指定的行”之后insertafter参数的值可以设置为EOF或者正则表达式EOF为End Of File之意表示插入到文档的末尾默认情况下insertafter的值为EOF如果将insertafter的值设置为正则表达式表示将文本插入到匹配到正则的行之后如果正则没有匹配到任何行则插入到文件末尾当使用backrefs参数时此参数会被忽略 insertbefore 借助insertbefore参数可以将文本插入到“指定的行”之前insertbefore参数的值可以设置为BOF或者正则表达式BOF为Begin Of File之意表示插入到文档的开头如果将insertbefore的值设置为正则表达式表示将文本插入到匹配到正则的行之前如果正则没有匹配到任何行则插入到文件末尾当使用backrefs参数时此参数会被忽略 backup 是否在修改文件之前对文件进行备份 create 操作的文件不存在时是否创建
示例
1、替换文件中匹配到得最后一个 SELINUX替换成 SELINUXenforcing - name: seline modify enforcinglineinfile:dest: /etc/selinux/configregexp: ^SELINUXline: SELINUXenforcing
2、 insertbefore匹配内容在前面添加
- name: httpd.conf modify 8080lineinfile:dest: /opt/playbook/test/http.confregexp: ^Listeninsertbefore: ^#Port line: Listen 8080tags:- http8080
3、修改文件内容以及权限 - name: modify hostslineinfile:dest: /opt/playbook/test/hostsregexp: ^127\.0\.0\.1line: 127.0.0.1 localhostsowner: rootgroup: rootmode: 0644tags:- hosts
4、删除一行内容
- name: delete 192.168.0.1lineinfile:dest: /opt/playbook/test/hostsstate: absentregexp: ^192\.tags:- delete192
4.4、replace replace 模块根据指定得正则表达式替换文件中得字符串文件中所有被正则匹配到得字符串都会被替换 - name: 替换配置文件中的文本hosts: servicetasks:- name: 替换单个文本replace:path: /etc/test/config.confregexp: old_textreplace: new_text- name: 替换多个文本replace:path: /etc/test/config.confregexp: (old_text1|old_text2)replace: new_text- name: 使用正则表达式替换replace:path: /etc/test/config.confregexp: pattern(.*)replace: replacement\1backrefs: yes 使用正则表达式替换通过regexp参数指定一个正则表达式使用括号捕获匹配的内容。通过replace参数指定替换的文本并使用\1表示捕获的内容。replace模块会在文件中查找匹配的文本并进行替换。 4.5、shell 执行命令 - shell: mkdir /tmp/mytest - shell: echo export JAVA_HOME/opt/jdk /etc/profile 4.6、pause 暂停一定时间 常用参数 minutes暂停多少分钟seconds暂停多少秒prompt打印一串信息提示用户操作 - name: 等待用户30s用于输入pause: seconds30 promptENTER to continue CTRL-C a to quit
4.7、local_action 本地操作功能在运行ansible命令机器上执行操作 4.8、ignore_errors 忽略错误通常情况执行失败时 ansible 会停止运行有时候需要继续执行则需要添加次参数 - name: 删除临时目录shell: rm /tmp/dataignore_errorsyes
4.9、user/group 用户组管理 常用参数 name指定组名称gid指定GIDstate动作参数 present增加 absent删除 4.10、yum 软件包管理 常用参数 name指定需要管理的软件包名 state参数非常灵活可以包含的值及含义如下 present确保软件包已经安装了 installed安装 latest安装最新的软件包 removed/absent删除对应的软件包 disable_gpg_check用于禁用对rpm包公钥验证默认值no表示不禁用验证yes表示禁用验证 ---
- name: install packagehosts: alltasks:- name: install php and mariaDByum:name:- php- mariadbstate: presentwhen: ansible_hostname in groups[dev] - name: install the Development tools package groupyum:name: Development toolsstate: presentwhen: ansible_hostname in groups[dev]- name: upgrade all packagesyum:name: *state: latest
- name安装httpd服务yum: namehttpd statelatest- name: 删除旧版gccyum: name {{ item }} stateremovedwith_items:- gcc- httpd- php
4.11、cron 定时任务相当于crontab 常用参数 name任务名称 minute分 hour时day天month月weekday周 job指定要执行的命令或者脚本 state当设置为absent代表删除任务 - name: 新增一个定时查看路径任务cron: namecheck minute5 jobpwd
5、wars 变量
- name: second playhosts: dbserversremote_user: rootvars: #定义变量- groupname: testgroup #格式为 key: value- username: testusertasks:- name: create groupgroup: name{{groupname}} systemyes gid308 #使用 {{key}} 引用变量的值- name: create useruser: name{{username}} uid309 group{{groupname}} - name: copy filecopy: content{{ansible_default_ipv4}} dest/opt/vars.txt #在setup模块中可以获取facts变量信息