运维自动化之----ansible的playboook的实战案例(5)
4.3 Playbook核心元素Hosts 执行的远程主机列表Tasks 任务集(每个tasks调用的是各种模块)Varlabes 内置变量或自定义变量在playbook中调用Templates 模块,可替换模板文件中的变量并实现一些简单逻辑的文件Handlers 和notify 结合使用,有特定条件触发的操作,满足条件方才执行,否则不执行tags 标签,指定某条件任务执行,用于选择运行playb
4.3 Playbook核心元素
- Hosts 执行的远程主机列表
- Tasks 任务集 (每个tasks调用的是各种模块)
- Varlabes 内置变量或自定义变量在playbook中调用
- Templates 模块,可替换模板文件中的变量并实现一些简单逻辑的文件
- Handlers 和notify 结合使用,有特定条件触发的操作,满足条件方才执行,否则不执行
- tags 标签,指定某条件任务执行,用于选择运行playbook中的部分代码,ansible具有幂等性,ansible具有幂等性,因此会自动跳过没有变化的部分,即便如此,有些代码为测试其确实没有发生变化的时间依然会非常地长,因此,如果确信其没有变化,可以通过tags跳过这些代码片段
4.3.1 hosts 组件
Hosts:playbook中的每一个play的目的都是为了特定主机以某个特定的用户身份执行任务,hosts用于指定要执行指定任务的主机,须事先定义在主机清单中
4.3.2 remote_user组件
remote_user:可用于Host和task中,也可以通过指定其通过sudo的方式在远程主机上执行任务,其可用于play全局某任务,此外,甚至可以在sudo时使用sudo_user指定sudo时切换的用户
- hosts: websrvs #中一行要是不写就是所有主机
remote_user: root
tasks:
- name: test connection
ping:
remote_user: magedu
sudo: yes #默认sudo为root
sudo_user: wang #sudo为wang
4.3.3 task列表和action组件
playbook的主体部分是task_list,task_list 中有一个或多个task按次序逐个在hosts中指定的所有主机上执行,即在所有主机上完成一个task后,在开始第二个task
task的目的是使用指定的参数执行模块,而模块参数中可以使用变量。模块执行是幂等的,这意味着多次执行是安全的,因为其结果均为一致
每个task都应该在其name,用于palybook的执行结果输出,建议其内容能清晰地描述任务执行步骤,如果未提供name,则action的结果将用于输出
task两种格式:
(1)action:modeule arguments
(2)module:arguments ##建议使用
注意::shell和command模块后面跟命令,而非key=value
范例:
--- ##这个不是确定的有一个时候可以不用写
- hosts: websrvs ##指定要控制的主机列表为
remote_user: root ##指定用户为root
tasks: ##指定为tasks格式
- name: install httpd #这些键值对其实也是每个-后面以及其下一行都是表示一个字典
yum: name=httpd #调用的yum模块安装httpd
- name: start httpd
service: name=httpd state=started enabled=yes
4.3.4 其他组件
在任务的状态后运行为changesd时,可通过“notify”通知给相应的handlers
任务可以通过“tags”打标签,可在ansible-playbook命令上使用-t指定进行调用
4.3.5 ShellScripts VS Playbook 案例

4.4 playbook 命令
格式
范例:
4.5 Playbook 初步
4.5.1 利用playbook创建mysql用户
范例:mysql_user.yml
创建的主名是什么 并且他是个系统组 他的gid是什么
create_home指的是创建不创建家目录
——————————
[root@hdss7-11 ~]# cd /data/
[root@hdss7-11 data]# ls
docker dockerfile etc.tar.gz etc.tar.xz os
[root@hdss7-11 data]# mkdir /databak
[root@hdss7-11 data]# mv * /databak/
[root@hdss7-11 data]# mkdir ansible
[root@hdss7-11 data]# cd ansible/
[root@hdss7-11 ansible]# vim create_mysql.yaml
[root@hdss7-11 ansible]# cat create_mysql.yaml
---
#create mysql user and group
- hosts: dbsrvs
remote_user: root
gather_facts: no ##这个可以加也可以不加,不加会搜集新比较慢些
tasks:
- {name: create group, group: name=mysql system=yes gid=306}
- name: create user
user: name=mysql system=yes group=mysql shell=/sbin/nologin create_home=no home=/data/mysql uid=306
[root@hdss7-11 ansible]# ansible dbsrvs --list-hosts
hosts (2):
10.4.7.21
10.4.7.22
检查下yaml的语法是否正确
[root@hdss7-11 ansible]# ansible-playbook -C create_mysql.yaml
PLAY [dbsrvs] **********************************************************************************************************
TASK [create group] ****************************************************************************************************
changed: [10.4.7.22]
changed: [10.4.7.21]
TASK [create user] *****************************************************************************************************
changed: [10.4.7.22]
changed: [10.4.7.21]
PLAY RECAP *************************************************************************************************************
10.4.7.21 : ok=2 changed=2 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
10.4.7.22 : ok=2 changed=2 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
执行命令创建用户
[root@hdss7-11 ansible]# ansible-playbook create_mysql.yaml
执行命令查看是否创建成功
[root@hdss7-11 ansible]# ansible dbsrvs -a 'getent passwd mysql'
10.4.7.22 | CHANGED | rc=0 >>
mysql:x:306:306::/data/mysql:/sbin/nologin
10.4.7.21 | CHANGED | rc=0 >>
mysql:x:306:306::/data/mysql:/sbin/nologin
[root@hdss7-11 ansible]# ansible dbsrvs -a 'id mysql'
10.4.7.22 | CHANGED | rc=0 >>
uid=306(mysql) gid=306(mysql) 组=306(mysql)
10.4.7.21 | CHANGED | rc=0 >>
uid=306(mysql) gid=306(mysql) 组=306(mysql)
4.5.2 利用playbook安装nginx
——————————
范例: install——nginx.yml

——————————
[root@hdss7-11 ansible]# cat install_nginx.yaml
---
# install nginx
- hosts: websrvs
remote_user: root
tasks:
- name: add group nginx
user: name=nginx state=present
- name: add user nginx
user: name=nginx state=present group=nginx
- name: Install Nginx
yum: name=nginx state=present
- name: Start Nginx
service: name=nginx state=started enabled=yes
先检查下80端口是否被启用了,避免端口号冲突
[root@hdss7-11 ansible]# ansible websrvs -a 'ss -ntl |grep 80'
10.4.7.22 | CHANGED | rc=0 >>
LISTEN 0 128 :::8080 :::*
10.4.7.21 | CHANGED | rc=0 >>
LISTEN 0 128 :::8080 :::*
[root@hdss7-11 ansible]#
为了安全我们先把httpd软件卸载掉,命令如下
[root@hdss7-11 ansible]# ansible websrvs -m yum -a 'name=httpd state=absent'
然后进程检查yaml文件和执行安装
##检查的时候可能你的主机没有yum源会没法安装需要提前准备yum源仓库哦
[root@hdss7-11 ansible]# ansible-playbook -C install_nginx.yaml
[root@hdss7-11 ansible]# ansible-playbook install_nginx.yaml
##这里安装的时候细心地你可能会发现创建了nginx的用户但是返回值是绿色的,注意一下就行。。颜色有时候不完全正确
[root@hdss7-11 ansible]# ansible websrvs -a 'ls -l /etc/passwd'
10.4.7.22 | CHANGED | rc=0 >>
-rw-r--r-- 1 root root 2477 8月 13 22:59 /etc/passwd
10.4.7.21 | CHANGED | rc=0 >>
-rw-r--r--. 1 root root 2498 8月 13 22:47 /etc/passwd
查看80 端是否启动了
[root@hdss7-11 ansible]# ansible websrvs -a 'ss -ntl |grep 80'
10.4.7.21 | CHANGED | rc=0 >>
LISTEN 0 128 *:80 *:*
LISTEN 0 128 :::80 :::*
10.4.7.22 | CHANGED | rc=0 >>
LISTEN 0 128 *:80 *:*
LISTEN 0 128 :::80 :::*
nginx的yum源仓库
[root@centos7 yum.repos.d]# ll
total 12
drwxr-xr-x. 2 root root 4096 Aug 13 22:41 bak
-rw-r--r--. 1 root root 1664 Nov 23 2018 CentOS-Base.repo
-rw-r--r--. 1 root root 300 Aug 13 22:47 epel.repo
[root@centos7 yum.repos.d]# cat epel.repo
[epel]
name=Extra Packages for Enterprise Linux 7 - $basearch
#baseurl=http://download.fedoraproject.org/pub/epel/7/$basearch
metalink=https://mirrors.fedoraproject.org/metalink?repo=epel-7&arch=$basearch
failovermethod=priority
enabled=1
gpgcheck=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7
这个时候能看下浏览器了
都是下图说明正确,因为是用centos安装的,,,有时候报错检查自己的防火墙 systemctl status firewalld

如果想换成你自定义的页面也是可以的
先到21或22上检查nginx的html的所在位置
rpm -ql nginx
rpm -ql nginx |grep html
然后我们可以更改自己定义安装的yaml文件
[root@hdss7-11 ansible]# vim install_nginx.yaml
[root@hdss7-11 ansible]# cat install_nginx.yaml
---
# install nginx
- hosts: websrvs
remote_user: root
gather_facts: no
tasks:
- name: add group nginx
user: name=nginx state=present
- name: add user nginx
user: name=nginx state=present group=nginx
- name: Install Nginx
yum: name=nginx state=present
- name: html page ##新增
copy: src=files/index.html dest=/usr/share/nginx/html/index.html ##新增
- name: Start Nginx
service: name=nginx state=started enabled=yes
[root@hdss7-11 ansible]# mkdir files
[root@hdss7-11 ansible]# vi files/index.html
[root@hdss7-11 ansible]# cat files/index.html
<h1>welcome to yunduankeji </h1>
[root@hdss7-11 ansible]# ansible-playbook install_nginx.yaml
##执行的时候你会发现之前执行过的这里不会在执行了,因为自动发现机制和幂等性概念

去看页面是否改变了
4.5.3 利用playbook安装和卸载httpd
范例: install_httpd.yml
下面是自己写了一个httpd的配置文件来代替系统自带的配置文件
范例:remove_httpd.yml
——————————
因为我们没有配置文件所以自己先安装一个httpd然后自定义下
[root@hdss7-11 yum.repos.d]# dnf install httpd -y
[root@hdss7-11 ansible]# cp /etc/httpd/conf/httpd.conf files/
[root@hdss7-11 ansible]# vi files/httpd.conf
[root@hdss7-11 ansible]# cat files/httpd.conf |grep 8080
Listen 8080 ##端口改为8080
[root@hdss7-11 ansible]# vim install_httpd.yml
[root@hdss7-11 ansible]# cat install_httpd.yml
---
#install httpd
- hosts: websrvs
remote_user: root
gather_facts: no
tasks:
- name: Install httpd
yum: name=httpd state=present
- name: Install configure file
copy: src=files/httpd.conf dest=/etc/httpd/conf/
- name: web html
copy: src=files/index.html dest=/var/www/html/
- name: start service
service: name=httpd state=started enabled=yes
[root@hdss7-11 ansible]# ansible-playbook -C install_httpd.yml
# 我们可以单独的指定一个ip去安装这样用limit命令
[root@hdss7-11 ansible]# ansible-playbook install_httpd.yml --limit 10.4.7.22

可以去观察下效果,记得写端口哦
卸载httpd的yaml文件
[root@hdss7-11 ansible]# ansible-playbook -C remove_httpd.yaml
[root@hdss7-11 ansible]# ansible-playbook remove_httpd.yaml
下面是验证有没有remove的命令
[root@hdss7-11 ansible]# ansible 10.4.7.22 -a "ss -ntl |grep 8080"
10.4.7.22 | FAILED | rc=1 >>
non-zero return code
[root@hdss7-11 ansible]# ansible 10.4.7.22 -a "ls /etc/httpd"
10.4.7.22 | FAILED | rc=2 >>
ls: 无法访问/etc/httpd: 没有那个文件或目录non-zero return code
[root@hdss7-11 ansible]# ansible 10.4.7.22 -a "ls /var/www/html"
10.4.7.22 | CHANGED | rc=0 >>
4.5.4 利用playbook安装mysql
- 范例 : 安装mysql-5.6.46-linux-glibc2.12




上面的这个安装MySQL的包需要事先下载:可以看博客
https://www.cnblogs.com/g2thend/p/11517102.html
或者我这里提供的:
链接:https://pan.baidu.com/s/1p0MbC4thsovXfQdfnWISlg
提取码:5iqz
——————————————
四个文件
[root@hdss7-11 ansible]# vim install_mysql.yml
[root@hdss7-11 ansible]# cat install_mysql.yml
---
# install mysql-5.6.46-linux-glibc2.12-x86_64.tar.gz
- hosts: dbsrvs
remote_user: root
tasks:
- name: install packages
yum: name=libaio,perl-Data-Dumper,perl-Getopt-Long
- name: create mysql group
group: name=mysql gid=306
- name: create mysql user
user: name=mysql uid=306 group=mysql shell=/sbin/nologin system=yes create_home=no home=/data/mysql
- name: copy tar to remote host and file mode
unarchive: src=/data/ansible/files/mysql-5.6.46-linux-glibc2.12-x86_64.tar.gz dest=/usr/local/ owner=root group=root
- name: create linkfile /usr/local/mysql
file: src=/usr/local/mysql-5.6.46-linux-glibc2.12-x86_64 dest=/usr/local/mysql state=link
- name: data dir
shell: chdir=/usr/local/mysql/ ./scripts/mysql_install_db --datadir=/data/mysql --user=mysql
tags: data
- name: config my.cnf
copy: src=/data/ansible/files/my.cnf dest=/etc/my.cnf
- name: service script
shell: /bin/cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld
- name: enable service
shell: /etc/init.d/mysqld start;chkconfig --add mysqld;chkconfig mysqld on
tags: service
- name: PATH variable
copy: content='PATH=/usr/local/mysql/bin:$PATH' dest=/etc/profile.d/mysql.sh
- name: secure script
script: /data/ansible/files/secure_mysql.sh
tags: script
[root@hdss7-11 ansible]# cd files/
[root@hdss7-11 files]# ll
总用量 393740
-rw-r--r--. 1 root root 232 8月 14 01:17 my.cnf
-rw-r--r--. 1 root root 403177622 8月 14 01:11 mysql-5.6.46-linux-glibc2.12-x86_64.tar.gz
-rwxr-xr-x. 1 root root 94 8月 14 01:46 secure_mysql.sh
[root@hdss7-11 files]# vi my.cnf
[root@hdss7-11 files]# cat my.cnf
[mysqld]
socket=/tmp/mysql.sock
user=mysql
symbolic-links=0
datadir=/data/mysql
innodb_file_per_table=1
log-bin
pid-file=/data/mysql/mysqld.pid
[client]
port=3306
socket=/tmp/mysql.sock
[mysqld_safe]
log-error=/var/log/mysqld.log
[root@hdss7-11 files]# vi secure_mysql.sh
[root@hdss7-11 files]# chmod +x secure_mysql.sh
[root@hdss7-11 files]# cat secure_mysql.sh
#!/bin/bash
/usr/local/mysql/bin/mysql_secure_installation <<EOF
y
lai123
lai123
y
y
y
y
EOF
最终确认下
[root@hdss7-11 ansible]# tree /data/ansible/files/
/data/ansible/files/
├── my.cnf
├── mysql-5.6.46-linux-glibc2.12-x86_64.tar.gz
└── secure_mysql.sh
0 directories, 3 files
然后进行测试查看文件是否正确,,有个报错不用管
[root@hdss7-11 ansible]# ansible-playbook -C install_mysql.yml
PLAY [dbsrvs] **********************************************************************************************************
TASK [Gathering Facts] *************************************************************************************************
ok: [10.4.7.21]
TASK [install packages] ************************************************************************************************
ok: [10.4.7.21]
TASK [create mysql group] **********************************************************************************************
ok: [10.4.7.21]
TASK [create mysql user] ***********************************************************************************************
ok: [10.4.7.21]
TASK [copy tar to remote host and file mode] ***************************************************************************
skipping: [10.4.7.21]
TASK [create linkfile /usr/local/mysql] ********************************************************************************
fatal: [10.4.7.21]: FAILED! => {"changed": false, "msg": "src file does not exist, use \"force=yes\" if you really want "/usr/local/mysql-5.6.46-linux-glibc2.12-x86_64"}
PLAY RECAP *************************************************************************************************************
10.4.7.21 : ok=4 changed=0 unreachable=0 failed=1 skipped=1 rescued=0 ignored=0
[root@hdss7-11 ansible]# ansible-playbook install_mysql.yml
执行安装的时候可以到被安装的主机上查看下相关的命令,安装过程显示
ls /usr/local/
du -sh .ansible/
tree .ansible/
ls /usr/local/
ll /usr/local/
更多推荐




所有评论(0)