0
点赞
收藏
分享

微信扫一扫

Ansible 入门和常用模块

爱动漫建模 2022-05-14 阅读 46


Ansible 入门

1.1 Ansible 架构

1.1.1 Ansible 组成

  • NVENTORY:Ansible管理主机的清单/etc/anaible/hosts
  • MODULES:Ansible执行命令的功能模块,多数为内置核心模块,也可自定义
  • PLUGINS:模块功能的补充,如连接类型插件、循环插件、变量插件、过滤插件等,该功能不常用
  • API:供第三方程序调用的应用程序编程接口

1.1.2 Ansible 命令执行 来源

  • USER 普通用户,即SYSTEM ADMINISTRATOR
  • PLAYBOOKS:任务剧本(任务集),编排定义Ansible任务集的配置文件,由Ansible顺序依次执
  • 行,通常是JSON格式的YML文件
  • CMDB(配置管理数据库) API 调用
  • PUBLIC/PRIVATE CLOUD API调用
  • USER-> Ansible Playbook -> Ansibile

1.1.3 注意事项

  • 执行ansible的主机一般称为管理端, 主控端,中控,master或堡垒机
  • 主控端Python版本需要2.6或以上
  • 被控端Python版本小于2.4,需要安装python-simplejson
  • 被控端如开启SELinux需要安装libselinux-python
  • windows 不能做为主控端

1.2 Ansible安装

官方安装文档

https://docs.ansible.com/ansible/latest/installation_guide/intro_installation.html

下载

https://releases.ansible.com/ansible/

#pip 下载
https://pypi.org/project/ansible/

1.2.1 包安装方式

#Centos EPEL源的rpm包安装
[root@ansible <sub>]#yum -y install ansible

#ubuntu 安装
root@ansible:</sub># apt -y install ansible

范例:ubuntu2004安装最新版ansible

root@ansible:<sub># apt search ansible
root@ansible:</sub># apt update
root@ansible:<sub># apt install software-properties-common
root@ansible:</sub># apt-add-repository --yes --update ppa:ansible/ansible
root@ansible:<sub># apt install -y ansible
root@ansible:</sub># ansible --version
ansible [core 2.12.5]
config file = /etc/ansible/ansible.cfg
configured module search path = ['/root/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
ansible python module location = /usr/lib/python3/dist-packages/ansible
ansible collection location = /root/.ansible/collections:/usr/share/ansible/collections
executable location = /usr/bin/ansible
python version = 3.8.10 (default, Mar 15 2022, 12:22:08) [GCC 9.4.0]
jinja version = 2.10.1
libyaml = True

1.2.2 编译安装

[root@ansible <sub>]#yum -y install python-jinja2 PyYAML python-paramiko python-babel python-crypto
[root@ansible </sub>]#wget https://releases.ansible.com/ansible/ansible-2.8.0.tar.gz
[root@ansible <sub>]#tar xvf ansible-2.8.0.tar.gz
[root@ansible </sub>]#cd ansible-2.8.0/
[root@ansible ansible-2.8.0]#python setup.py build
[root@ansible ansible-2.8.0]#python setup.py install
[root@ansible ansible-2.8.0]#mkdir /etc/ansible
[root@ansible ansible-2.8.0]#cp -r examples/* /etc/ansible/
[root@ansible ansible]#ansible --version
ansible 2.8.0
config file = /etc/ansible/ansible.cfg
configured module search path = [u'/root/.ansible/plugins/modules', u'/usr/share/ansible/plugins/modules']
ansible python module location = /usr/lib/python2.7/site-packages/ansible-2.8.0-py2.7.egg/ansible
executable location = /usr/bin/ansible
python version = 2.7.5 (default, Oct 14 2020, 14:45:30) [GCC 4.8.5 20150623 (Red Hat 4.8.5-44)]

1.2.3 Git 方式

git clone git://github.com/ansible/ansible.git --recursive
cd ./ansible
source ./hacking/env-setup

1.2.4 pip 方式安装

pip是安装python包的管理器,类似yum,由EPEL源提供

[root@centos7 <sub>]#yum install python-pip -y
[root@centos7 </sub>]#pip install --upgrade pip
[root@centos7 ~]#pip install ansible --upgrade

1.3 Ansible 相关文件

1.3.1 配置文件

  • /etc/ansible/ansible.cfg 主配置文件,配置ansible工作特性,也可以在项目的目录中创建此文件,当前目前下如果也有ansible.cfg,则此文件优先生效,建议每个项目目录下,创建独有的ansible.cfg文件
  • /etc/ansible/hosts 主机清单
  • /etc/ansilbe/roles 存放角色的目录

1.3.2 ansible 主配置文件

Ansible 的配置文件可以放在多个不同地方,优先从高到低顺序如下

ANSIBLE_CONFIG      #环境变量,注意此项用 ansible --version 看不到,但可以生效
./ansible.cfg #当前目录下的ansible.cfg
~/.ansible.cfg #当前用户家目录下的.ansible.cfg
/etc/ansible/ansible.cfg #系统默认配置文件

Ansible 的默认配置文件 /etc/ansible/ansible.cfg,其中大部分的配置内容无需进行修改

[defaults]
#inventory = /etc/ansible/hosts #主机列表配置文件
#library = /usr/share/my_modules/ #库文件存放目录
#remote_tmp = $HOME/.ansible/tmp #临时py命令文件存放在远程主机目录
#local_tmp = $HOME/.ansible/tmp #本机的临时命令执行目录
#forks = 5 #默认并发数
#sudo_user = root #默认sudo 用户
#ask_sudo_pass = True #每次执行ansible命令是否询问ssh密码
#ask_pass = True
#remote_port = 22
#host_key_checking = False #检查对应服务器的host_key,建议取消此行注释,实现第一次连接自动信任目标主机
#log_path=/var/log/ansible.log #日志文件,建议启用
#module_name = command #默认模块,可以修改为shell模块

[privilege_escalation] #普通用户提权配置
#become=True
#become_method=sudo
#become_user=root
#become_ask_pass=False

1.3.3 Inventory 主机清单文件

ansible的主要功用在于批量主机操作,为了便捷的使用其中的部分主机,可以在inventory 主机清单文件中将其分组

默认的inventory file为 /etc/ansible/hosts

inventory file可以有多个,且也可以通过Dynamic Inventory来动态生成

注意: 生产建议在每个项目目录下创建项目独立的hosts文件

主机清单文件格式

inventory文件遵循INI文件风格,中括号中的字符为组名。可以将同一个主机同时归并到多个不同的组中

此外,当如若目标主机使用了非默认的SSH端口,还可以在主机名称之后使用冒号加端口号来标明

如果主机名称遵循相似的命名模式,还可以使用列表的方式标识各主机

Inventory 参数说明

ansible_ssh_host #将要连接的远程主机名.与你想要设定的主机的别名不同的话,可通过此变量设置.
ansible_ssh_port #ssh端口号.如果不是默认的端口号,通过此变量设置. 可以使用 ip:端口
ansible_ssh_user #默认的 ssh 用户名
ansible_ssh_pass #ssh 密码(这种方式并不安全,我们强烈建议使用 --ask-pass 或 SSH 密钥)
ansible_sudo_pass #sudo 密码(这种方式并不安全,我们强烈建议使用 --ask-sudo-pass)
ansible_sudo_exe (new in version 1.8) #sudo 命令路径(适用于1.8及以上版本)
ansible_connection #与主机的连接类型.比如:local, ssh 或者 paramiko. Ansible 1.2 以前默
认使用 paramiko.1.2 以后默认使用 'smart','smart' 方式会根据是否支持 ControlPersist, 来
判断'ssh' 方式是否可行.
ansible_ssh_private_key_file #ssh 使用的私钥文件.适用于有多个密钥,而你不想使用 SSH 代理的
情况.
ansible_shell_type #目标系统的shell类型.默认情况下,命令的执行使用 'sh' 语法,可设置为
'csh''fish'.
ansible_python_interpreter #目标主机的 python 路径.适用于的情况: 系统中有多个 Python,或者命令路径不是"/usr/bin/python",比如 \*BSD, 或者 /usr/bin/python 不是 2.X 版本的Python.之所以不使用 "/usr/bin/env" 机制,因为这要求远程用户的路径设置正确,且要求 "python"可执行程序名不可为 python以外的名字(实际有可能名为python26).与ansible_python_interpreter 的工作方式相同,可设定如 ruby 或 perl 的路径....

范例:

[test]
10.0.0.8 ansible_connection=local #指定本地连接,无需ssh配置
#ansible_connection=ssh 需要StrictHostKeyChecking no
10.0.0.7 ansible_connection=ssh ansible_ssh_port=2222 ansible_ssh_user=wang
ansible_ssh_password=magedu
10.0.0.6 ansible_connection=ssh ansible_ssh_user=root
ansible_ssh_password=123456
#执行ansible命令时显示别名,如web01
[websrvs]
web01 ansible_ssh_host=10.0.0.101
web02 ansible_ssh_host=10.0.0.102
[dbsrvs]
10.0.0.8:15210
10.0.0.18:15210

1.4 Ansible 相关工具

  • /usr/bin/ansible 主程序,临时命令执行工具
  • /usr/bin/ansible-doc 查看配置文档,模块功能查看工具
  • /usr/bin/ansible-playbook 定制自动化任务,编排剧本工具
  • /usr/bin/ansible-pull 远程执行命令工具
  • /usr/bin/ansible-vault 文件加密工具
  • /usr/bin/ansible-console 基于Console界面与用户交互执行的工具
  • /usr/bin/ansible-galaxy 下载/上传优秀代码或Roles模块的的官网平台

利用ansible实现管理的主要方式:

  • Ansible Ad-Hoc 即利用ansible命令,主要用于临时命令使用场景
  • Ansible playbook 主要用于长期规划好的,大型项目的场景,需要有前期的规划过程

ansible 使用前准备

ansible 相关工具大多数是通过ssh协议,实现对远程主机的配置管理、应用部署、任务执行等功能

建议:使用此工具前,先配置ansible主控端能基于密钥认证的方式联系各个被管理节点

范例:利用sshpass批量实现基于key验证脚本

#!/bin/bash
PASS=123456
#设置网段最后的地址,4-255之间,越小扫描越快
END=254

IP=`ip a s eth0 | awk -F'[ /]+' 'NR==3{print $3}'`
NET=${IP%.*}.

rm -f /root/.ssh/id_rsa
[ -e ./SCANIP.log ] && rm -f SCANIP.log
for((i=3;i<="$END";i++));do
ping -c 1 -w 1 ${NET}$i &> /dev/null && echo "${NET}$i" >> SCANIP.log &
done
wait

ssh-keygen -P "" -f /root/.ssh/id_rsa
rpm -q sshpass || yum -y install sshpass
sshpass -p $PASS ssh-copy-id -o StrictHostKeyChecking=no $IP

AliveIP=(`cat SCANIP.log`)
for n in ${AliveIP[*]};do
sshpass -p $PASS scp -o StrictHostKeyChecking=no -r /root/.ssh root@${n}:
done

#把.ssh/known_hosts拷贝到所有主机,使它们第一次互相访问时不需要输入回车
for n in ${AliveIP[*]};do
scp /root/.ssh/known_hosts ${n}:.ssh/
done

1.4.1 ansible-doc

此工具用来显示模块帮助

格式

ansible-doc [options] [module...]
-l, --list #列出可用模块
-s, --snippet #显示指定模块的playbook片段

#列出所有模块
ansible-doc -l
#查看指定模块帮助用法
ansible-doc ping
#查看指定模块帮助用法
ansible-doc -s ping

1.4.2 ansible

Ansible Ad-Hoc 的执行方式的主要工具就是 ansible

格式:

ansible <host-pattern> [-m module_name] [-a args]

选项说明:

--version           #显示版本
-m module #指定模块,默认为command
-v #详细过程 -vv -vvv更详细
--list-hosts #显示主机列表,可简写 --list
-C, --check #检查,并不执行
-T, --timeout=TIMEOUT #执行命令的超时时间,默认10s
-k, --ask-pass #提示输入ssh连接密码,默认Key验证
-u, --user=REMOTE_USER #执行远程执行的用户,默认root
-b, --become #代替旧版的sudo 切换
--become-user=USERNAME #指定sudo的runas用户,默认为root
-K, --ask-become-pass #提示输入sudo时的口令
-f FORKS, --forks FORKS #指定并发同时执行ansible任务的主机数

ansible的Host-pattern

用于匹配被控制的主机的列表
All :表示所有Inventory中的所有主机

#或关系
ansible "websrvs:dbsrvs" -m ping
#逻辑与
ansible "websrvs:&dbsrvs" -m ping #在websrvs组并且在dbsrvs组中的主机
#逻辑非
ansible 'websrvs:!dbsrvs' -m ping #在websrvs组,但不在dbsrvs组中的主机 注意:此处为单引号
#正则表达式
ansible "~(web|db).*\.magedu\.com" -m ping

ansible命令执行过程

  1. 加载自己的配置文件,默认/etc/ansible/ansible.cfg
  2. 加载自己对应的模块文件,如:command
  3. 通过ansible将模块或命令生成对应的临时py文件,并将该文件传输至远程服务器的对应执行用户$HOME/.ansible/tmp/ansible-tmp-数字/XXX.PY文件
  4. 给文件+x执行
  5. 执行并返回结果
  6. 删除临时py文件,退出

ansible 的执行状态:

[root@centos8 ~]#grep -A 14 '\[colors\]' /etc/ansible/ansible.cfg
[colors]
#highlight = white
#verbose = blue
#warn = bright purple
#error = red
#debug = dark gray
#deprecate = purple
#skip = cyan
#unreachable = red
#ok = green
#changed = yellow
#diff_add = green
#diff_remove = red
#diff_lines = cyan
  • 绿色:执行成功并且不需要做改变的操作
  • 黄色:执行成功并且对目标主机做变更
  • 红色:执行失败

1.4.3 ansible-vault

此工具可以用于加密解密yml文件

格式:

ansible-vault [create|decrypt|edit|encrypt|rekey|view]

ansible-vault encrypt hello.yml #加密
ansible-vault decrypt hello.yml #解密
ansible-vault view hello.yml #查看
ansible-vault edit hello.yml #编辑加密文件
ansible-vault rekey hello.yml #修改口令
ansible-vault create new.yml #创建新文件

1.5 Ansible 常用模块

官方常用模块帮助文档参考:

https://docs.ansible.com/ansible/2.9/modules/modules_by_category.html
https://docs.ansible.com/ansible/2.9/modules/list_of_all_modules.html

1.5.1 Command 模块

功能:在远程主机执行命令,此为默认模块,可忽略 -m 选项

注意:此命令不支持 $VARNAME < > | ; & 等,可能用shell模块实现

注意:此模块不具有幂等性

常用参数:

chdir:      #执行操作前先切换目录
creates: #指定的文件存在,则不执行操作
removes: #指定的文件不存在,则不执行操作

范例:

[root@ansible <sub>]#ansible web -m command -a "chdir=/etc cat centos-release"
10.0.0.7 | CHANGED | rc=0 >>
CentOS Linux release 7.9.2009 (Core)
10.0.0.17 | CHANGED | rc=0 >>
CentOS Linux release 7.9.2009 (Core)

[root@ansible </sub>]#ansible web -m command -a "chdir=/etc creates=/data/f1 cat redhat-release"
10.0.0.7 | CHANGED | rc=0 >>
CentOS Linux release 7.9.2009 (Core)
10.0.0.17 | SUCCESS | rc=0 >>
skipped, since /data/f1 exists

[root@ansible ~]#ansible web -m command -a "chdir=/etc removes=/data/f1 cat redhat-release"
10.0.0.7 | SUCCESS | rc=0 >>
skipped, since /data/f1 does not exist
10.0.0.17 | CHANGED | rc=0 >>
CentOS Linux release 7.9.2009 (Core)

1.5.2 Shell 模块

功能:和command相似,用shell执行命令,支持各种符号 比如:*,$,>

注意:此模块不具有幂等性

范例:

[root@ansible <sub>]#ansible web -m shell -a "cat /etc/redhat-release > /data/f1"
10.0.0.7 | CHANGED | rc=0 >>

10.0.0.17 | CHANGED | rc=0 >>

[root@ansible </sub>]#ansible web -m shell -a "chdir=/data cat f1"
10.0.0.7 | CHANGED | rc=0 >>
CentOS Linux release 7.9.2009 (Core)
10.0.0.17 | CHANGED | rc=0 >>
CentOS Linux release 7.9.2009 (Core)

#将shell模块代替command,设置为默认模块
[root@ansible ~]#vim /etc/ansible/ansible.cfg
module_name = shell

1.5.3 Script 模块

功能:在远程主机上运行ansible服务器上的脚本,无需执行权限

范例:

[root@ansible <sub>]#vim host.sh
[root@ansible </sub>]#ansible db -m script -a "/root/host.sh"
10.0.0.17 | CHANGED => {
"changed": true,
"rc": 0,
"stderr": "Shared connection to 10.0.0.17 closed.\r\n",
"stderr_lines": [
"Shared connection to 10.0.0.17 closed."
],
"stdout": "master1\r\n",
"stdout_lines": [
"master1"
]
}
10.0.0.27 | CHANGED => {
"changed": true,
"rc": 0,
"stderr": "Shared connection to 10.0.0.27 closed.\r\n",
"stderr_lines": [
"Shared connection to 10.0.0.27 closed."
],
"stdout": "slave2\r\n",
"stdout_lines": [
"slave2"
]
}

1.5.4 Copy模块

功能:从ansible服务器主控端复制文件到远程主机

注意:src=file 如果没指明路径,则为当前目前或当前目录下的files目录下的file文件

参数:

src 本地文件的路径

dest 远程主机的路径

mode 复制到被管理主机;文件所属的权限

owner 复制到被管理主机 属主

group 复制到被管理主机 属组

content 要写的内容

范例:

#如果存在,默认覆盖,此处指定先备份
[root@ansible <sub>]#ansible web -m copy -a "src=/root/host.sh dest=/data/host.sh owner=mysql group=mysql mode=755 backup=yes"
#指定内容,生成目标文件
[root@ansible </sub>]#ansible 10.0.0.202 -m copy -a "content='test line1\n test line2\n' dest=/data/test.txt"
[root@ubuntu2004 data]#cat test.txt
test line1
test line2

[root@ansible <sub>]#ansible 10.0.0.17 -a "ls -l /data"
10.0.0.17 | CHANGED | rc=0 >>
total 24
-rw-r--r-- 1 root root 37 May 14 11:39 f1
-rwxr-xr-x 1 mysql mysql 27 May 14 11:54 host.sh
-rw-r--r-- 1 root root 0 May 14 11:54 host.sh.2660.2022-05-14@11:54:36</sub>

#复制/etc目前自身,注意/etc/后面没有/
[root@ansible <sub>]#ansible web -m copy -a "src=/etc dest=/data"

#复制/etc/下的文件,不包括/etc/目前自身, 注意/etc/后面带/
[root@ansible </sub>]#ansible web -m copy -a "src=/etc/ dest=/data"

1.5.5 Get_url 模块

功能:用于将文件从http,https或ftp下载到被管理的主机节点上

常用参数:

url: 下载文件的URL,支持HTTP,HTTPS或FTP协议
dest: 下载到目标路径(绝对路径),如果目标是一个目录,就用服务器上面文件的名称,如果目标设置了名称就用目标设置的名称
owner:指定属主
group:指定属组
mode:指定权限
force: 如果yes,dest不是目录,将每次下载文件,如果内容改变,替换文件。如果否,则只有在目标不存在时才会下载该文件
checksum: 对目标文件在下载后计算摘要,以确保其完整性
示例: checksum="sha256:D98291AC[...]B6DC7B97",
checksum="sha256:http://example.com/path/sha256sum.txt"
url_username: 用于HTTP基本认证的用户名。 对于允许空密码的站点,此参数可以不使用`url_password'
url_password: 用于HTTP基本认证的密码。 如果未指定`url_username'参数,则不会使用`url_password'参数
validate_certs:如果“no”,SSL证书将不会被验证。 适用于自签名证书在私有网站上使用
timeout: URL请求的超时时间,秒为单位

范例:

[root@ansible ~]#ansible web -m get_url -a 'url=http://nginx.org/download/nginx-1.18.0.tar.gz dest=/usr/local/src/nging.tar.gz checksum="md5:b2d33d24d89b8b1f87ff5d251aa27eb8"'

1.5.6 Fetch模块

功能:从远程主机提前文件到ansible的主控端,和copy相反,目前不支持目录

范例:

[root@ansible <sub>]#ansible all -m fetch -a "src=/etc/redhat-release dest=/data"
[root@ansible </sub>]#ansible 10.0.0.7 -a "tree /data"
10.0.0.7 | CHANGED | rc=0 >>
/data
├── 10.0.0.17
│   └── etc
│   └── redhat-release
├── 10.0.0.27
│   └── etc
│   └── redhat-release
├── 10.0.0.7
│   └── etc
│   └── redhat-release

1.5.7 File 模块

功能:创建文件属性,创建软链接等

范例:

#创建空文件,并修改文件属性
[root@ansible <sub>]#ansible 10.0.0.17 -m file -a "path=/data/test.sh state=touch owner=mysql group=mysql mode=755 state=touch "
10.0.0.17 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": true,
"dest": "/data/test.sh",
"gid": 1000,
"group": "mysql",
"mode": "0755",
"owner": "mysql",
"size": 0,
"state": "file",
"uid": 1000

#删除文件
[root@ansible </sub>]#ansible 10.0.0.17 -m file -a "path=/data/test.sh state=absent "

#创建软链接,文件本身先要存在
[root@ansible <sub>]#ansible 10.0.0.17 -m file -a "src=/data/testfile state=link dest=/data/testfile-link"
[root@master1 data]#ll testfile-link
lrwxrwxrwx 1 root root 14 May 14 16:42 testfile-link -> /data/testfile

#创建目录
[root@ansible </sub>]#ansible web -m file -a "path=/data/mysql state=directory"
#递归修改目录及子目录属性
[root@ansible ~]#ansible web -m file -a "path=/data/mysql state=directory owner=mysql group=mysql recurse=yes"

1.5.8 stat 模块

功能:检查文件或文件系统的状态,对于Windows目标,改用win_stat模块

选项:
path: 文件/对象的完整路径(必须)

常用的返回值判断:
exists: 判断是否存在
isuid: 调用用户的ID与所有ID是否匹配

范例:

[root@ansible <sub>]#ansible 127.0.0.1 -m stat -a "path=/etc/redhat-release"
[root@ansible </sub>]#ansible 127.0.0.1 -m stat -a "path=/etc/f1"
127.0.0.1 | SUCCESS => {
"changed": false,
"stat": {
"exists": false
}
}

1.5.9 unarchive 模块

功能:解压缩解包

实现的两种用法:

  1. 将ansible主机上的压缩包传到远程主机后解压缩至特定目录,设置copy=yes,此为默认值,代表文件在ansible主机
  2. 将远程主机的某个压缩包解压缩到指定的路径下,设置为copy=no,no代表文件在远程主机上

常见参数:

copy:     #默认为yes,当copy=yes,拷贝的文件是从ansible主机复制到远程主机上,如果设置为copy=no,会在远程主机上寻找src源文件
src: #源路径,可以是ansible主机上的路径,也可以是远程主机(被管理端或第三方主机)上的路径,如果是远程主机上的路径,则需要设置copy=no
dest: #远程主机上的目标路径
mode: #设置解压缩后的文件权限

范例:

#文件在ansible主机
[root@ansible <sub>]#ansible web -m unarchive -a "src=/usr/local/src/nging.tar.gz dest=/root/"
#第三方主机
[root@ansible </sub>]#ansible web -m unarchive -a "src=http://nginx.org/download/nginx-1.18.0.tar.gz dest=/usr/local/src/ copy=no"

1.5.10 archive 模块

功能:打包压缩保存在被管理节点

范例:

[root@ansible ~]#ansible web -m archive -a "path=/usr/local/src/nginx-1.18.0/  dest=/usr/local/src/nginx.tar.gz format=gz"

1.5.11 Cron 模块

功能:计划任务

支持时间:minute,hour,day,month,weekday,任务事件文件本身在被管理节点

范例:

#创建计划任务
[root@ansible <sub>]#ansible 10.0.0.27 -m cron -a 'hour=2 minute=30 weekday=1-5 name="msyql backup" job=/data/msyql_backup.sh'
[root@ansible </sub>]#ansible web -m cron -a "minute=*/5 job='/usr/sbin/ntpdate ntp.aliyun.com&>/dev/null' name=Synctime"
#禁用计划任务
[root@ansible <sub>]#ansible 10.0.0.27 -m cron -a 'hour=2 minute=30 weekday=1-5 name="msyql backup" job=/data/msyql_backup.sh disabled=yes'
#启动计划任务
[root@ansible </sub>]#ansible 10.0.0.27 -m cron -a 'hour=2 minute=30 weekday=1-5 name="msyql backup" job=/data/msyql_backup.sh disabled=no'
#删除计划任务
[root@ansible ~]#ansible 10.0.0.27 -m cron -a 'name="msyql backup" state=absent'

1.5.12 hostname 模块

功能:管理主机名

范例:

[root@ansible ~]#ansible 10.0.0.27 -m hostname -a 'name=db-node1.org'

1.5.13 Yum 和 Apt 模块

功能:

yum 管理软件包,只支持REHL,Centos,Fedora

Apt 管理Debian 相关版本的软件包

范例:

#安装包
[root@ansible <sub>]#ansible 10.0.0.17 -m yum -a "name=httpd,vsftpd state=present"
10.0.0.17 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"msg": "",
"rc": 0,
"results": [
"httpd-2.4.6-97.el7.centos.5.x86_64 providing httpd is already installed",
"vsftpd-3.0.2-29.el7_9.x86_64 providing vsftpd is already installed"
]
}
#启用EPEL源安装
[root@ansible </sub>]#ansible 'web:!10.0.0.202' -m yum -a "name=sl,cowsay state=present enablerepo=epel"
#删除
[root@ansible <sub>]#ansible 'web:!10.0.0.202' -m yum -a "name=sl,cowsay state=absent"
# apt 安装
[root@ansible </sub>]#ansible 10.0.0.202 -m apt -a "name=sl,cowsay,cmatrix,x11-apps"

1.5.14 Service 模块

功能:管理服务

范例:

#启动服务,并设置开机启动
[root@ansible <sub>]#ansible 10.0.0.17 -m service -a "name=vsftpd state=started enabled=yes"
#关闭服务和开机启动
[root@ansible </sub>]#ansible 10.0.0.17 -m service -a "name=vsftpd state=stopped enabled=no"

1.5.15 user 模块

功能:管理用户

范例:

#创建用户
[root@ansible <sub>]#ansible web -m user -a 'name=user1 comment="test user" uid=2048 home=/app/user1 group=root'
#remove=yes表示删除用户及家目录数据,默认remove=no
[root@ansible </sub>]#ansible web -m user -a 'name=user1 state=absent remove=yes'

1.5.16 Group 模块

功能:管理组

范例:

#创建组
[root@ansible <sub>]#ansible web -m group -a 'name=nginx gid=88 system=yes'
#删除组
[root@ansible </sub>]#ansible web -m group -a "name=nginx state=absent"

1.5.17 Lineinfile 和 Replace 模块

功能: 相当于sed,可以修改文件内容

regexp参数

使用正则表达式匹配对应的行,当替换文本时,如果有多行文本都能被匹配,则只有最后面被匹配到的那行文本才会被替换,当删除文本时,如果有多行文本都能被匹配,这么这些行都会被删除。  
  1. 一般在ansible当中去修改某个文件的单行进行替换的时候使用 lineinfile 模块
  2. 如果想进行多行匹配进行替换需要使用replace 模块
#替换时,多行被匹配,只有最后匹配的行被替换
[root@ansible <sub>]#ansible 10.0.0.17 -m lineinfile -a 'path=/etc/httpd/conf/httpd.conf regexp="^Listen" line="Listen 8080"'
#删除时,多行被匹配,匹配的行都删除
[root@ansible </sub>]#ansible 10.0.0.202 -m lineinfile -a "path=/etc/fstab state=absent regexp='^#'"

#replace模块基于正则进行匹配和替换,建议使用
[root@ansible <sub>]#ansible web -m replace -a "path|dest=/etc/fstab regexp='^(UUID.*)' replace='#\1'"
[root@ansible </sub>]#ansible web -m replace -a "dest|path=/etc/fstab regexp='^#(UUID.*)' replace='\1'"

Ansible 入门和常用模块_ansible

Ansible 入门和常用模块_ansible_02

1.5.18 Selinux 模块

功能: 管理selinux 策略

范例:

[root@ansible ~]#ansible 10.0.0.202 -m selinux -a "state=disabled"

1.5.19 Reboot 模块

[root@ansible ~]#ansible 10.0.0.17 -m reboot

1.5.20 Setup 模块

功能: setup 模块来收集主机的系统信息,这些 facts 信息可以直接以变量的形式使用,但是如果主机

较多,会影响执行速度

范例:

ansible all -m setup
ansible all -m setup -a "filter=ansible_nodename"
ansible all -m setup -a "filter=ansible_hostname"
ansible all -m setup -a "filter=ansible_domain"
ansible all -m setup -a "filter=ansible_memtotal_mb"
ansible all -m setup -a "filter=ansible_memory_mb"
ansible all -m setup -a "filter=ansible_memfree_mb"
ansible all -m setup -a "filter=ansible_os_family"
ansible all -m setup -a "filter=ansible_distribution_major_version"
ansible all -m setup -a "filter=ansible_distribution_version"
ansible all -m setup -a "filter=ansible_processor_vcpus"
ansible all -m setup -a "filter=ansible_all_ipv4_addresses"
ansible all -m setup -a "filter=ansible_architecture"
ansible all -m setup -a "filter=ansible_uptime_seconds"
ansible all -m setup -a "filter=ansible_processor*"
ansible all -m setup -a 'filter=ansible_env'

1.5.21 debug 模块

此模块可以用于输出信息,并且通过 msg 定制输出的信息内容

注意: msg后面的变量有时需要加 "" 引起来

范例:debug 模块默认输出 Hello world

[root@ansible ~]#ansible 10.0.0.202 -m debug 
10.0.0.202 | SUCCESS => {
"msg": "Hello world!"
}
# msg 后面变量用 "" 引起来,来自setup模块中的变量
msg: Host "{{ ansible_nodename }}" Ip "{{ ansible_default_ipv4.address
}}"


举报

相关推荐

0 条评论