综合架构_ansible自动化管理服务

友情链接博文地址:

https://www.michaelxia.cn/Michael/55.html

 https://ansible-tran.readthedocs.io/en/latest/docs/intro_adhoc.html#deploying-from-source-control

 ansible 添加数据库: https://docs.ansible.com/ansible/latest/modules/mysql_db_module.html

 ansible mysql 添加户: https://docs.ansible.com/ansible/latest/modules/mysql_user_module.html

 

ansible帮助信息查看方法:


01. 查看官方资料文档
02. 利用ansible帮助查看命令


ansible-doc -l         --- 列出所有ansible模块信息

ansible-doc -s 模块名  --- 查看指定模块详细参数信息

ansible-doc 模块名      --- 显示的帮助信息更加详细

 

概述:

  01:基于Python语言开发的自动化软件工具

  02:基于SSH远程管理服务实现远程主机批量管理

意义:

  01:提高工作效率

  02:提高工作准备度

  03:减少维护的成本

  04:减少重复性工作

功能:

  批量系统操作配置,软件服务部署,文件数据分发,系统信息收集

特点:

  01:管理端不需要启动服务程序(no server)

  02:管理端不需要编写配置文件(/etc/ansible/ansible.cfg)

  03:受空端不需要安装软件程序(liuselinux-python)

  04:受控端不需要启动服务程序(no agent)

服务架构:

 

ansible服务软件程序安装

管理端安装软件: yum install -y ansible (需要依赖epel源)

受控端安装软件:yum install -y libselinux-puthon(可选)

 

ansible软件主机清单配置(vim  /etc/ansible/hosts)

方式一:直接编写主机地址

172.16.1.7

172.16.1.31

172.16.1.41

 

 

 

 

方式二:编写主机组信息

[rsync_server]

172.16.1.41

[rsync_client]

172.16.1.7

172.16.1.8

172.16.1.31

测试:

ansible rsync_server -m ping

ansible rsync_client -m ping

 

方式三:主机清单内置变量配置方法:

利用基于内置密码方式批量管理

172.16.1.41 ansible_user=root ansible_password=****** ansible_port=22

复制代码
ansible_host    --- 可以设置IP地址信息,建立地址和名称解析关系
ansible_port    --- 指定被管理主机远程服务端口信息
ansible_user    --- 指定被管理主机远程连接用户信息
ansible_password  -指定被管理主机连季节用户密码信息

ansible_become -- 是否开启普通用户权限 yes true(开启)/no false(关闭)
ansible_become_method --指定普通用户提权方法 su -root/ sudo
ansible_become_user  --- 指定提权后用户身份
ansible_become_password --- 指定提前后用户密码
复制代码

 

 

 

 

以普通用户进行批量管理提权操作: 

复制代码
采用su方式进行提权
172.16.1.41 ansible_user=zhq ansible_password=****** ansible_become=yes ansible_become_method=su ansible_become_user=root ansible_become_password=******

采用sudo方式进行提权: 
172.16.1.41 ansible_user=zhq ansible_password=****** ansible_become=yes ansible_become_method=sudo ansible_sudo_user=root ansible_become_password=123456
复制代码

 

方式四:主机组变量设置方法(剧本)

[rsync_server]

172.16.1.41

[rsync_server:vars]

ansible_user=root

ansible_password=******

ansible_port=22

 

方式五:主机组子组配置方法

[db:children]

master_db

slave_db

[master_db]

172.16.1.7

[salve_db]

172.16.1.31

172.16.1.41

 

方式六:序列

172.16.1.[1:100]

ansible配置模块信息

ansible模块使用方法:

ansible 命令语法结构:

ansible 管理主机信息(主机组名称 主机地址或名称 all) -m(用什么模块) -a "模块参数信息 "

ansible  主机信息  -m  模块名称  -a "参数信息"


 

 颜色说明:

https://docs.ansible.com/ansible/latest/reference_appendices/config.html

 

1)命令模块(默认模块) --command 

作用:批量管理多个数据,执行命令

常见用法:

ansible db -m command -a "hostname

 

复制代码
 特殊参数:

chdir: 在操作远程主机前,先切换目录,再执行命令

ansible db -m command -a "chdir=/backup touch oldboy.txt"

creates:判断一个文件是否存钻

  如果文件数据存在,就跳过后续的操作过程

  如果文件数据没有,就执行后续的操作过程

remove:判断一个文件是否存在:

  如果文件数据存在,就执行后续的操作过程

  如果文件数据没有,就跳过后续的操作过程

ansible db -m command -a "creates=/backup/oldgirl.txt touch oldgirl.txt"
ansible db -m command -a "removes=/backup/oldgirl.txt touch oldgirl.txt"
复制代码

 2)命令模块(万能模块) shell 

复制代码
作用: 批量管理多个数据,执行命令; 但是可以识别特殊一些符号: < > | ... 
常见用法:
ansible db -m shell -a "echo oldboy66 >/tmp/oldboy.txt"

特殊参数:
chdir参数: 在操作远程主机之前, 先切换目录, 在执行操作命令

ansible db -m shell -a "chdir=/backup touch oldboy.txt"
creates参数: 判断一个文件是否存在
  如何文件数据存在, 就跳过后续的操作过程
  如何文件数据没有, 就执行后续的操作过程
removes参数: 判断一个文件是否存在
  如何文件数据存在, 就执行后续的操作过程
  如何文件数据没有, 就跳过后续的操作过程


ansible db -m shell -a "creates=/backup/oldgirl.txt touch oldgirl.txt"
ansible db -m shell -a "removes=/backup/oldgirl.txt touch oldgirl.txt"
复制代码

 3)命令模块(脚本模块) -script

复制代码
作用:可以远程执行脚本文件

shell模块执行脚本

第一步:编写脚本文件

第二步:将脚本进行分发

第三步:修改脚本文件权限

第四部:运行脚本



script模块执行脚本

第一步:编写脚本文件

第二步:运行脚本文件

ansible 172.16.1.41 -m -script -a "/server/scripts/test.sh"
复制代码

 

 

 4) 文件模块(分发数据) -copy

复制代码
作用:

1.将管理主机上的数据分发到其他所有被管理主机上

2.可以将被管理主机上的数据进行复制操作

常见使用方法:

管理主机  ---> 被传输到管理主机

常见使用方法:
管理主机 --- 传输到被管理主机
ansible 172.16.1.41 -m copy -a "src=/m01/oldboy.txt dest=/backup"
操作被管理主机数据(A目录数据) --- 传输到被管理主机(B目录数据)
ansible 172.16.1.41 -m copy -a "src=/backup/oldboy.txt dest=/backup01/ remote_src=yes"



特殊用法参数:

mode: 传输文件后进行修改文件数据权限

owner: 传输文件后进行修改文件属主权限

group:  传输文件后进行修改文件属组权限

ansible 172.16.1.41 -m copy -a "src=/m01/oldboy.txt dest=/backup/ mode=666 owner=oldboy group=oldboy"

backup: 传输文件之前, 对要进行覆盖的文件做备份操作
ansible 172.16.1.41 -m copy -a "src=/m01/oldboy.txt dest=/backup/ backup=yes"

content: 在被管理主机创建一个新的文件, 并添加简单内容
ansible 172.16.1.41 -m copy -a "content='oldboy123' dest=/backup/rsync.password"
复制代码

 5)文件模块(文件属性) -file

复制代码
作用:
1.对已有文件数据属性信息作出修改调整
2.在对台主机上进行数据创建或删除操作
参数:
path
recurse
state -> 选项(directory)
group
owner
mode
常见使用方法: 1. 修改数据属性信息 ansible 172.16.1.41 -m file -a "path=/backup/oldboy.txt mode=644 owner=root group=root" 2. 创建删除数据信息 创建普通文件: ansible 172.16.1.41 -m file -a "path=/backup/oldboy01.txt state=touch" 创建目录文件: ansible 172.16.1.41 -m file -a "path=/backup/oldboy state=directory" 创建链接文件: 软链接: ansible 172.16.1.41 -m file -a "src=/backup/oldboy.txt path=/backup/oldboy/oldboy_link state=link" 硬链接: ansible 172.16.1.41 -m file -a "src=/backup/oldboy.txt path=/backup/oldboy/oldboy_hard state=hard" 删除数据文件: ansible 172.16.1.41 -m file -a "path=/backup/oldboy01.txt state=absent" ansible 172.16.1.41 -m file -a "path=/backup/oldboy/ state=absent"
复制代码

 

递归修改目录权限:

ansible 172.16.1.41 -m  file -a "path=/opt recurse=yes mode=755"

 6)文件模块(拉取数据) -fetch

作用:将被管理端主机数据进行拉取保存到管理主机上

 7)系统应用模块(安装软件) yum

复制代码
作用:可以用于批量安装程序软件

用法: ansible 172.16.1.41 -m yum -a "name=htop state=installed"
参数: name: 指定需要安装软件名称 state:是否安装软件(installed)或是卸载软件(removed)
persent absent(缺席)
latest:
复制代码

 8) 系统应用模块 service

复制代码
作用:可以用于批量启动/停止/重启服务
参数:
name
state: started
stopped
restarted
reloaded
enabled: yes
no
用法: 停止服务:ansible 172.16.1.41 -m service -a "name=crond state=stopped" 启动服务:ansible 172.16.1.41 -m service -a "name=crond state =started" 重启服务:ansible 172.16.1.41 -m service -a "name=crond state=restarted" 重载服务: ansible 172.16.1.41 -m service -a "name=crond state=reloaded" 开机自动运行服务:ansible 172.16.1.41 -m service -a "name=crond enabled=yes" 开机禁止运行服务:ansible 172.16.1.41 -m service -a "name=crond enabled=no"
复制代码

 9) 系统应用模块(定时任务模块)  cron

复制代码
作用:可以用于批量设置定时任务

* * * * * 执行任务 &>dev/null

minute:分钟信息 0-59 2,*/2, 1-10, 1, 3, 4 
hour:小时信息 0-23
day: 日期信息 1-31
month:月份信息 1-12
weekday:星期信息0-6
job: 任务参数
name: 定时任务注释信息

编写定时任务:
ansible 172.16.1.41 -m cron -a "name=时间同步01 minute=*/5 job='/usr/sbin/ntpdate  ntp1.aliyun.com &>/dev/null'"
    
删除定时任务:
ansible 172.16.1.41 -m cron -a "name=时间同步01 minute=*/5 job='/usr/sbin/ntpdate  ntp1.aliyun.com &>/dev/null' state=absent"
    
临时关闭定时任务:
ansible 172.16.1.41 -m cron -a "name=时间同步 minute=*/5 job='/usr/sbin/ntpdate  ntp1.aliyun.com &>/dev/null' disabled=yes"
复制代码

10)用户相关模块 user

复制代码
作用:可以用于批量创建用户信息
用法:
ansible 172.16.1.41 -m user -a 'name=zhq password="$6$oldboy$MVd3DevkLcimrBLdMICrBY8HF82Wtau5cI8D2w4Zs6P1cCfMTcnnyAmmJc7mQaE9zuHxk8JFTRgYMGv9uKW7j1"'

name: 指定创建用户名称信息
uid:设置用户uid数值信息
group:指定用户所属主组信息 useradd  -g
groups: 指定用户所属附属组信息 useradd -G
shell: 指定用户登录方式 /sbin/nologin
create_home:指定创建用户是否有家目录
password: 指定用户密码信息必须是密文

    如何生成密文密码信息:
    ========================================================================
    方式一: 利用ansible命令给用户设置密文密码
    ansible 172.16.1.41 -m debug  -a "msg={{'明文密码'|password_hash('sha512','zhq') }}"
    $6$oldboy$MVd3DevkLcimrBLdMICrBY8HF82Wtau5cI8D2w4Zs6P1cCfMTcnnyAmmJc7mQaE9zuHxk8JFTRgYMGv9uKW7j1
    
    方式二: 利用python命令给用户设置密文密码
    yum install -y python-pip
    pip install passlib
    python -c "from passlib.hash import sha512_crypt; import getpass; print(sha512_crypt.using(rounds=5000).hash(getpass.getpass()))"
    ========================================================================
复制代码

 

复制代码
删除用户信息:
ansible 172.16.1.41 -m user -a 'name=zhangsan state=absent remove=yes'
state=absent:删除指定用户信息
remove=删除用户信息,并移除家目录

删除用户家目录 == userdel -r

ansible 172.16.1.41 -m user -a "name=oldboy state=absent remove=yes == userdel -r"
复制代码

 11)系统应用 mount

作用:可以用于批量挂载和卸载操作
用法:
    ansible 172.16.1.41 -m mount -a "src=172.16.1.31:/data01 path=/mnt fstype=nfs state=mounted"
    ansible 172.16.1.41 -m mount -a "src=172.16.1.31:/data01 path=/mnt fstype=nfs state=unmounted"
复制代码
挂载操作:
    present:  进行挂载操作参数, 只是实现永久挂载(在/etc/fstab文件添加了挂载配置信息)
    mounted:  进行挂载操作参数, 既可以实现永久挂载, 有可以实现临时挂载
卸载操作:
    absent    卸载操作参数 临时卸载 永久卸载
    unmounted 卸载操作参数 临时卸载
复制代码

 12)压缩解压模块:

复制代码
unarchive
    参数:
        src
        dest
        owner/group
        mode
        ctrates
        copy:yes/no
        list_files:yes/no
archive
复制代码

 13) lineinfile

复制代码
ansible 172.16.1.31 -m lineinfile -a "dest=/oldboy/oldboy.txt regexp='aaa(.*)' line='bbbb'"       替换某一行
ansible 172.16.1.31 -m lineinfile -a "dest=/oldboy/oldboy.txt insertbefore='aaa(.*)' 'line='bbbb'" 在一行前插入信息 

参数:
insertafter='ccc(.*)' 在一行后插入信息 regexp='ggg(.*)' state=absent 删除某一行 dest=/oldboy/oldboy.txt line='bbbbbbbbbb'
复制代码

在进行判断匹配时,如何取出内置变量指定子集信息

复制代码
描述人特点: 身高 体重 性别 学历: 金融学历_企业管理 财务学历_注册会计师 工作
方式一: 利用点进行分割取出子集信息
[root@m01 ansible_playbook]# cat test02.yml 
- hosts: 172.16.1.41
  tasks:
    - name: show host_eth0 info
      debug: msg={{ ansible_eth0.ipv4.address }}
      
方式二: 利用中括号分割取出子集信息
[root@m01 ansible_playbook]# cat test02.yml 
- hosts: 172.16.1.41
  tasks:
    - name: show host_eth0 info
      debug: msg={{ ansible_eth0["ipv4"]["address"] }}
      
[root@m01 ansible_playbook]# cat test02.yml 
- hosts: all
  tasks:
    - name: copy file
      copy: src=/etc/hosts dest=/tmp/
      when: ansible_eth0.ipv4.address == "10.0.0.41"
复制代码

 剧本扩展编写方法

 1).剧本设置变量方法  

复制代码
方法一: 在剧本中编写变量                  其次优先
- hosts: 172.16.1.41
 vars:
   bak_dir: /backup
 tasks:
   - name: 01.创建备份数据目录
     file: path={{ bak_dir }}  state=directory
   - name: 02.将数据进行备份保存
     copy: src=/etc/hosts dest={{ bak_dir }}

方法二: 在主机清单中编写变量              最不优先
[rsync_server] 
172.16.1.41  bak_dir=/backup01    --- 只针对某一个主机设置变量信息

[rsync_server]                    --- 对主机组中所有主机设置变量
172.16.1.41
[rsync_server:vars]
bak_dir=/backup02

方法三: 在剧本执行命令中添加变量参数信息   最优先
-e EXTRA_VARS, --extra-vars=EXTRA_VARS    --- 设置剧本变量信息
ansible-playbook -e bak_dir=/backup04  test_变量功能.yaml
复制代码

 2) 剧本判断功能功能设置

  setup --- 收集受控段主机信息

复制代码
    ansible_all_ipv4_addresses:                仅显示ipv4的信息。
       ansible_devices:                        仅显示磁盘设备信息。
       ansible_distribution:                    显示是什么系统,例:centos,suse等。
       ansible_distribution_major_version:        显示是系统主版本。
       ansible_distribution_version:            仅显示系统版本。
       ansible_machine:                        显示系统类型,例:32位,还是64位。
       ansible_eth0:                            仅显示eth0的信息。
       ansible_hostname:                        仅显示主机名。
       ansible_kernel:                            仅显示内核版本。
       ansible_lvm:                            显示lvm相关信息。
       ansible_memtotal_mb:                    显示系统总内存。
       ansible_memfree_mb:                        显示可用系统内存。
       ansible_memory_mb:                        详细显示内存情况。
       ansible_swaptotal_mb:                    显示总的swap内存。
       ansible_swapfree_mb:                    显示swap内存的可用内存。
       ansible_mounts:                            显示系统磁盘挂载情况。
       ansible_processor:                        显示cpu个数(具体显示每个cpu的型号)。
       ansible_processor_vcpus:                显示cpu个数(只显示总的个数)。
复制代码

 

复制代码
总结判断用法:
       方法一:单个条件进行判断
       when: ansible_eth1.ipv4.address == "172.16.1.31"
       
       方法二:多个条件进行判断
       when: (ansible_eth1.ipv4.address == "172.16.1.31") and (ansible__distribution == "CentOS")
       when: (ansible_eth1.ipv4.address == "172.16.1.31") or  (ansible__distribution == "CentOS")
       
       方法三: 对条件取反操作
       when: ansible_eth1.ipv4.address != "172.16.1.31"
       
       - hosts: rsync_client
         tasks:
           - name: 判断是否是172.16.1.31
             file:
               path: /oldboy
               state: directory
             when: ansible_eth1.ipv4.address == "172.16.1.31"
           - name: 判断是否是172.16.1.7
             file:
               path: /oldgirl
               state: directory
             when: ansible_eth1.ipv4.address == "172.16.1.7"

        - hosts: new_server
          tasks:
            - name: install software
              yum:
                name: nfs-utils
                state: installed
              when: ansible_distribution == "CentOS"
            - name: install software - debian
              apt:
                name: nfs
                state: installed
              when: ansible_distribution  == "Debian"
复制代码

 3)剧本循环功能设置

复制代码
循环方式一:
- hosts: 172.16.1.41 tasks: - name: 创建多个用户 user: name={{ item }} loop: - oldboy - oldgirl - olddog 循环方式二: - hosts: 172.16.1.41 tasks: - name: 创建多个用户 user: name={{ item.username }} uid={{ item.useruid }} shell={{ item.usershell }} with_items: - {username: 'oldboy01', useruid: '2000', usershell: '/sbin/nologin'} - {username: 'oldboy02', useruid: '3000', usershell: '/bin/bash'} - {username: 'oldboy03', useruid: '4000', usershell: '/sbin/nologin'}   - name: 04:启动服务程序 service: name={{ item }} state=started loop: - rpcbind.socket - nfs rsync 临时启动 永久启动 nfs-utils 临时启动 永久启动 telnet-server 临时启动 不要永久启动 service: name={{ item.name }} state={{ item.state }} enabled={{ item.enable }} with_items: - {name: 'rsync', state: 'started', enable: 'yes'} - {name: 'nfs', state: 'started', enable: 'yes'} - {name: 'telnet.socket', state: 'started', enable: 'no'}
复制代码

4)剧本忽略错误功能 ignore_errors  调试剧本|shell

复制代码
shell 不具有环境操作判断功能  创建用户 user --- 判断用户是否存在 
- hosts: 172.16.1.41
 tasks:
   - name: install software
     shell: yum install -y rsync
   - name: create user
     shell: useradd rsync -s /sbin/nologin -M
     ignore_errors: yes
   - name: create backup dir
     shell: mkdir -p /backup && chown rsync.rsync /backup
    
复制代码

 5)剧本标记功能 调试剧本

复制代码
- name: 04:启动服务程序
 service: name={{ item }} state=started
 loop:
   - rpcbind.socket
   - nfs
 tags: oldboy

只让标记任务执行:ansible-playbook -t oldboy auto_nfs.yaml 
跳过标记任务执行:ansible-playbook --skip-tags oldboy auto_nfs.yaml
复制代码

 6)剧本执行输出功能

复制代码
- hosts: 172.16.1.41
 tasks:
   - name: boot server
     service: name=rsyncd state=started enabled=yes
   - name: check server state
     shell: netstat -lntup|grep rsync
     register: status
   - name: output info
     debug: msg={{ status.stdout_lines }}
复制代码

 7)剧本执行提升效率

复制代码
综合架构一键化部署: 
1)软件安装
  搭建本地yum仓库  
2)Gathering Facts(收集受控端主机信息)
  关闭收集功能操作
  - hosts: 172.16.1.31
    gather_facts: no
    tasks:
  PS: 一定是剧本中没有配置判断功能时, 可以关闭信息收集功能

总结:剧本执行慢的原因
01. SSH远程连接优化没有配置,关闭认证功能 关闭DNS反向解析功能
02. yum下载软件慢 使用本地yum仓库
03. 剧本收集信息慢
04. 剧本执行过程必须完整 (不要经常CTRL+C)
复制代码

 8)剧本执行触发功能 notify | handlers

复制代码
PS: 触发器任务会在所有任务执行完毕之后才执行
- hosts: 172.16.1.31 tasks: - name: config file info copy: src=/etc/ansible/ansible_playbook/exports dest=/etc/ notify: - nfs_server - nfs_check - nfs_output - name: create dir file: path=/data state=directory owner=nfsnobody group=nfsnobody - name: boot server service: name={{ item }} state=started loop: - rpcbind.socket - nfs - name: check server shell: showmount -e 172.16.1.31 register: mount_info - name: output info debug: msg={{ mount_info.stdout_lines }} handlers: - name: nfs_server service: name=nfs state=reloaded - name: nfs_check shell: showmount -e 172.16.1.31 register: mount_info - name: nfs_output debug: msg={{ mount_info.stdout_lines }}
posted @ 2019-10-30 15:13  堪舆先森  阅读(271)  评论(0编辑  收藏  举报