文章引导
前言
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
- 创建名为
test.yaml
文件并输入以下内容然后保存退出。
--- #表示play开始
- hosts: all #需要执行的组或者主机
remote_user: root #使用root账户
tasks:
- ping: #模块:模块参数 注意没有参数 冒号和空格也不能省略
- setup: "filter=ansible_*_mb"
- 执行
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模块进行对用户创建的操作
- 给主机添加用户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
- 用户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/
- 按照上述
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,启动服务并开启自启。
- 通过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版本
- 使用
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
- 使用
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 !!!!!
- 使用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
- 通过
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
- 使用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里使用变量
- 编写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