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 813 22:59 /etc/passwd
10.4.7.21 | CHANGED | rc=0 >>
-rw-r--r--. 1 root root 2498 813 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 814 01:17 my.cnf
-rw-r--r--. 1 root root 403177622 814 01:11 mysql-5.6.46-linux-glibc2.12-x86_64.tar.gz
-rwxr-xr-x. 1 root root        94 814 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/

Logo

一站式 AI 云服务平台

更多推荐