友情链接博文地址:
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 }}