个人博客:http://www.johnlee.ink/
安装依赖及版本信息如下:
=========================================================================================================================================================================== Package Arch Version Repository Size =========================================================================================================================================================================== Installing: ansible noarch 2.8.1-1.el7 epel 15 M Installing for dependencies: python-babel noarch 0.9.6-8.el7 base 1.4 M python-httplib2 noarch 0.9.2-0.2.el7 epel 115 k python-jinja2 noarch 2.7.2-2.el7 base 515 k python-markupsafe x86_64 0.11-10.el7 base 25 k python-paramiko noarch 2.1.1-5.el7 base 268 k python2-jmespath noarch 0.9.0-1.el7 epel 39 k sshpass x86_64 1.06-1.el7 epel 21 k Transaction Summary ===========================================================================================================================================================================1.配置基于key的ssh远程登录
[root@CentOS7 ~]#ssh-keygen [root@CentOS7 ~]#ssh-copy-id 192.168.37.30 [root@CentOS7 ~]#ssh-copy-id 192.168.37.102 [root@CentOS7 ~]#ssh-copy-id 192.168.37.1032.主控端安装ansible
[root@CentOS7 ~]#yum install ansible3.配置主机清单:
[root@CentOS7 ~]#vim /etc/ansible/hosts [webservers] 192.168.37.102 192.168.37.103 [appservers] 192.168.37.304.测试主机联通性
[root@CentOS7 ~]#ansible all -m ping5.编写剧本yml文件
[root@CentOS7 data]#vim mariadb.yml --- #二进制安装mariadb #mariadb版本10.2.25 #安装步骤 #1.添加mysql用户 #2.创建存放数据库文件目录 #3.修改存放数据库文件目录权限 #4.解压缩二进制包,同时设置解压后的mysql安装目录权限 #5.创建软链接 #6.准备配置文件(配置文件不修改再次执行playbook,需要删除已经生成的数据库文件,否则会报错) #7.准备数据库文件 (每执行一次playbook,生成数据库文件脚本都会重新执行,重新生成数据库文件) #8.准备服务启动脚本 (更改数据库配置端口后重新执行playbook,原先已经启用服务占用的端口需手动禁用掉) #9.设置环境变量 #10.source环境变量,使之生效 #11.启动mariadb服务 - hosts: all remote_user: root tasks: - name: create user mysql user: name=mysql system=yes home=/data/mysql create_home=no shell=/sbin/nologin - name: create mysql data directory file: path=/data/mysql state=directory - name: chown mysql data directory file: path=/data/mysql owner=mysql group=mysql - name: unarchive package to remote hosts unarchive: src=/data/mariadb-10.2.25-linux-x86_64.tar.gz dest=/usr/local copy=yes owner=root group=root tags: unarchmariadb - name: create soft link file: src=/usr/local/mariadb-10.2.25-linux-x86_64 dest=/usr/local/mysql state=link - name: copy config file copy: src=/data/my.cnf dest=/etc - name: prepare data file shell: chdir=/usr/local/mysql ./scripts/mysql_install_db --datadir=/data/mysql --user=mysql - name: prepare start scripts shell: cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld - name: set environment path variable copy: content='PATH=/usr/local/mysql/bin:$PATH' dest=/etc/profile.d/mysql.sh - name: source path variable shell: source /etc/profile.d/mysql.sh - name: start mariadb service shell: /etc/init.d/mysqld start handlers: - name: restart mariadb service service: name=mysqld state=restarted6.准备安装包和配置文件
[root@CentOS7 data]#vim /etc/my.cnf [mysqld] datadir=/data/mysql [root@CentOS7 data]#cp /etc/my.cnf /data/ [root@CentOS7 ~]#rz #mariadb-10.2.25-linux-x86_64.tar.gz7.检查语法
#如果yml文件有关键字或模块名称错误,会直接报红色错误 #如果yml模拟执行过程中有错,会在具体执行步骤处报错,前面的通过的步骤会显示 [root@CentOS7 ~]#ansible-playbook -C /data/mariadb.yml8.执行剧本:
#第一次执行剧本 [root@CentOS7 ~]#ansible-playbook /data/mariadb.yml #如果是后面改了配置文件,再次执行,由于压缩文件解压缩需要一段时间,可以选择跳过解压阶段 [root@CentOS7 ~]#ansible-playbook /data/mariadb.yml --skip-tags="unarchmariadb" #更改数据库配置端口后重新执行playbook,原先已经启用服务占用的端口需手动禁用掉 #ss -nltp #kill -9 pid配置文件中带有变量的称为模板template 批量引入文件名到main.yml
[root@CentOS7 tasks]#for file in *;do echo "- include: $file" >> main.yml;done 1.role角色名即roles目录下的子目录名(一个文件夹对应一个角色) 2.执行playbook的yml文件要与roles目录在同一级 3.template模板文件名必须是.j2后缀;调用的yml文件与templates文件夹在同级目录 4.tasks的yml文件中指定的包路径不需要指定绝对路径 默认的roles目录路径:/etc/ansible/roles ,可修改 ansible.cfg 配置文件自定义roles目录路径 #:nohl vim中取消高亮 #:set number vim中查看行号 vim /etc/ansible/ansible.cfg roles_path = /data/playbook/roles使用项目的目录结构: 将原先的tasks任务分别拆成roles/tasks目录下的单个yml文件,方便局部调整,而不影响整体 项目文件写法与简单写法区别:
[root@CentOS7 ~]#cat /etc/ansible/playbooks/roles/mariadb/tasks/unarchive_install_package.yml - name: unarchive package to remote hosts #压缩包的路径放到了files目录中,所以不需要指定压缩包路径,Ansible可以自己找到 unarchive: src=mariadb-10.2.25-linux-x86_64.tar.gz dest=/usr/local copy=yes owner=root group=root tags: unarchmariadb [root@CentOS7 ~]#cat /etc/ansible/playbooks/roles/mariadb/tasks/config_template.yml - name: copy config file #配置文件放在了templates目录中,无需指定配置文件路径 template: src=my.cnf.j2 dest=/etc/my.cnf notify: restart mariadb service -----------------------------案例1:模板仅需重复1条服务的变量------------------------------ vim for.yml - hosts: appsrvs vars: ports: //变量列表名 - 81 // - listen_port:81 变量列表,可以是字典形式 - 82 // - listen_port:82 - 83 // - listen_port:83 // 键(变量):值:字典形式 tasks: - name: config template: src=aa.j2 dest= vim templates/aa.j2 {% for port in ports %} //port:for循环中定义使用的变量;ports是yml中定义的变量列表 server { listen {{port}} //listen {{port.listen_port}} 调用字典变量 } {%endfor%} 结果形式: server{ port:81 } server{ port:82 } server{ port:83 } ----------------------------------------------------------------------------------- ---------------案例2:模板中需重复多个服务的变量----------------- vim for.yml - hosts: appsrvs vars: ports: - web1: //第1个列表元素,以键值对存储 listen_port: 81 name: web1.magedu.com dir: /data/web1 - web2: //第3个列表元素,以键值对存储 listen_port: 81 name: web2.magedu.com dir: /data/web2 - web3: //第3个列表元素,以键值对存储 listen_port: 81 name: web3.magedu.com dir: /data/web3 tasks: - name: config template: src=aa.j2 dest= vim templates/aa.j2 {% for port in ports %} //这里的ports是3个列表 server { listen {{port.listen_port}} server_name {{port.name}} root {{port.dir}} } {%endfor%} 效果: server{ port:81 server_name:web1.magedu.com root:/data/web1 } server{ port:82 server_name:web2.magedu.com root:/data/web2 } server{ port:83 server_name:web3.magedu.com root:/data/web3 } -------------------------------------------------------------------------- ----------案例3:条件判断来重复多个服务变量----------------------- vim for.yml - hosts: appsrvs vars: ports: - web1: //第1个列表元素,以键值对存储 listen_port: 81 dir: /data/web1 - web2: //第3个列表元素,以键值对存储 listen_port: 81 name: web2.magedu.com dir: /data/web2 - web3: //第3个列表元素,以键值对存储 listen_port: 81 dir: /data/web3 tasks: - name: config template: src=aa.j2 dest= vim templates/aa.j2 {% for port in ports %} //这里的ports是3个列表 server { listen {{port.listen_port}} {%if port.name is defined %} //变量定义则执行,变量没定义则不执行 server_name {{port.name}} {%endif%} root {{port.dir}} } {%endfor%} 效果: server{ port:81 root:/data/web1 } server{ port:82 server_name:web2.magedu.com root:/data/web2 } server{ port:83 root:/data/web3 } --------------------------------------------------------------------