欢迎您访问365答案网,请分享给你的朋友!
生活常识 学习资料

ansible常用模块总结

时间:2023-07-11

Ansible可以完成的功能:
1、批量执行远程命令,可以对N台主机同时进行命令的执行。
2、批量配置软件服务,可以进行自动化的方案配置和管理服务。
3、实现软件开发功能,jumpserver底层使用ansible来实现的自动化管理。
4、编排高级的IT任务,Ansible的Playbook是一门编程语言,可以用来描绘一套IT架构。

安装ansible:
CentOS上:yum install ansible -y
安装后检查ansible版本: ansible --version

ansible配置文件存在优先级:
1、ANSIBLE_CONFIG
2、当前目录下的ansible.cfg
3、当前用户家目录下的.ansible_cfg
4、/etc/ansible/ansible.cfg

默认配置文件/etc/ansible/ansible.cfg
#inventory      = /etc/ansible/hosts                    # 主机列表配置文件
#library        = /usr/share/my_modules/                # 库文件存放目录
#module_utils   = /usr/share/my_module_utils/
#remote_tmp     = ~/.ansible/tmp                        # 临时py文件存放存放在远程主机目录
#local_tmp      = ~/.ansible/tmp                        # 本机的临时执行目录
#plugin_filters_cfg = /etc/ansible/plugin_filters.yml
#forks          = 5                                     # 默认并发数
#poll_interval  = 15
#sudo_user      = root                                  # 默认sudo用户
#ask_sudo_pass = True                                   # 每次执行是否询问sudo的ssh密码
#ask_pass      = True                                   # 每次执行是否询问ssh密码
#transport      = smart
#remote_port    = 22                                    # 远程主机端口
#module_lang    = C
#module_set_locale = False

#log_path = /var/log/ansible.log                        # ansible日志

[privilege_escalation] # 如果是普通用户则需要配置提权
#become=True
#become_method=sudo
#become_user=root
#become_ask_pass=False

Ansible Inventory:Inventory文件中填写被管理主机和主机组信息(逻辑上定义)。默认Inventory文件在/etc/ansible/hosts。
当然也可以自定义,然后使用-i直送Inventory文件位置。

场景1:基于密码连接
cat /etc/ansible/hosts
# 方式1:主机+端口+用户名+密码
[webservers]
10.0.0.31 ansible_ssh_port=22 ansible_ssh_user=root ansbile_ssh_pass='123456'
10.0.0.41 ansible_ssh_port=22 ansible_ssh_user=root ansbile_ssh_pass='123456'

# 方式2:主机+端口+密码
[webservers]
web[1:2].bl02u2.com ansible_ssh_pass='123456'

# 方式3: 主机+端口+密码
[webservers]
web[1:2].bl02u2.com
[webservers:vars]
ansible_ssh_pass='123456'

举例:
在当前文件下新建一个hosts文件:
[bl02u2]
IP1
IP2
[bl02u2:vars]
ansible_ssh_user=bl02u2
ansible_ssh_pass=bl02u2

用-i参数指定被控主机组所在的文件:
调用命令:ansible bl02u2 -m ping -i hosts
IP1 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    },
    "changed": false,
    "ping": "pong"
}
IP2 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    },
    "changed": false,
    "ping": "pong"
}

场景2:基于密码连接,需要先创建公钥和私钥,并下发公钥至被控端:
ssh-copy-id -i ~/.ssh/id_rsa.pub root@IP地址1
ssh-copy-id -i ~/.ssh/id_rsa.pub root@IP地址2

方式1:主机+端口+密钥
[webservers]
IP地址1
IP地址2

举例:
在当前目录下编写一个hosts2文件:
[bl02u2]
IP1
IP2
调用命令:ansible bl02u2 -m ping -i hosts2
IP1 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    },
    "changed": false,
    "ping": "pong"
}
IP2 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    },
    "changed": false,
    "ping": "pong"
}

编辑一个hosts3文件:
web01 ansible_ssh_host=IP1 ansible_ssh_port=22
web02 ansible_ssh_host=IP2  ansible_ssh_port=22

执行:ansible bl02u2 -m ping -i hosts3
返回的是IP地址对应的主机名

web02 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    },
    "changed": false,
    "ping": "pong"
}
web01 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    },
    "changed": false,
    "ping": "pong"
}


1、ad-hoc:是临时命令,执行完即结束,并不会保存
2、ad-hoc:比如在多台机器上查看某个进程是否启动,或拷贝指定文件到本地,等等
3、ad-hoc模式的命令使用,ansible 'bl02u2' -m command -a 'df -h'
命令格式: ansbile 'bl02u2' -m          command         -a      'df -h'
格式说明: 命令    主机名称 指定模块    模块名称        模块动作 具体名称

-f num # 可以指定并发数

4、使用ad-hoc执行一次远程命令,注意观察返回结果的颜色
绿色:代表被管理端主机没有被修改
黄色:代表被管理端主机发现变更
红色:代表出现了故障

模块
安装:yum
配置yum仓库:yum_repository
配置:copy file get_url
启动: service systemd
用户:user group
任务:cron
挂载:mount
防火墙:firewall selinux
命令:command(默认) shell模块 scripts

ansible-doc 模块名 # 查看此模块的帮助信息

yum模块(安装present 卸载absent 升级lastest 排除exclude 指定仓库enablerepo):
参数 选项 含义
name httpd|nginx|..、 指定安装软件包名或软件包URL
state present|absent|latest 指定yum对应的方法
enablerepo epel|base|..、允许从哪些仓库获取软件
disablerepo epel|base|.、禁止从哪些仓库获取软件
exclude kernel|..、排除某些软件包
download_ony yes|no 仅下载软件包、不安装

示例1:安装当前最新的Apache软件,如果存在则不安装
ansbile webservers -m yum -a "name=httpd state=present"

示例2:安装当前最新的Apache软件,通过epel仓库安装
ansible webservers -m yum -a "name=httpd state=present enablerepo=epel"

示例3:通过公网URL安装rpm软件
ansible webservers -m yum -a "name=https://xx.rpm state=present"

示例4:安装最新版本的Apache软件,如果存在则更新Apache
ansible webservers -m yum -a "name=httpd state=latest"

示例5:更新所有软件包,但排除kernel相关的
ansible webservers -m yum -a "name=* state=latest exclude=kernel"

示例6:删除Apache软件
ansible webservers -m yum -a "name=httpd state=absent"


copy模块:
参数 选项 含义
src:复制到远程服务器的文件本地路径,可以是绝对路径或相对路径
dest:文件复制到远程服务器的绝对路径或相对路径
owner:root(Defaults) 文件复制到远程主机并设置属主
group:root(Defaults) 文件复制到远程主机并设置属组
mode:file=644 directory=755 文件复制到远程并且设定权限
backup:yes 备份被修改前的配置文件
content:新建文件并给文件添加内容
示例1:从当前目录复制httpd.conf文件到所有受控主机的/etc/httpd/conf/httpd.conf
ansible webservers -m copy -a "src=./httpd.conf dest=/etc/httpd/conf/httpd.conf owner=root group=root mode=644"
示例2:更改了当前httpd.conf的内容,再推送到受控主机上时,受控主机上原先的httpd.conf先被备份,然活再接收新推送的httpd.conf
ansible webservers -m copy -a "src=./httpd.conf dest=/etc/httpd/conf/httpd.conf owner=root group=root mode=644 backup=yes"
示例3:向远程受控主机文件中写入内容
ansible webservers -m copy -a "content='hello world' dest=/var/www/html/index.html"


get-url文件下载模块:
参数 选项 含义
url HTTP|HTTPS 资源文件在互联网上的具体位置
dest 文件下载位置的绝对路径
mode md5|sha256 对下载资源进行校验
timeout 10(默认) URL请求超时时间
url可以使用http https ftp
示例1:下载指定网络地址的文件成受控主机的/var/www/html/tiger1.jfif
ansible webservers -m get_url -a "url=http://106.13.171.84/img/catoon/tiger1.jfif dest=/var/www/html/tiger1.jfif"
示例2:下载互联网文件并进行md5校验, 首先要获取被下载文件的md5值,并且用checksum=md5:md5值进行指定
ansible webservers -m get_url -a "url=http://106.13.171.84/img/catoon/tiger1.jfif dest=/var/www/html/tiger1.jfif checksum=md5:0b59c8e6014840e48611b49e93f4af45"


file文件创建模块:
参数 选项 含义
path 指定远程服务器的路径
recurse 递归方式(可以是递归授权)
state touch|directory|link|absent 文件复制到远程的状态
owner root(默认) 文件复制到远程并设定属组
group root(默认) 文件复制到远程并设定属组
mode file=644 directory=755 文件复制到远程并设定权限
示例1:创建文件,并设定属主,属组,权限
ansible webservers -m file -a "path=/tmp/foo.cnf state=touch mode=666"
示例2:创建目录,并设定属主、权限
ansbile webservers -m file -a "path=tmp/foo state=directory mode=777"
示例3:递归授权目录
ansbile webservers -m file -a "path=tmp/foo state=directory owner=bl02u2 group=bl02u2 mode=777 recurse=yes"

service模块:
示例1:启动http服务
ansible webservers -m service -a "name=httpd state=started"
示例2:重载http服务
ansible webservers -m service -a "name=httpd state=reloaded"
示例3:重启http服务
ansbile webservers -m service -a "name=httpd state=restarted"
示例4:停止http服务
ansible webservers -m service -a "name=httpd state=stopped"
示例5:启动httpd服务,并加入开机自启
ansbile webservers -m service -a "name=httpd state=started enabled=yes"

编辑一个文件http.yaml,此文件与被推送文件httpd.conf在同一目录下
- hosts: webservers
  remote_user: root
  tasks:
# 安装软件
  - name: Install httpd Service
    yum: name=httpd state=present
# 复制配置文件,并且如果配置文件发生变化,则重启软件

  - name: Configure Http Server
    copy: src=./httpd.conf dest=/etc/httpd/conf/httpd.conf owner=root group=root mode=644
    notify: Restart Http Server
    tags: confrestart
# 启动软件并设置开机自启
  - name: Systemd Http Server
    service: name=httpd state=started enabled=yes
# 如果配置文件发生变化,则采取重启软件的处理方法
  handlers:
  - name: Restart Http Server
    service: name=httpd state=restarted
执行:ansible-playbook http.yaml,完成在受控主机上安装,启动Httpd的过程
执行:ansible-playbook --tags=confrestrt http.yaml,只执行复制配置文件的任务,并且然后重启受控主机

ansible管理用户和组,使用user,group
group组模块:
参数 选项 含义
name 指定创建的组名
gid 为组设置可选的gid
state present(默认)|absent 是否将组创建在远程主机上
system yes|no(默认) 是否创建系统组
示例1:创建ssrf基本组,指定gid为6666
ansible webservers -m group -a "name=ssrf gid=6666 state=present"
示例2:创建http系统组,指定guid为7777
ansible webservers -m group -a "name=http gid=7777 state=present"
示例3:删除前面创建的组ssrf, http
ansible webservers -m group -a "name=ssrf state=absent"
ansible webservers -m group -a "name=http state=absent"

user模块:
参数 选项 含义
name 创建或删除的用户名
uid 为用户设置可选uid
group 为用户设置主要的组
groups 为用户设置附加组
shell present(Default)|absent 为用户设置登录时的shell
create_home yes(默认)|no 为用户创建主目录
state present(默认)|absent 用户是否应该存在
remove yes|no(默认) 删除与用户关联的目录,只有state=absent时生效
generate_ssh_key yes|no(默认) 为相关用户生成ssh密钥。不会覆盖现有的ssh密钥
ssh_key_bits 2048 创建用户ssh密钥中位数
ssh_key_file .ssh/id_rsa(默认) 可以实现ssh密钥改名,或变更存放ssh密钥位置
示例1:创建xrd用户,uid是1080,主要组是ssrf
ansbile webservers -m users -a "name=xrd uid=1080 group=ssrf"
示例2:创建bl14b1用户,登录shell是/sbin/nologin,追加bin,sys两个组
ansbile webservers -m user -a "name=bl14b1 shell=/sbin/nologin groups=bin,sys"
示例3:创建用户bl16b1, 并为其添加123作为登录密码
ansible webservers -m debug -a "msg={{ '123' | password_hash('sha512','salt') }}" # 生成密钥
把以上生成的密钥放入password中,指定创建用户bl14b1的密码
ansible webservers -m user -a 'name=bl16b1 password=$6$salt$jkHSO0tOjmLW0S1NFlw5veSIDRAVsiQQMTrkOKy4xdCCLPNIsHhZkIRlzfzIvKyXeGdOfCBoW1wJZPLyQ9Qx/1'
示例3:删除用户bl16b1和bl14b1,连同家目录和邮箱一起删除
ansible webservers -m user -a 'name=bl16b1 state=absent remove=yes'
ansible webservers -m user -a 'name=bl14b1 state=absent remove=yes'
示例4:创建http用户,并未该用户创建2048字节的私钥,存放在~/http/.ssh/id_rsa
ansbile webservers -m user -a 'name=http generate_ssh_key=yes ssh_key_bits=2048 ssh_key_file=.ssh/id_rsa'

cron定时模块:
示例1:添加定时任务。每分钟执行一次
ansible webservers -m cron -a "name=job1 job='ls >/dev/null'"
示例2:添加定时任务,每天的凌晨2点和5点执行一次ls
ansbile webservers -m cron -a "name=job2 job='ls >/dev/null'"
示例3:关闭前两个定时任务
ansbile webservers -m cron -a "name=job1 job='ls >/dev/null' disabled=yes"
ansbile webservers -m cron -a "name=job2 minute=0 hour=2,5 job='ls >/dev/null' disabled=yes"

mount挂载模块
mounted absent   永久
present umounted 临时
环境准备:将192.168.200.2作为nfs服务端,192.168.200.3 192.168.200.4作为nfs客户端挂载
ansible 192.168.200.2 -m yum -a "name=nfs-utils state=present"
ansible 192.168.200.2 -m file -a "path=/nfs state=directory"
ansible 192.168.200.2  -m copy -a "content='/nfs 192.168.200.0/24(rw,sync)' dest=/etc/exportfs"
ansible 192.168.200.2 0m service -a "name=nfs state=started"

示例1:挂载nfs存储至本地的/nfs目录,并实现开机自动挂载
ansible webservers -m mount -a "src=192.168.200.2:/nfs path=/nfs ftype=nfs opts=defaults state=mounted"
示例2:临时卸载nfs的挂载,但不会清理/etc/fstab
ansible webservers -m mount -a "src=192.168.200.2:/nfs path=/nfs ftype=nfs opts=defaults state=unmounted"
示例3:永久卸载nfs的挂载,会清理/etc/fstab
ansible webservers -m mount -a "src=192.168.200.2:/nfs path=/nfs ftype=nfs opts=defaults state=absent"

selinux模块
# 关闭selinux
ansible webservers -m selinux -a "state=disabled"

firewall模块
参数 选项 含义
service http|https|..、添加或删除firewalld中的服务名
port 80|443|..、添加或删除firewalld中的端口范围
masquerade yes|no 启用或禁用防火墙的地址伪装
immediate yes|no(默认) 防火墙规则当前是否立即生效
permanent yes|no 防火墙规则当前是否重启后生效
state enabled|disabled 启用或警用当前配置的规则
rich_rule 在防火墙中添加或删除富规则
source 添加或删除防火墙源IP网络
zone public(默认)|home|..、指定防火墙区域
# 启动防火墙
ansible webservers -m service -a "name=firewalld state=started"
# 向防火墙添加放行端口
ansible webservers -m firewalld -a 'port=8080/tcp  immediate=yes permanent=yes state=enabled'
ansible webservers -m firewalld -a 'service=http  immediate=yes permanent=yes state=enabled'
 

unarchive模块:
ansible webservers -m unarchive -a 'src=yaml.tar.gz dest=/root copy=yes mode=0755'
参数:
copy: 默认yes,当copy是yes时,那么拷贝的文件是从ansible复制到远程主机上,如果设置copy=no,那么会在远程主机上寻找src源文件
src:源路径,可以实ansible主机上的路径,如果是远程主机上的路径,则需要设置copy=no
dest:远程主机上的目标路径
mode:设置解压后的文件权限
当前目录下有一个yaml.tar.gz文件:

执行上述命令后,在远程受控主机的/root目录下多了一个yaml目录:

Copyright © 2016-2020 www.365daan.com All Rights Reserved. 365答案网 版权所有 备案号:

部分内容来自互联网,版权归原作者所有,如有冒犯请联系我们,我们将在三个工作时内妥善处理。