Ansible的脚本之playbook剧本概念与实操(图文示例)

目录

一、playbooks 概述以及实例操作

1.playbooks 的组成

2.主机清单

①主机变量 

②组变量

③组嵌套

④inventor 变量参数 

二、yaml文件

1.基本语法规则

2.YAML支持的数据结构

扫描二维码关注公众号,回复: 17258836 查看本文章

三、Ansible的脚本–playbook剧本

1.playbooks本身由以下各部分组成

2.下面是一个playbook的示例

3.执行一个playbook 

4.hosts 和 users 介绍

5.指定远程主机sudo切换用户

6.tasks列表和action

7.Handlers介绍

8.playbook使用变量

①直接在yaml中定义变量{playbook中直接使用变量}

②通过ansible命令参数- e 传递传递 

③直接引用一些变量

9.条件测试

 ①单条件判断

②多条件判断 

③组条件判断 

④自定义变量进行条件测试 (version2.9版本后被移出,无法使用) 

⑤迭代


一、playbooks 概述以及实例操作

1.playbooks 的组成

playbooks 本身由以下各部分组成

·Tasks:任务,即通过 task 调用 ansible 的模板将多个操作组织在一个 playbook 中运行
·Variables:变量
·Templates:模板
·Handlers:处理器,当changed状态条件满足时,(notify)触发执行的操作
·Roles:角色

2.主机清单

ansible默认的主机清单是/etc/ansible/hosts文件
主机清单可以手动设置,也可以通过Dynamic Inventory动态生成
一般主机名使用FQDN

vi /etc/ansible/hosts
[webserver]             #方括号中设置组名
www1.example.org        #定义被监控主机,这边可以是主机名也可以是IP地址
www2.example.org:2222   #冒号后面定义远程连接端口,默认是ssh的22端口

如果是名称类似的主机,可以使用列表的方式标识各个主机

[webserver]
www[01:50].example.org ansible_ssh_user=root ansible_ssh_pass=1

[dbservers]
db-[a:f].example.org   #支持匹配a、b、c.....f

下面是Inventory中变量

主机变量 

vi /etc/ansible/hosts
[webserver]             #方括号中设置组名
www1.example.org        #定义被监控主机,这边可以是主机名也可以是IP地址
www2.example.org:2222   #冒号后面定义远程连接端口,默认是ssh的22端口

②组变量

[servers:vars]
ntp_server=ntp.example.org
nfs_server=nfs.example.org 

③组嵌套

[apache]
http1.example.org
http2.example.org

[nginx]
ngx1.example.org
ngx2.example.org

[webservers:children]
apache
nginx

④inventor 变量参数 

 

二、yaml文件

YAML是一种非标记语言,是用来写配置文件的语言,非常简洁和强大。

YAML语法和其他语言类似,也可以表达散列表,标量等数据结构。

结构通过空格来展示;序列里配置项通过-来代表;Map里的键值用:来分隔;YAML的扩展名为yaml

1.基本语法规则

①大小写敏感
②使用缩进表示层级关系
③缩进时不允许使用Tab键,只允许使用空格。
④缩进的空格数目不重要,只要相同层级的元素左侧对齐就好。

2.YAML支持的数据结构

①对象:键值对的集合,又称为映射(mapping)/ 哈希(hashes)/ 字典(dictionary)

例如: name:Example Developer

②数组:一组按次序排列的值,又称为序列(sequence) / 列表(list) 

例如:- Apple
     - Orange

③纯量:单个的、不可再分的值

例如:number: 12.30
     sure: true 

三、Ansible的脚本–playbook剧本

通过task调用ansible的模板将多个play组织在一个playbook中运行。

1.playbooks本身由以下各部分组成

Task: 任务,即调用模块完成的某操作;
Variables:变量
Templates:模板
Handlers:处理器,当某条件满足时,触发执行的操作;
Roles:角色

2.下面是一个playbook的示例

 - hosts: webserver     #定义的主机组,即应用的主机
   vars:                #定义变量
     http_port: 80
     max_clients: 200
   user: root
   tasks:               #执行的任务
    - name: ensure apache is at the latest version
      yum: name=httpd state=latest
    - name: write the apache config file
      template: src=/srv/httpd.j2 dest=/etc/httpd.conf
      notify:
      - restart apache
    - name: ensure apache is running
      service: name=httpd state=started
    handlers:            #处理器
      - name: restart apache
        service: name=httpd state=restarted

3.执行一个playbook 

ansible-playbook [yaml文件名]
例如: ansible-playbook a.yaml
参数: -k (-ask-pass)用来交互输入ssh密码
     -K(-ask-become-pass)用来交互输入sudo密码
     -u :指定用户

补充命令

ansible-playbook nginx.yaml --syntax-check   #检查yaml文件的语法是否正确
ansible-playbook nginx.yaml --list-task      #检查tasks任务
ansible-playbook nginx.yaml --list-hosts     #检查生效的主机
ansible-playbook nginx.yaml --start-at-task='Copy Nginx.conf'  #指定从某个task开始运行 

4.hosts 和 users 介绍

 - hosts: webserver   #指定主机组,可以是一个或多个组
   remote_user: root  #指定远程主机执行的用户名 

还可以为每个任务定义远程执行用户:

 - hosts: mysql
   remote_user: root
   tasks:
   - name: test connection
     ping:
     remote_user: mysql   #指定远程主机执行tasks的运行用户为mysql

执行playbook时:  ansible-playbook ping.yml -k

5.指定远程主机sudo切换用户

 - hosts: mysql
   remote_user: root
   become: yes         #2.6版本以后的参数,之前是sudo,意思为切换用户运行
   become_user: mysql   #指定sudo用户为mysql
   tasks:
   - name: copy text
     copy: src=/etc/fstab dest=/home/mysql/fstab.bak

执行playbook时: ansible-playbook ping.yml -K

sql执行playbook时:ansible-playbook a.yml -K

  • K用来提权

 

6.tasks列表和action

①Play的主体部分是task列表,task列表中的各任务按次序逐个在hosts中指定的主机上执行,即在所有主机上完成第一个任务后再开始。在运行playbook时 (从上到下执行),如果一个host执行task失败, 整个tasks都会回滚,请修正playbook中的错误,然后重新执行,即Task的目的是使用指定的参数执行模块,而在模块参数中可以使用变量,模块执行时幂等的,这意味着多次执行是安全的,因为其结果一定的。
②每一个task必须有一个名称 name,这样在运行playbook时,从其输出的任务执行信息中可以很好的辨别出是属于哪一个task的。
③定义一个task,常见的格式: ”module: options" 例如: yum: name =httpd
④ansible的自带模块中,command模块和shell模块无需使用key=value格式
示例1:

vim error.yaml
- hosts: webserver
  remote_user: root
  tasks:
   - name: disable selinux
     command: '/sbin/setenforce 0'
   - name: make sure apache is running
     service: name=httpd state=started

 

修改如下

示例2:

- hosts: webserver
  remote_user: root
  tasks:
   - name: disable selinux
     command: '/sbin/setenforce 0'
     ignore_errors: True #忽略错误,强制返回成功
   - name: make sure apache is running
     service: name=httpd state=started

 

针对多个主机节点执行剧本

vim c.yaml
  
- hosts: webserver
  remote_user: root
  tasks:
  - name: remove httpd
    yum: name=httpd state=absent

- hosts: mysql
  remote_user: root
  tasks:
  - name: copy file
    copy: src=/etc/fstab dest=/opt/haha.txt

7.Handlers介绍


Handlers也是一些task的列表,和一般的task并没有什么区别。
是由通知者进行的notify,如果没有被notify,则Handlers不会执行,假如被notify了,则Handlers被执行
不管有多少个通知者进行了notify,等到play中的所有task执行完成之后,handlers也只会被执行一次

示例:

vim handler.yaml
- hosts: webserver
  remote_user: root
  tasks:
   - name: install httpd package
     yum: name=httpd state=latest
   - name: install configuration file for httpd
     copy: src=/root/handler/httpd.conf dest=/etc/httpd/conf/httpd.conf
     notify:
       - restart httpd
   - name: start httpd service
     service: enabled=true name=httpd state=started
  handlers:
   - name: restart httpd
     service: name=httpd state=restarted

 

8.playbook使用变量

①直接在yaml中定义变量{playbook中直接使用变量}

vim e.yml
- hosts: webserver
  remote_user: root
  vars:
    package: httpd
    service: httpd
  tasks:
  - name: install httpd package
    yum: name={ {package}} state=latest
  - name: install configuration file for httpd
    copy: src=/root/handler/httpd.conf dest=/etc/httpd/conf/httpd.conf
    notify:
      - restart httpd
  - name: start httpd service
    service: enabled=true name={ {service}} state=started
  handlers:
  - name: restart httpd
    service: name={ {service}} state=restarted

 

②通过ansible命令参数- e 传递传递 

vim test1.yml
- hosts: mysql
  remote_user: root
  vars:
  - user:
  tasks:
  - name: add new user
    user: name={ {user}}

然后执行命令: ansible-playbook test1.yml -e "user=lisi"
可以执行命令查看:ansible mysql -m shell -a 'cat /etc/shadow |grep "lisi"' 

在执行命令中- e指定一下变量,不然会找不到 

③直接引用一些变量

引用ansible的固定变量

vim test3.yml
- hosts: mysql
  remote_user: root
  tasks:
  - name: copy file
    copy: content="{ {ansible_all_ipv4_addresses}}," dest=/opt/vars.txt

执行命令:ansible-playbook test3.yml
查看vars.txt文件内容:ansible mysql -a 'cat /opt/vars.txt' 

 

引用主机变量

vim /etc/ansible/hosts
在mysql组的主机后面添加如下
[mysql]
192.168.163.200 testvar="163.200" #定义testvar变量的值为163.200

vim test3.yml #添加{ {testvar}}主机变量
- hosts: mysql
  remote_user: root
  tasks:
  - name: copy file
    copy: content="{ {ansible_all_ipv4_addresses}},{ {testvar}}" dest=/opt/vars.txt

执行命令:ansible-playbook test3.yml
查看vars.txt文件内容:ansible mysql -a 'cat /opt/vars.txt' 

 

9.条件测试

如果需要根据变量、facts (setup) 或此前任务的执行结果来作为某task执行与否的前提时要用到条件测试,在Playbook中条件测试使用。在task后添加when子句即可使用条件测试: when子句支持 jinjia2 表达式或语法

 ①单条件判断

 vi when.yml
 - hosts: mysql
   remote_user: root
   tasks:
     - name: "shutdown CentOS"
       command: /sbin/shutdown -h now
       when: ansible_distribution == "CentOS"

②多条件判断 

vi when.yml
 - hosts: mysql
   remote_user: root
   tasks:
   - name: "shut down CentOS 7 systems"
     command: /sbin/shutdown -r now
     when:
     - ansible_distribution == "CentOS"
     - ansible_distribution_major_version == "7"

③组条件判断 

vi when.yml
 - hosts: mysql
   remote_user: root
   tasks:
    - name: "shut down CentOS 6 and Debian 7 systems"
      command: /sbin/shutdown -t now
      when: (ansible_distribution == "CentOS" and ansible_distribution_major_version == "6") or (ansible_distribution == "Debian" and ansible_distribution_major_version == "7")

④自定义变量进行条件测试 (version2.9版本后被移出,无法使用) 

vi when.yml
 - hosts: all 
   vars:
    exist: "True" 
   tasks:
   - name: creaet file
     command: touch /tmp/test.txt
     when: exist | match("True")
     
   - name: delete file
     command: rm -rf /tmp/test.txt
     when: exist | match("False")

⑤迭代

当有需要重复性执行的任务时,可以使用迭代机制。其使用格式为将需要迭代的内容定义为item变量引用,并通过with_items语句指明迭代。

比如下面这个例子 ,重复去创建不同的用户

 - hosts: webserver
   remote_user: root
   tasks:
   - name: "Install Packages"
     yum: name={ { item }} state=latest
     with_items:
     - httpd
     - mysql-server
     - php

也可以自己定义
 - hosts: webserver
   remote_user: root
   tasks:
   - name: "Add users"
     user: name={ { item.name }} state=present groups={ { item.groups }}
     with_items:
      - { name: 'test1', groups: 'wheel'}
      - { name: 'test2', groups: 'root'}

name表示要操作的软件包的名字;
state标识要做什么操作; 
present:默认的,表示为安装;
lastest:安装为最新的版本;
absent:表示删除。

猜你喜欢

转载自blog.csdn.net/weixin_52269501/article/details/130476407
今日推荐