首页 > 其他分享 >ansible—playbook剧本编写

ansible—playbook剧本编写

时间:2023-02-07 19:13:08浏览次数:46  
标签:httpd tasks name roles etc ansible playbook 编写

一、playbooks组成

Tasks:任务,即通过 task 调用 ansible 的模板将多个操作组织在一个 playbook 中运行

Variables:变量

Templates:模板

Handlers:处理器,当changed状态条件满足时,(notify)触发执行的操作

Roles:角色

二、示例

1、启动httpd

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 vim test.yaml ---     #yaml文件以---开头,以表明这是一个yaml文件,可省略 - name: first play     #定义一个play的名称,可省略   gather_facts: false    #设置不进行facts信息收集,这可以加快执行速度,可省略   hosts: dbservers    #指定要执行任务的被管理主机组,如多个主机组用冒号分隔   remote_user: root    #指定被管理主机上执行任务的用户   tasks:     #定义任务列表,任务列表中的各任务按次序逐个在hosts中指定的主机上执行    - name: test connection    #自定义任务名称      ping:     #使用 module: [options] 格式来定义一个任务    - name: disable selinux      command: '/sbin/setenforce 0'    #command模块和shell模块无需使用key=value格式      ignore_errors: True     #如执行命令的返回值不为0,就会报错,tasks停止,可使用ignore_errors忽略失败的任务    - name: disable firewalld      service: name=firewalld state=stopped    #使用 module: options 格式来定义任务,option使用key=value格式    - name: install httpd      yum: name=httpd state=latest    - name: install configuration file for httpd      copy: src=/opt/httpd.conf dest=/etc/httpd/conf/httpd.conf    #这里需要一个事先准备好的/opt/httpd.conf文件,我们可以把端口修改一下      notify: "restart httpd"    #如以上操作后为changed的状态时,会通过notify指定的名称触发对应名称的handlers操作    - name: start httpd service      service: enabled=true name=httpd state=started   handlers:     #handlers中定义的就是任务,此处handlers中的任务使用的是service模块    - name: restart httpd    #notify和handlers中任务的名称必须一致      service: name=httpd state=restarted ========================================================== ##Ansible在执行完某个任务之后并不会立即去执行对应的handler,而是在当前play中所有普通任务都执行完后再去执行handler,这样的好处是可以多次触发notify,但最后只执行一次对应的handler,从而避免多次重启 ========================================================== 运行playbook   ansible-playbook test.yaml

 

 

1 2 3 4 5 6 7 8 9 10 //运行playbook ansible-playbook test.yaml //补充参数: -k(–ask-pass):用来交互输入ssh密码 -K(-ask-become-pass):用来交互输入sudo密码 -u:指定用户 ansible-playbook test.yaml --syntax-check    #检查yaml文件的语法是否正确 ansible-playbook test.yaml --list-task       #检查tasks任务 ansible-playbook test.yaml --list-hosts      #检查生效的主机 ansible-playbook test.yaml --start-at-task='install httpd'     #指定从某个task开始运行

2、定义、引用变量

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 - name: second play hosts: dbservers remote_user: root vars:                 #定义变量   - groupname: mysql   #格式为 key: value   - username: nginx tasks:   - name: create group   group: name={{groupname}} system=yes gid=306    #使用 {{key}} 引用变量的值   - name: create user   user: name={{username}} uid=306 group={{groupname}}   - name: copy file   copy: content="{{ansible_default_ipv4}}" dest=/opt/vars.txt    #在setup模块中可以获取facts变量信息       ansible-playbook test1.yaml -e "username=nginx"     #在命令行里定义变量   #命令行输入的变量值优先级高于yaml文件中的变量值

3、指定远程主机sudo切换用户

1 2 3 4 5 6 --- - hosts: dbservers remote_user: zhangsan            become: yes                  #2.6版本以后的参数,之前是sudo,意思为切换用户运行 become_user: root              #指定sudo用户为root 执行playbook时:ansible-playbook test1.yml -K <密码>

4、when条件判断

1 2 3 4 5 6 7 8 9 10 11 12 13 在Ansible中,提供的唯一一个通用的条件判断是when指令,当when指令的值为true时,则该任务执行,否则不执行该任务。   when一个比较常见的应用场景是实现跳过某个主机不执行任务或者只有满足条件的主机执行任务 vim test2.yaml --- - hosts: all   remote_user: root   tasks:   - name: shutdown host   command: /sbin/shutdown -r now   when: ansible_default_ipv4.address == "192.168.142.4"      #when指令中的变量名不需要手动加上 {{}}      when: inventory_hostname == "<主机名>"

 

5、迭代

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 Ansible提供了很多种循环结构,一般都命名为with_items,作用等同于 loop 循环。 vim test3.yaml --- - name: play1 hosts: dbservers gather_facts: false tasks:   - name: create directories   file:     path: "{{item}}"     state: directory   with_items:          #等同于 loop:     - /opt/test1     - /opt/test2   - name: add users   user: name={{item.name}} state=present groups={{item.groups}}   with_items:     - name: test1       groups: wheel     - name: test2       groups: root   with_items:     - {name:'test1', groups:'wheel'}     - {name:'test2', groups:'root'}

 

 

6、Templates 模块

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 Jinja是基于Python的模板引擎。Template类是Jinja的一个重要组件,可以看作是一个编译过的模板文件,用来产生目标文本,传递Python的变量给模板去替换模板中的标记。   1.先准备一个以 .j2 为后缀的 template 模板文件,设置引用的变量 cp /etc/httpd/conf/httpd.conf /opt/httpd.conf.j2   vim /opt/httpd.conf.j2 Listen {{http_port}}                #42行,修改 ServerName {{server_name}}          #95行,修改 DocumentRoot "{{root_dir}}"          #119行,修改 <Directory "{{root_dir}}">            #124行,修改   2.修改主机清单文件,使用主机变量定义一个变量名相同,而值不同的变量 vim /etc/ansible/hosts       [webservers] 192.168.142.4 http_port=192.168.142.4:80 server_name=www.aaa.com:80 root_dir=/etc/httpd/htdocs   [dbservers] 192.168.142.5 http_port=192.168.142.5:80 server_name=www.bbb.com:80 root_dir=/etc/httpd/htdocs   3.编写 playbook vim apache.yaml --- - hosts: all remote_user: root vars: - package: httpd - service: httpd tasks: - name: install httpd package   yum: name={{package}} state=latest - name: install configure file   template: src=/opt/httpd.conf.j2 dest=/etc/httpd/conf/httpd.conf     #使用template模板   notify:     - restart httpd - name: create root dir   file: path=/etc/httpd/htdocs state=directory - name: start httpd server   service: name={{service}} enabled=true state=started handlers: - name: restart httpd   service: name={{service}} state=restarted

 

 

 

7、tags 模块

可以在一个playbook中为某个或某些任务定义“标签”,在执行此playbook时通过ansible-playbook命令使用--tags选项能实现仅运行指定的tasks。
playbook还提供了一个特殊的tags为always。作用就是当使用always当tags的task时,无论执行哪一个tags时,定义有always的tags都会执行。  

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 vim webhosts.yaml --- - hosts: webservers   remote_user: root   tasks:     - name: Copy hosts file     copy: src=/etc/hosts dest=/opt/hosts     tags:       - only     #可自定义     - name: touch file     file: path=/opt/testhost state=touch     tags:       - always    #表示始终要运行的代码   ansible-playbook webhosts.yaml --tags="only"   vim dbhosts.yaml --- - hosts: dbservers remote_user: root tasks:   - name: Copy hosts file     copy: src=/etc/hosts dest=/opt/hosts     tags:      - only   - name: touch file     file: path=/opt/testhost state=touch     ansible-playbook dbhosts.yaml --tags="only" //分别去两台被管理主机上去查看文件创建情况

 

 

8、Roles 模块

Ansible为了层次化、结构化地组织Playbook,使用了角色(roles),roles可以根据层次型结构自动装载变量文件、task以及handlers等。简单来讲,roles就是通过分别将变量、文件、任务、模块及处理器放置于单独的目录中,并可以便捷地include它们。roles一般用于基于主机构建服务的场景中,但也可以用于构建守护进程等场景中。  

(1)roles 的目录结构

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 cd /etc/ansible/ tree roles/ roles/ ├── web/ │   ├── files/ │   ├── templates/ │   ├── tasks/ │   ├── handlers/ │   ├── vars/ │   ├── defaults/ │   └── meta/ └── db/ ├── files/ ├── templates/ ├── tasks/ ├── handlers/ ├── vars/ ├── defaults/ └── meta/

(2)roles 内各目录含义解释

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 ●files 用来存放由 copy 模块或 script 模块调用的文件。   ●templates 用来存放 jinjia2 模板,template 模块会自动在此目录中寻找 jinjia2 模板文件。   ●tasks 此目录应当包含一个 main.yml 文件,用于定义此角色的任务列表,此文件可以使用 include 包含其它的位于此目录的 task 文件。   ●handlers 此目录应当包含一个 main.yml 文件,用于定义此角色中触发条件时执行的动作。   ●vars 此目录应当包含一个 main.yml 文件,用于定义此角色用到的变量。   ●defaults 此目录应当包含一个 main.yml 文件,用于为当前角色设定默认变量。   ●meta 此目录应当包含一个 main.yml 文件,用于定义此角色的特殊设定及其依赖关系。

(3)使用roles分别安装httpd、mysql、php

1 2 (1)创建以 roles 命名的目录 mkdir /etc/ansible/roles/ -p    #yum装完默认就有

1 2 3 (2)创建全局变量目录(可选) mkdir /etc/ansible/group_vars/ -p touch /etc/ansible/group_vars/all     #文件名自己定义,引用的时候注意

1 2 3 4 (3)在 roles 目录中分别创建以各角色名称命令的目录,如 httpd、mysql、php mkdir /etc/ansible/roles/httpd mkdir /etc/ansible/roles/mysql mkdir /etc/ansible/roles/php

 

1 2 3 4 (4)在每个角色命令的目录中分别创建7个目录 mkdir /etc/ansible/roles/httpd/{files,templates,tasks,handlers,vars,defaults,meta} mkdir /etc/ansible/roles/mysql/{files,templates,tasks,handlers,vars,defaults,meta} mkdir /etc/ansible/roles/php/{files,templates,tasks,handlers,vars,defaults,meta}

 

1 2 3 4 5 (5)在每个角色的 handlers、tasks、meta、defaults、vars 目录下创建 main.yml 文件,千万不能自定义文件名   touch /etc/ansible/roles/httpd/{defaults,vars,tasks,meta,handlers}/main.yml touch /etc/ansible/roles/mysql/{defaults,vars,tasks,meta,handlers}/main.yml touch /etc/ansible/roles/php/{defaults,vars,tasks,meta,handlers}/main.yml

 

1 2 3 4 5 6 7 8 9 10 11 (6)编写httpd模块 写一个简单的tasks/main.yml vim /etc/ansible/roles/httpd/tasks/main.yml - name: install apache   yum: name={{pkg}} state=latest - name: start apache   service: enabled=true name={{svc}} state=started   vim /etc/ansible/roles/mysql/vars/main.yml pkg: httpd svc: httpd

 

1 2 3 4 5 6 7 8 9 10 11 12 (7)编写mysql模块 vim /etc/ansible/roles/mysql/tasks/main.yml - name: install mysql yum: name={{pkg}} state=latest - name: start mysql service: enabled=true name={{svc}} state=started   vim /etc/ansible/roles/mysql/vars/main.yml pkg: - mariadb - mariadb-server svc: mariadb

 

 

1 2 3 4 5 6 7 8 9 10 11 12 (8)编写php模块 vim /etc/ansible/roles/php/tasks/main.yml - name: install php   yum: name={{pkg}} state=latest - name: start php-fpm  service: enabled=true name={{svc}} state=started   vim /etc/ansible/roles/php/vars/main.yml pkg: - php - php-fpm svc: php-fpm

 

1 2 3 4 5 6 7 8 9 10 11 12 13 (9)编写roles示例 vim /etc/ansible/site.yml --- - hosts: webservers remote_user: root roles: - httpd - mysql - php     cd /etc/ansible ansible-playbook site.yml

 

标签:httpd,tasks,name,roles,etc,ansible,playbook,编写
From: https://www.cnblogs.com/y0226/p/17099516.html

相关文章

  • 看我是如何用C#编写一个小于8KB的贪吃蛇游戏的
    译者注:这是MichalStrehovský大佬的一篇文章,他目前在微软.NETRuntime团队工作,主要是负责.NETNativeAOT功能的开发。我在前几天看到这篇文章,非常喜欢,虽然它的内容稍微......
  • Ansible剧本(playbook)
    一、playbooks概述以及实例操作1、playbooks的组成playbooks本身由以下各部分组成Tasks:任务,即通过task调用ansible的模板将多个操作组织在一个playbook中运行......
  • Ansible的部署和命令模块
    一、ansible的概述1.1ansible简介Ansible是一款为类Unix系统开发的自由开源的配置和自动化工具。它用Python写成,类似于saltstack和Puppet,但是有一个不同和优点是我们不......
  • Android 编写使用root权限的android应用程序
    packagecom.iaiai;importjava.io.BufferedReader;importjava.io.DataOutputStream;importjava.io.InputStreamReader;importandroid.app.Activity;importandroid.os.B......
  • linux平台makefile文件的编写基础篇
    目的:基本掌握了make的用法,能在Linux系统上编程。环境:Linux系统,或者有一台Linux服务器,通过终端连接。一句话:有Linux编译环境。准备:准备三个文件:fil......
  • ansible自动化运维工具
    一、Ansible1、Ansible是一个基于Python开发的配置管理和应用部署工具,现在也在自动化管理领域大放异彩。它融合了众多老牌运维工具的优点,Pubbet和Saltstack能实现的功能,An......
  • 【☝️C站博客大神的标配の建议收藏☝️】Emoji符号大全,可直接复制使用,无需编写符号代码
    引子看到各个巨佬都用Emoji表情,于是也想搞搞。先百度了一波,说直接使用符号代码,然后markdown里就直接可以,但是符号代码感觉影响文档的编写体验,于是想能不能直接复制呢,这样既......
  • 代码编写规范
    一.目的为了更好的提高工作效率,保证开发的有效性和合理性,并可最大程度的提高程序代码的可读性和可重复利用性,便于交流和维护 二、命名总体规范名字应该能够标......
  • 《植物大战僵尸》 辅助编写1——阳光不减
    失败的一次尝试先用CheatEngine扫阳光的地址,然后找到修改该值的代码。一个是捡阳光时增加,一个是种植物减少。这里我们看种植物减少的部分。0041BA76将计算过的阳光......
  • STM32 RTC掉电不走时(有备用电池供电,HAL库编写)
    问题简述:实验环境:使用stm32cubemx配置生成了一个RTC的工程,使能了外部时钟LSE,提供了备用电池VBTE。问题:断开主电源后(备用电池已经安装好了),再次上电读取RTC的值发现,数值为断......