• playbook 是什么?

– playbook 是 ansible 用于配置,部署,和管理托管主机
 剧本。通过 playbook 的详细描述,执行其中的一系列
 tasks,可以让远端主机达到预期的状态。
– 也可以这么理解,playbook 字面意思,即剧本,现实中
 由演员按照剧本表演,在 Ansible 中由计算机进行表
 演,由计算机安装,部署应用,提供对外服务,以及组织
 计算机处理各种各样的事情playbook是什么

• 为什么要使用playbook

 – 执行一些简单的任务,使用ad-hoc命令可以方便的解决
 问题,但是有时一个设施过于复杂,需要大量的操作时候,
 执行的 ad-hoc 命令是不适合的,这时最好使用playbook,
 就像执行 shell 命令与写 shell 脚本一样,也可以理解为
 批处理任务
– 使用 playbook 你可以方便的重用编写的代码,可以移
 植到不同的机器上面,像函数一样,最大化的利用代码
 在使用 Ansible 的过程中,你也会发现,你所处理的大
 部分操作都是编写 playbookplaybook语法基础

• playbook 语法格式

– playbook由 YAML 语言编写,遵循 YAML 标准
– 在同一行中,#之后的内容表示注释
– 同一个列表中的元素应该保持相同的缩进
– playbook 由一个或多个 play 组成
– play 中 hosts,variables,roles,tasks 等对象的表示
方法都是键值中间以 “: ” 分隔表示
– YAML 还有一个小的怪癖. 所有的 YAML 文件开始行都
应该是 —. 这是 YAML 格式的一部分, 表明一个文件的
开始playbook语法基础

• playbook 构成

– Target: 定义将要执行 playbook 的远程主机组
– Variable: 定义 playbook 运行时需要使用的变量
– Tasks: 定义将要在远程主机上执行的任务列表
– Handler: 定义 task 执行完成以后需要调用的任务playbook语法基础

• Playbook执行结果

• 使用 ansible-playbook 运行playbook文件,得到输
出内容为 JSON 格式。并且由不同颜色组成,便于识
别。一般而言
• 绿色代表执行成功
*代表系统代表系统状态发生改变
• 红色代表执行失败playbook语法基础
• 第一个playbook

- hosts: all
  remote_user: root
  tasks:
# 第一行,表示开始
– hosts 行的内容是一个或多个组或主机的 patterns,以
逗号为分隔符
– remote_user 就是账户名
– tasks
– 每一个 play 包含了一个 task 列表(任务列表).
– 一个 task 在其所对应的所有主机上(通过 host
pattern 匹配的所有主机)执行完毕之后,下一个 task
才会执行.
– 有一点需要明白的是(很重要),在一个 play 之中,
所有 hosts 会获取相同的任务指令,这是 play 的一个
目的所在,也就是将一组选出的 hosts 映射到 task,执
行相同的操作playbook语法基础


使用方法

环境准备
6台机器 
  1 ansible  管理机器 
  2 web1  托管机器 
  3 web2  托管机器 
  4 db1    托管机器 
  5 db2    托管机器 
  6 cache   托管机器安装
[root@ansible ~]# yum repolist 
 [root@ansible ~]# yum install -y ansible安装完成以后执行,没有报错,正确显示版本即可
ansible –version 
 ansible 2.4.2.0 
 config file = /etc/ansible/ansible.cfg 
 configured module search path = [u’/root/.ansible/plugins/modules’, u’/usr/share/ansible/plugins/modules’] 
 ansible python module location = /usr/lib/python2.7/site-packages/ansible 
 executable location = /usr/bin/ansible 
 python version = 2.7.5 (default, Aug 4 2017, 00:39:18) [GCC 4.8.5 20150623 (Red Hat 4.8.5-16)]配置本地解析
[root@ansible ~]# cat /etc/hosts 
 192.168.1.1 ansible 
 192.168.1.2 web1 
 192.168.1.3 web2 
 192.168.1.4 db1 
 192.168.1.5 db2 
 192.168.1.6 cache
ansible.cfg 中 inventony 指定主机分组文件的路径和地址,默认分组文件 hosts

hosts 的配置    //在配置文件最后添加

[root@ansible ~]# vim /etc/ansible/hosts
[web]
web1
web2

[db]
db[1:2]         //意思是db1到db2

[other]
cache

[other]
cache ansible_ssh_user="root" ansible_ssh_pass="123"
修改配置文件

[root@ansible ~]# vim /etc/ansible/ansible.cfg
61 host_key_checking = False //去掉注释

测试结果
[root@ansible ~]# ansible cache -m ping           //测试结果 成功结果如下
cache | SUCCESS => {
    "changed": false, 
    "ping": "pong"
}
添加子组
[root@ansible ansible]# vim /etc/ansible/hosts

[app:children]          //添加子组  app包含db和web部分
db
web

[web:vars]              
ansible_ssh_user="root"
ansible_ssh_pass="123"
• 列出要执行的主机,不执行任何操作
ansible all –list-hosts
• 批量检测主机
ansible all -m ping
• 批量执行命令
ansible all -m command -a ‘命令’ -k
• 自定义配置文件
– 创建任意文件夹 
 – 在文件夹里面创建配置文件 ansible.cfg 
 [defaults] 
 inventory = myhosts //指定文件 
 host_key_checking = False

- 在文件夹里创建主机文件

[root@ansible ooxx]# vim myhosts
[app1]
web1
db1

[app2]
web2
db2

[app]
cache

给所有主机部署密钥

创建密钥

[root@ansible ~]# ssh-keygen -t rsa -b 2048 -N ''

给所有主机发送密钥

[root@ansible ~]# cd /root/.ssh/
[root@ansible .ssh]# ansible all -m authorized_key -a "user=root exclusive=true manage_dir=true key='$(< /root/.ssh/id_rsa.pub)'" -k

案例

为web1安装Apache
并把监听端口改为8080
设置默认主页 hello world
启动服务,并设置为开机自启

- hosts: web1
  remote_user: root
  tasks:
        - name: install the latest version of Apache
          yum:
            name: httpd
            state: installed
        - lineinfile:
            path: /etc/httpd/conf/httpd.conf
            regexp: "^Listen"
            line: "Listen 8080"
        - shell: echo "hello world" > index.html
          args:
            chdir: /var/www/html
        - service:
            name: "httpd"
            enabled: yes
            state: started

为cache添加用户jj
把123456设置为默认密码,并使用密码过滤器
使该用户第一次登录强制修改密码

---
- hosts: cache
  remote_user: root
  vars:
    username: "jj"
  tasks:
    - user:
        name: "{{username}}"
        password: "{{'123456' |password_hash('sha512')}}"
    - shell: chage -d 0 "{{username}}"

密码过滤器:
password_hash(‘sha512’)


为web添加用户zhang3
并使用忽略错误,避免用户存在 停止脚本 //当返回值为1时,停止运行
默认密码为123123
使该用户第一次登录时强制修改密码

---
- hosts: web
  remote_user: root
  vars:
    username: "zhang3"
  tasks:
    - shell: useradd "{{username}}"
      ignore_errors: True
    - shell: echo 123123 |passwd --stdin "{{username}}"
    - shell: chage -d 0 "{{username}}"

为cache安装httpd
修改配置文件 把ServerName改为localhost
修改配置文件 把监听端口改为8080
设置默认网页 hello world
利用handlers 在配置Apache时自动重启

---
  - hosts: cache
    remote_user: root
    tasks:
      - name: install the latest version of Apache
        yum:
          name: httpd
          state: installed
        notify:
          - boot start
          - restart httpd
      - lineinfile:
          path: /etc/httpd/conf/httpd.conf
          regexp: "^Listen"
          line: "Listen 8080"
        notify:
          - restart httpd
      - lineinfile:
          path: /etc/httpd/conf/httpd.conf
          regexp: "^#ServerName"
          line: "ServerName localhost"
        notify:
          - restart httpd
      - shell: echo "hello world" > index.html
        args:
          chdir: /var/www/html
    handlers:
      - name: restart httpd
        service:
          name: httpd
          state: restarted
      - name: boot start
        service:
          name: httpd
          enabled: yes

循环添加多用户

---
  - hosts: db2
    remote_user: root
    tasks:
      - name: creater user
        user:
          name: "{{item.name}}"
          password: "{{item.pwd |password_hash('sha512')}}"
          group: "{{item.group}}"
        with_items:
          - { name:"nb",pwd:"aa",group:"a" }
          - { name:"dd",pwd:"bb",group:"b" }
          - { name:"cc",pwd:"cc",group:"c" }
          - { name:"xx",pwd:"dd",group:"d" }

把系统平均负载高于0.7的web服务器停掉

---
- hosts: web
  remote_user: root
  tasks:
    - shell: uptime | awk '{printf("%.2f",$(NF-2))}'
      register: result
    - service: name=httpd state=stopped
      when: result.stdout |float > 0.7
#追加 debug 调试信息
#   - name: Show debug info
#     debug: var=ooxx

~
“`