Bootstrap

Ansible入门教程----playbook基础(三)

文章引导

前言
基础命令语法
示例

前言

playbook是ansible用于配置、部署和管理托管主机,playbook是由一个或多个play组成的列表,执行一系列tasks,task本质也是调用ansible的模块(modules)可以让远端主机达到设定的状态。 因为一些简单的任务会有ad-hoc命令解决,但过于复杂时,就需要使用playbook了。

基础命令语法

playbook语法格式
 - playbook由yaml语言编写,遵循yaml语法规则标准
 - 在同一行中,#就代表注释了
 - 列表中的同一级类元素应保存相同的缩进
 - playbook由一个或者多个play组成的
 - play中对象表示方法都以键值表示(用:表示)
 - yaml中 --- 表示内容分割,表示上下不同的play分割

playbook关键字
 - hosts 定义将要执行playbook的远程主机组
 - vars 定义playbook运行时需要使用的变量
 - tasks 定义将要在远程主机上执行的任务列表
 - handlers 定义task执行完成后需要调用的任务

playbook执行结果
使用ansible-playbook运行playbook文件,输出内容为JSON格式,由不同颜色组成来区分执行结果
 - 绿色代表执行成功
 - ***代表系统状态发现改变
 - 红色代表执行失败

playbook示例
 --- 		#第一行,表示开始了
 - hosts: all
   remote_user: root
   tasks:
     - ping:
- hosts 是一个(多个)组或者主机的pattens,比逗号分开
- remote_user 使用的账户名
执行命令:ansible-playbook test.yaml -f 5
- -f并发进程数量,默认为5

示例

一:简单执行yaml

  1. 创建名为test.yaml文件并输入以下内容然后保存退出。
---             #表示play开始
- hosts: all    #需要执行的组或者主机
  remote_user: root     #使用root账户
  tasks:
    - ping:     #模块:模块参数 注意没有参数 冒号和空格也不能省略
    - setup: "filter=ansible_*_mb"
  1. 执行test.yaml,这里没有指定-f 5 因为默认就为5,可以自定义多少次。

[root@ks8-master home]# ansible-playbook test.yaml

PLAY [all] *******************************************************************************************************************

TASK [Gathering Facts] *******************************************************************************************************
ok: [k8s-node3]
ok: [k8s-node2]
ok: [k8s-node1]

TASK [ping] ******************************************************************************************************************
ok: [k8s-node3]
ok: [k8s-node2]
ok: [k8s-node1]

TASK [setup] *****************************************************************************************************************
ok: [k8s-node3]
ok: [k8s-node1]
ok: [k8s-node2]

PLAY RECAP *******************************************************************************************************************
k8s-node1                  : ok=3    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
k8s-node2                  : ok=3    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
k8s-node3                  : ok=3    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

二:使用user模块进行对用户创建的操作

  1. 给主机添加用户test1,设置密码为123,并把用户test1添加到users组。
    注意:凡是tasks下的第一行为- name的全是注释和说明,不是参数。模块中name才是参数,模块外注释和说明,EXAMPLES中的第一行- name也是注释和说明,如下图所示。注释和说明是和模块名字是同级别的。
##因为我们不知道语法是什么,所有推荐使用ansible-doc user 查找EXAMPLES(例子)。
[root@ks8-master ~]# ansible-doc user
... ...
EXAMPLES:
- name: Add the user 'johnd' with a specific uid and a primary group of 'admin'
  user:
    name: johnd
    comment: John Doe
    uid: 1040
    group: admin

- name: Add the user 'james' with a bash shell, appending the group 'admins' and 'developers' to the user's groups
  user:
    name: james
    shell: /bin/bash
    groups: admins,developers
    append: yes
  1. 用户shell模块,还是一样用ansible-doc shell查看语法。
[root@ks8-master home]# ansible-doc shell
......
EXAMPLES:
- name: Execute the command in remote shell; stdout goes to the specified file on the remote.
  shell: somescript.sh >> somelog.txt

- name: Change the working directory to somedir/ before executing the command.
  shell: somescript.sh >> somelog.txt
  args:
    chdir: somedir/

  1. 按照上述users、shell命模块给的示例,编写并执行playbook。
[root@ks8-master home]# vim user.yaml

---
- hosts: k8s-node1       #操作的节点
  remote_user: root      #使用root用户
  tasks:                  #执行任务模块
    - user:               #使用user模块
        name: test1       #命名一个用户为test1
        comment: John Doe #这个是对用户的注释,可以不需要,也可以留着
        uid: 1040         #对用户的uid没有要求,也可以注释
        group: users      #用户属于users组
    - shell: echo 123 | passwd --stdin test1  #通过shell命令给test1用户设置密码

##执行playbook
[root@ks8-master home]# ansible-playbook user.yaml

PLAY [k8s-node1] *************************************************************************************************************

TASK [Gathering Facts] *******************************************************************************************************
ok: [k8s-node1]

TASK [user] ******************************************************************************************************************
ok: [k8s-node1]

TASK [shell] *****************************************************************************************************************
changed: [k8s-node1]

PLAY RECAP *******************************************************************************************************************
k8s-node1                  : ok=3    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

##使用shell命令查看节点上的用户
[root@ks8-master home]# ansible k8s-node1 -m shell -a "cat /etc/passwd | grep test1"
k8s-node1 | CHANGED | rc=0 >>
test1:x:1040:100:John Doe:/home/test1:/bin/bash

三:安装Apache,修改配置文件的监听端口为8080,设置默认主页为hello world,启动服务并开启自启。

  1. 通过ansible-doc yum给的示例,来进行安装httpd
[root@ansible ~]# ansible-doc yum
EXAMPLES:
- name: install the latest version of Apache
  yum:
    name: httpd
    state: latest

##编写安装的yaml文件。
[root@ansible ~]# vim httpd.yaml
---
  - hosts: yun          #主机组
    remote_user: root   #使用账户
    tasks:
      - name: 开始apache服务httpd   #注释用于查看进度j
        yum:                        #使用yum模块
          name: httpd               #安装httpd服务
          state: latest             #latest版本
  1. 使用lineinfile模块,来修改配置文件(相当于sed命令)
##查看命令示例,有现成的之间复制粘贴就行
[root@ansible ~]# ansible-doc lineinfile
EXAMPLES:
# NOTE: Before 2.3, option 'dest', 'destfile' or 'name' was used instead of 'path'
- name: Ensure the default Apache port is 8080
  lineinfile:
    path: /etc/httpd/conf/httpd.conf
    regexp: '^Listen '
    insertafter: '^#Listen '
    line: Listen 8080

##编写安装的yaml文件。
[root@ansible ~]# vim httpd.yaml
---
  - hosts: yun          #主机组
    remote_user: root   #使用账户
    tasks:
      - name: 开始apache服务httpd   #注释用于查看进度j
        yum:                        #使用yum模块
          name: httpd               #安装httpd服务
          state: latest             #latest版本
      - name: Ensure the default Apache port is 8080
        lineinfile:
          path: /etc/httpd/conf/httpd.conf
          regexp: '^Listen '
          insertafter: '^#Listen '
          line: Listen 8080
  1. 使用copy模块,进行显示主页替换
[root@ansible ~]# ansible-doc copy
EXAMPLES:
- name: Copy file with owner and permissions
  copy:
    src: /srv/myfiles/foo.conf
    dest: /etc/foo.conf
    owner: foo
    group: foo
    mode: '0644'

##编写yaml文件
[root@ansible ~]# vim httpd.yaml
---
  - hosts: yun          #主机组
    remote_user: root   #使用账户
    tasks:
      - name: 开始apache服务httpd   #注释用于查看进度j
        yum:                        #使用yum模块
          name: httpd               #安装httpd服务
          state: latest             #latest版本
      - name: Ensure the default Apache port is 8080
        lineinfile:
          path: /etc/httpd/conf/httpd.conf
          regexp: '^Listen '
          insertafter: '^#Listen '
          line: Listen 8080
      - name: copy文件到主机
        copy:
          src: /root/index.html        #源端文件
          dest: /var/www/html/index.html    #目标地址文件
          owner: root            #文件权限属性
          group: root            #属于组
          mode: 644

#准备index.html文件
[root@ansible ~]# vim index.html
hello word !!!!
ansible test !!!!!
  1. 使用service模块,启动httpd服务和设置自启动
##查看示例
[root@ansible ~]# ansible-doc service
EXAMPLES:
- name: Start service httpd, if not started
  service:
    name: httpd
    state: started
- name: Enable service httpd, and not touch the state
  service:
    name: httpd
    enabled: yes

##编写yaml
[root@ansible ~]# vim httpd.yaml
---
  - hosts: yun          #主机组
    remote_user: root   #使用账户
    tasks:
      - name: 开始apache服务httpd   #注释用于查看进度j
        yum:                        #使用yum模块
          name: httpd               #安装httpd服务
          state: latest             #latest版本
      - name: Ensure the default Apache port is 8080
        lineinfile:
          path: /etc/httpd/conf/httpd.conf
          regexp: '^Listen '
          insertafter: '^#Listen '
          line: Listen 8080
      - name: copy文件到主机
        copy:
          src: /root/index.html        #源端文件
          dest: /var/www/html/index.html    #目标地址文件
          owner: root            #文件权限属性
          group: root            #属于组
          mode: 644
      - name: 设置自启动和启动服务
        service:
          name: httpd
          enabled: yes
          state: started
  1. 通过plyabook运行yaml文件
[root@ansible ~]# ansible-playbook httpd.yaml
[root@ansible ~]# ansible-playbook httpd.yaml

PLAY [yun] *******************************************************************************************************************

TASK [Gathering Facts] *******************************************************************************************************
ok: [db1]
ok: [web1]
ok: [web2]

TASK [开始apache服务httpd] *******************************************************************************************************
changed: [web2]
changed: [db1]
changed: [web1]

TASK [Ensure the default Apache port is 8080] ********************************************************************************
changed: [db1]
changed: [web1]
changed: [web2]

TASK [copy文件到主机] *************************************************************************************************************
changed: [db1]
changed: [web1]
changed: [web2]

TASK [设置自启动和启动服务] ************************************************************************************************************
changed: [db1]
changed: [web2]
changed: [web1]

PLAY RECAP *******************************************************************************************************************
db1                        : ok=5    changed=4    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
web1                       : ok=5    changed=4    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
web2                       : ok=5    changed=4    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
  1. 使用uri模块,检查是否成功
##先查看示例
[root@ansible ~]# ansible-doc uri
EXAMPLES:
- name: Check that you can connect (GET) to a page and it returns a status 200
  uri:
    url: http://www.example.com

##执行命令
[root@ansible ~]# ansible yun -m uri -a url='http://127.0.0.1:8080'
db1 | SUCCESS => {
    "accept_ranges": "bytes",
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    },
    "changed": false,
    "connection": "close",
    "content_length": "36",
    "content_type": "text/html; charset=UTF-8",
    "cookies": {},
    "cookies_string": "",
    "date": "Wed, 28 Jun 2023 08:59:21 GMT",
    "elapsed": 0,
    "etag": "\"24-5ff2cbc3f3071\"",
    "last_modified": "Wed, 28 Jun 2023 08:54:45 GMT",
    "msg": "OK (36 bytes)",
    "redirected": false,
    "server": "Apache/2.4.6 (CentOS)",
    "status": 200,
    "url": "http://127.0.0.1:8080"
}
web2 | SUCCESS => {
    "accept_ranges": "bytes",
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    },
    "changed": false,
    "connection": "close",
    "content_length": "36",
    "content_type": "text/html; charset=UTF-8",
    "cookies": {},
    "cookies_string": "",
    "date": "Wed, 28 Jun 2023 08:59:21 GMT",
    "elapsed": 0,
    "etag": "\"24-5ff2cbc3f8151\"",
    "last_modified": "Wed, 28 Jun 2023 08:54:45 GMT",
    "msg": "OK (36 bytes)",
    "redirected": false,
    "server": "Apache/2.4.6 (CentOS)",
    "status": 200,
    "url": "http://127.0.0.1:8080"
}
web1 | SUCCESS => {
    "accept_ranges": "bytes",
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    },
    "changed": false,
    "connection": "close",
    "content_length": "36",
    "content_type": "text/html; charset=UTF-8",
    "cookies": {},
    "cookies_string": "",
    "date": "Wed, 28 Jun 2023 08:59:21 GMT",
    "elapsed": 0,
    "etag": "\"24-5ff2cbc3f6842\"",
    "last_modified": "Wed, 28 Jun 2023 08:54:45 GMT",
    "msg": "OK (36 bytes)",
    "redirected": false,
    "server": "Apache/2.4.6 (CentOS)",
    "status": 200,
    "url": "http://127.0.0.1:8080"
}

四:在playbook里使用变量

  1. 编写yaml
[root@ansible ~]# vim service.yaml
---
- hosts: yun
  remote_user: root
  vars:         #定义变量关键字
    service: httpd        #所有变量要在vars里面,遵循变量的键值对key:value规范。
  tasks:
    - name: stop httpd   #注释
      service:
        name: "{{service}}" #引用变量
        state: stopped

##执行yaml
[root@ansible ~]# ansible-playbook service.yaml

PLAY [yun] *******************************************************************************************************************

TASK [Gathering Facts] *******************************************************************************************************
ok: [db1]
ok: [web2]
ok: [web1]

TASK [stop httpd] ************************************************************************************************************
changed: [web2]
changed: [web1]
changed: [db1]

PLAY RECAP *******************************************************************************************************************
db1                        : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
web1                       : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
web2                       : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

#验证是否关闭
[root@ansible ~]# ansible yun -m shell -a 'systemctl status httpd | grep Active'
db1 | CHANGED | rc=0 >>
   Active: inactive (dead) since 三 2023-06-28 17:20:49 CST; 55s ago
web1 | CHANGED | rc=0 >>
   Active: inactive (dead) since 三 2023-06-28 17:20:49 CST; 55s ago
web2 | CHANGED | rc=0 >>
   Active: inactive (dead) since 三 2023-06-28 17:20:49 CST; 55s ago
;