ansible使用-playbook剧本模式

playbook简介

playbook是一个由yml语法编写的文本文件,它由play和task两部分组成。

play: 主要定义要操作主机或者主机组
task: 主要定义对主机或主机组具体执行的任务,可以是一个任务,也可以是多个任务

playbook简单理解就是把ad-hoc多个模块都统一写到一个文件里面,然后根据自己的需求来自定义编排要使用哪些功能,第一步使用哪些功能,第二步使用哪些功能……
Playbook通过yaml语法识别描述的状态文件,扩展名是yaml。

yamI三板斧
缩进:       yaml使用一个固定的缩进风格表示层级结构,每个缩进由两个空格组成,不能使用tab键
冒号:       以冒号结尾的除外,其他所有冒号后面所有必须有空格。
短横线:   表示列表项,使用一个短横线加一个空格作为一个列表项,多个项使用同样的缩进级别作为同一列表。

#比如我们写了一个yaml文件

vim apache_install.yaml

#文件内容如下:

#这是一个ansible的playbook
#第一步: 找到谁,hosts: 定义主机清单,ansible的hosts文件里定义的主机清单模块名
#第二步: 大概做的任务: 安装,配置,启动
#第三步: 具体怎么做
#name:              描述信息,task里有3个同级别的列表步骤
#yum:                远端安装服务,yum模块安装服务(installed)
#copy:               远端拷贝文件,copy模块传送文件到远端
#service:            远端启动服务(started)
#remote user:    root 是指定远程主机上使用的用户
#gather facts:     no 是默认执行playbook时候,默认会收集目标主机的信息,禁用掉能提高效率

- hosts: test                   #第一行,定义主机清单test
  remote user: root        #第二行写入就需要空两个空格,表示本行内容属于上面第一行
  gather facts: no           #注意冒号后面都需空格,以冒号为变量定义相关内容
  tasks:
    - name: install apache fuwu                 #一个横杆+一个空格代表一个任务
      yum: name=apache,apache-tools state=installed           #调用yum模块
    - name: configure apache fuwu            #第二个任务
      copy: src=/root/apache.conf dest=/etc/apache/conf/apache.conf              #调用copy模块

      notify: Restart apache fuwu               #重启定义的apache服务

    - name: create share data directory     #创建一个共享目录,file模块创建目录赋予权限

      file: path=/data state=directory recurse=yes owner=root group=root mode=755

    - name: qidong apache fuwu                #第三个任务
      service: name=apache state=started enabled=yes                            #调用service模块

  handlers:

    - name: Restart apache fuwu                #名字定义为重启Apache服务

      service: name=apache state=restarted   #调用service服务,名字是apache,任务是重启

ansible-playbook常用命令

#执行yaml文件,格式:ansible-playbook "yaml文件"

ansible-playbook apache_install.yaml

#检查语法是否错误,格式:ansible-playbook --syntax-check "yaml文件"

ansible-playbook --syntax-check apache_install.yaml

#模拟执行,不是真的直接执行,格式:ansible-playbook -C  "yaml文件"

ansible-playbook -C apache_install.yaml

案例:批量安装源码nginx服务

#编写一个yaml文件

vim nginx.yaml

#输入以下内容

#test: 为/etc/ansible/hosts中的主机列表    #task: 执行的任务

#name: 描述信息                                        #yum: yum模块,安装服务的
#copy: copy模块,远程传递文件的               #file: file模块,远程创建目录的
#service: service模块,远程管理服务的
#remote_user: root 是指定远程主机上使用的用户
#gather_facts: no 是默认执行playbook时候,默认会收集目标主机的信息,禁用掉能提高效率

#使用前先将相关软件包: nginx压缩包和jdk压缩包上传到/root/ansible-playbook-nginx/目录中
- hosts: test
  remote user: root
  gather_facts: no
  vars:                              #定义变量,为变量赋值,方便后期修改升级,后期只需修改此处
    src_nginx: /root/ansible-playbook-nginx/nginx-1.23.3.tar.gz        #安装包在哪里
    nginx_jieya_dir: /usr/local                                #解压后的路径在哪里,解压到远端local下
    nginx_install_dir: /usr/local/nginx                                                  #安装在哪里
    nginx_jieyahou_name: nginx-1.23.3
  tasks:

    #上传nginx压缩安装包到: /root/ansible-playbook-nginx/,提前操作

    #安装编译工具和相关依赖
    #- name: Install gcc gcc-c++ and yilai
    #   yum: name={{ item }} state=installed
    #   with items:
    #   - gcc
    #   - gcc-c++
    #   - openssI-devel
    #   - openssl
    #   - zlib
    #   - zlib-devel

    #   - pcre

    #   - pcre-devel

#注意:下面yum安装依赖方式也可用上面方式安装
#安装编译工具和相关依赖

  - name: Install gcc gcc-c++ and yilai
    yum: name=gcc,gcc-c++,openssl-devel,openssl,zlib,zlib-devel,pcre,pcre-devel,vim,wget state=installed

  #解压nginx压缩包
  - name: Unarchive nginx package
    unarchive:                               #调用unarchive模块解压
      src: "{{ src_nginx }}"              #调用上面的src_nginx变量

      dest: "{{ nginx_jieya_dir }}"   #调用上面nginx_jieya_dir变量,解压后的路径
  #配置编译nginx
  - name: config and bianyi nginx

    shell: useradd -s /sbin/nologin nginx &&           #远程执行命令,创建一个用户

           cd {{ nginx_jieya_dir }} &&                          #进入到这个解压目录

           cd {{ nginx_jieyahou_name }} &&                #nginx解压后的名称
            ./configure --user=nginx --group=nginx --prefix={{ nginx_install_dir }} --with-http_stub_status_module --with-http_ssl_module

&&
            make && make install                                 #进行安装
  #启动nginx
  - name: Start nginx
    shell: /usr/local/nginx/sbin/nginx
  #注意上面解压也可用另一种方式: shell命令
  #- name: Unarchive tomcat package
  #  copy: src=/root/ansible-playbook-deploy-tomcat/apache-tomcat-8.0.32.tar.gz dest=/tmp)
  #- name: Unarchive tomcat
  #  shell: cd /tmp && tar -zxf apache-tomcat-8.0.32.tar.gz

案例2:远程批量安装二进制tomcat服务

#编写一个yaml文件

vim tomcat.yaml

#输入以下内容

#test: 为/etc/ansible/hosts中的主机列表        #task: 执行的任务

#name: 描述信息                                           #yum: yum模块,安装服务的
#copy: copy模块,远程传递文件的                  #file: file模块,远程创建目录的

#service: service模块,远程管理服务的

#remote user: root 是指定远程主机上使用的用户

#gather_facts: no 是默认执行playbook时候,默认会收集目标主机的信息,禁用掉能提高效率

#使用前先将相关软件包: tomcat压缩包和jdk压缩包上传到/root/ansible-playbook-tomcat/目录中

- hosts: test
  remote_user: root
  gather_facts: no
  vars:
    src_jdk: /root/ansible-playbook-tomcat/jdk-8u65-linux-x64.gz
    jdk_install_dir: /usr/local/
    jdk_jieyahou_name: jdk1.8.0_65
    src_tomcat: /root/ansible-playbook-tomcat/apache-tomcat-8.0.32.tar.gz
    tomcat_install_dir: /usr/local/
    tomcat_jieyahou_name: apache-tomcat-8.0.32

  tasks:
    #上传jdk压缩安装包到: /root/ansible-playbook-tomcat/,提前操作

    #解压idk压缩包
  - name: Unarchive jdk package
    unarchive:
      src: "{{ src_jdk }}"
      dest: "{{ jdk_install_dir }}"
    #配置idk环境变量
  - name: set jdk global env

    shell: echo '"export JAVA_HOME=/usr/local/{{ jdk_jieyahou_name }}"' >> ~/.bashrc &&

             echo "'export PATH=$JAVA_HOME/bin:$PATH"' >> ~/.bashrc &&

             echo '"export CLASSPATH=$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar"' >> /.bashrc && source ~/.bashrc              #这上面都是在配置环境变量,将jdk变量设置到相应的全局变量文件里面
  #有yum源时idk也可采用下面方式安装
  #安装idk环境
  #- name: Install jdk1.8
  # yum: name=java-1.8.0-openjdk state=installed
  #上传tomcat软件包到/root/ansible-playbook-deploy-tomcat/目录,提前操作
  #解压tomcat软件包
  - name: Unarchive tomcat package
    unarchive:
      src:  "{{ src_tomcat }}"
      dest: "{{ tomcat_install_dir }}"

  #start tomcat,注意: tomcat首次启动需要用 nohup./startup.sh & 或 nohup./catalina.sh & 启动,如果直接使用/...../tomcat../bin)startup.sh则启动不了
  - name: Start tomcat
    shell: cd "{{ tomcat_install_dir }}" && cd "{{ tomcat_jieyahou_name }}"/bin && nohup./startup.sh &

  #注意上面解压也可用另一种方式: shell命令
  #- name: Unarchive tomcat package

  #  copy: src=/root/ansible-playbook-tomcat/apache-tomcat-8.0.32.tar.gz dest=/tmp/
  #- name: Unarchive tomcat
  #  shell: cd /tmp && tar -zxf apache-tomcat-8.0.32.tar.gz

案例3:远程批量安装二进制mysql5.7服务

#创建一个mysql启动文件,方便统一交给systemd管理

vim mysqlld.service

#输入内容如下

[Unit]
Description=MySQL Server
Documentation=man:mysqld(8)
Documentation=http://dev.mysql.com/doc/refman/en/using-systemd.html
After=network.target

After=syslog.target

[Install]
WantedBy=multi-user.target
[Service]
User=mysql
Group=mysql
ExecStart=/data/mysql5.7/bin/mysqld --defaults-file=/etc/my.cnf

LimitNOFILE = 15000

#创建一个mysql的配置文件

vim mysql.conf

#输入内容如下

[client]
port = 3306
[mysqld]
basedir=/data/mysql5.7/              #指定它的base安装目录是哪个

datadir=/data/mysql5.7/data/       #指定它的数据目录是哪个
user = mysql                                #用户

port = 3306                                   #端口
character-set-server = utf8

collation-server = utf8_general_ci

open_files_limit = 10240
back_log = 600
log-bin=mysql-bin                          #定义它的log-bin,开启log-bin
read_only = 0
expire_logs_days = 8
max_connections = 3000
max_connect_errors = 6000
max_allowed_packet = 32M
thread_cache_size = 300
query_cache_min_res_unit = 2k
transaction_isolation = READ-COMMITTED
tmp_table_size = 256M

max_heap_table_size = 256M

key_buffer_size = 1024M

read_buffer_size = 1M

read_rnd_buffer_size = 16M

bulk_insert_buffer_size = 64M

myisam_sort_buffer_size = 128M

myisam_max_sort_file_size = 6G

group_concat_max_len = 102400

skip-name-resolve
lower_case_table_names = 1

log_error = /data/mysql5.7/log/mysql_error.log

slow_query_log = ON

slow_query_log_file = /data/mysql5.7/log/mysql_slow.log

#socket = /data/mysql5.7/mysql.sock

long_query_time = 3

log_timestamps = SYSTEM
server-id = 2

#replicate_do_db=test_yzc_crm

innodb_buffer_pool_size = 2048M

#innodb_data_file_path = ibdata1:1024M:autoextend

innodb_data_file_path = ibdata1:76M:autoextend

innodb_thread_concurrency = 8

innodb_flush _log_at_trx_commit = 2

innodb_log_buffer_size = 16M

innodb _log_file_size = 128M

innodb_log_files_in_group = 3

innodb_max_dirty_pages_pct = 75

innodb_lock_wait_timeout = 120

innodb_file_per_table = 1

#skip-grant-tables

relay-log=mysql-relay

relay-log-index=mysql-relay.index

relay_log_info_repository=TABLE

[mysqldump]
quick

max_allowed_packet = 32M
[mysqld_safe]
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES

#编写一个yaml文件

vim mysql.yaml

#输入内容如下

#test: 为/etc/ansible/hosts中的主机列表          #task: 执行的任务
#name: 描述信息                                             #yum: yum模块,安装服务的
#copy: copy模块,远程传递文件的                    #file: file模块,远程创建目录的

#service: service模块,远程管理服务的
#remote user: root 是指定远程主机上使用的用户
#qather facts: no 是默认执行playbook时候,默认会收集目标主机的信息,禁用掉能提高效率

#使用前先将相关软件包: mysql压缩包和jdk压缩包上传到/root/ansible-playbook-mysql5.7/目录中

- hosts: test
  remote user: root
  gather facts: no
  vars:
    src_mysql: /root/ansible-playbook-mysql5.7/mysql-5.7.19-linux-glibc2.12-x86_64.tar.gz
    mysql_install_dir: /data/mysql5.7
    mysql_data_dir: /data/mysql5.7/data
    mysql_log_dir: /data/mysql5.7/log                  #日志路径
    mysql_yasuo_package_name: mysql-5.7.19-linux-glibc2.12-x86_64.tar.gz

    mysql_jieyahou_name: mysql-5.7.19-linux-glibc2.12-x86_64
    config_mysql: /root/my.conf                           #conf配置文件路径
    service_mysql: /root/mysqld.service               #service文件路径

tasks:
    #上传mysql压缩安装包到: /root/ansible-playbook-mysql5.7/,提前操作

#安装相关依赖
  - name: yilai
    yum: name=libaio-devel state=installed
  #传输mysql压缩包
  - name: transfer mysql package

    copy: src={{ src_mysql }} dest=/opt/          #拷贝压缩包到指定路径

  #解压mysql压缩包并移动

  - name: Unarchive mysql package

    shell: mkdir /data &&

           cd /opt/ && tar -zxf {{ mysql_yasuo_package_name }} &&    #移动到目录解压压缩包

           mv {{ mysql_jieyahou_name }} {{ mysql_install_dir }}        #解压过后将名字修改移动

  #创建mysql用户,数据目录和日志目录,并设置权限

  - name: create mysgl user log data

    shell: useradd -s /sbin/nologin mysql &&

           mkdir {{ mysql_data_dir }} &&            #创建数据存储目录

           mkdir {{ mysql_log_dir }} &&               #创建日志存储目录

           chown -R mysql.mysql {{ mysql_install_dir }} &&         #对目录进行授权

           echo '"export PATH=/data/mysql5.7/bin/:$PATH"' >> ~/.bashrc &&       #全局变量授权

           source ~/.bashrc
  #准备mysql配置文件,传输过去
  - name: transfer my.conf
    copy: src={{ config_mysql }} dest=/etc        #传输配置文件到远程客户端

#初始化mysql
  - name: init mysql
    shell: mysqld --initialize --user=mysql --basedir={{ mysql_install_dir }} --datadir={{ mysql_data_dir }}

  #准备mysqld.service文件,传输过去,交给systemctl管理服务

  - name: transfer mysqld.service

    copy: src={{ service_mysql }} dest=/etc/systemd/system/    #传输service文件

  #刷新service文件和启动mysgl

  - name: flush service conf
    shell: systemctl daemon-reload &&
              systemctl enable mysqld &&
              systemctl start mysqld

  #修改mysql的登录密码,初始化安装后的mysql,初始密码会在相应日志文件中,mysql_error.log中过滤password可以找出初始密码进行登录
然后登录mysql,使用set password='xx';修改密码

  #下面在脚本中,非交互式登录mysql时,获取不到密码变量的密码,可以手动登录修改密码

#- name: change mysql password wei '123456'

#  shell: init_mysql_pass='cat /data/mysql5.7/log/mysql_error.log | grep password | awk '{print $NF}' &&

  #        mysql -uroot -p'${init_mysql_pass}' -e "set password='123456';"

  #注意上面解压也可用另一种方式: shell命令
  #- name: Unarchive tomcat package
  #  copy: src=/root/ansible-playbook-mysql/mysql-5.7.19-linux-glibc2.12-x86_64.tar.gz dest=/tmp/
  #- name: Unarchive tomcat
  #  shell: cd /tmp && tar -zxf mysql-5.7.19-linux-glibc2.12-x86_64.tar.gz

结合ansible命令ad-hoc的各种模块,编写playbook脚本,实现批量安装、卸载、启动、停止、挂载等各种复杂工作.

你可能感兴趣的:(ansible)