1.ansible是一个基于python开发的自动化运维工具
2.ansible是一个基于ssh协议实现远程管理的工具
3.ansible软件可以实现多种批量管理操作(批量系统配置、批量软件部署、批量文件拷贝)
1.ansible软件服务端:不需要启动任何服务,默认服务端不需要任何的配置
2.ansible软件客户端:没有客户端软件安装
管理主机m01
受控主机:其他
建议基于ssh密钥方式建立远程链接
1.ssh密钥对创建(管理主机)
ssh-keygen -t dsa -f /root/.ssh/id_dsa -N ""
-f /root/.ssh/id_dsa --指定私钥的存放路径
-N "" or -P "" --私钥文件密码设定
2.公钥文件分发
sshpass -p123 ssh-copy-id -i /root/.ssh/id_dsa.pub "-o StrictHostKeyChecking=no" 172.16.1.31
sshpass -p123 --免交互式输入密码
-o StrictHostKeyChecking=no --不检查
编写脚本批量分发并检查
[root@m01 scripts]# vim fenfa_key.sh
#!/bin/sh
export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
if [ ! -f /root/.ssh/id_dsa ];then
ssh-keygen -t dsa -f /root/.ssh/id_dsa -N ""
else
for n in 31 41 7
do
sshpass -p123 ssh-copy-id -i /root/.ssh/id_dsa.pub "-o StrictHostKeyChecking=no" 172.16.1.$n>/dev/null
2>&1
ssh 172.16.1.$n hostname
done
fi
补充
shift的作用
若用户要求Shell在不知道变量个数的情况下,还能逐个处理参数,也就是在$1之后是$2,$2之后是$3。在未运行shift命令之前$1是可用的,当使用shift命令之后,原来的$2会变成$1,并且原有的 1 变 得 不 可 用 , 通 过 1变得不可用,通过 1变得不可用,通过#命令获得的参数个数也会少1。
#测试shift命令(x_shift.sh)
until [ $# -eq 0 ]
do
echo "第一个参数为: $1 参数个数为: $#"
shift
done
执行以上程序x_shift.sh:
$./x_shift.sh 1 2 3 4
结果显示如下:
第一个参数为: 1 参数个数为: 4
第一个参数为: 2 参数个数为: 3
第一个参数为: 3 参数个数为: 2
第一个参数为: 4 参数个数为: 1
shift命令一次移动参数的个数由其所带的参数指定。例如当shell程序处理完前九个命令行参数后,可以使用shift9命令把$10移到$1。
主控端软件安装
yum -y install ansible
受控端软件安装(可选)
yum -y install libselinux-python <---解决selinux开启后selinux阻止
3.4 ansible软件受控主机添加配置
/etc/ansible/hosts 《===配置管理的主机
[dxy]
172.16.1.31 ansible_user=root ansible_password=123 <==可以指定账号和密码信息
172.16.1.41
172.16.1.7
ansible.cfg 《===ansible的配置文件
[root@m01 ansible]# ansible dxy -m command -a "hostname"
172.16.1.41 | CHANGED | rc=0 >>
backup
172.16.1.7 | CHANGED | rc=0 >>
web01
172.16.1.31 | CHANGED | rc=0 >>
nfs01
参数 | 含义 |
---|---|
dxy | 组名称 |
-m | 指定模块信息 |
-a | 利用模块中某些参数功能 |
-k | 基于交互式输入密码 |
absible-doc -l 查看模块
ansible常用模块:command shell copy script file systemd yum mount
简介:
命令模块采用命令名,后跟空格分隔的参数列表。给定的命令将在所有选定的节点上执行。命令不会通过shell处理,因此$home之类的变量和“<”、“>”、“”、“;”和“&”之类的操作将不起作用。如果需要这些特性,请使用shell模块。
要创建更易于读取的命令任务,请使用args task关键字传递参数。
对于windows目标,请改用win_命令模块。
官方网站:https://docs.ansible.com/ansible/latest/modules/command_module.html#command-module
参数 | 作用 |
---|---|
chdir | 先切换到别的目录下在执行命令 |
creates | 当文件存在时就不执行后边的命令 |
removes | 当文件不存在时不执行后边的命令 |
chdir实例
[root@m01 ansible]# ansible 172.16.1.31 -m command -a "chdir=/tmp pwd"
172.16.1.31 | CHANGED | rc=0 >>
/tmp
creates实例
[root@m01 ansible]# ansible 172.16.1.31 -m command -a "creates=/tmp pwd"
172.16.1.31 | SUCCESS | rc=0 >>
skipped, since /tmp exists
[root@m01 ansible]# ansible 172.16.1.31 -m command -a "creates=/tmp1 pwd"
172.16.1.31 | CHANGED | rc=0 >>
/root
removes实例
[root@m01 ansible]# ansible 172.16.1.31 -m command -a "removes=/tmp hostname"
172.16.1.31 | CHANGED | rc=0 >>
nfs01
[root@m01 ansible]# ansible 172.16.1.31 -m command -a "removes=/tmp1 hostname"
172.16.1.31 | SUCCESS | rc=0 >>
skipped, since /tmp1 does not exist
可以使用特殊符号,shell模块支持command模块的所有功能
chdir实例
[root@m01 ansible]# ansible 172.16.1.31 -m shell -a "chdir=/tmp pwd"
172.16.1.31 | CHANGED | rc=0 >>
/tmp
creates实例
[root@m01 ansible]# ansible 172.16.1.31 -m shell -a "creates=/tmp pwd"
172.16.1.31 | SUCCESS | rc=0 >>
skipped, since /tmp exists
[root@m01 ansible]# ansible 172.16.1.31 -m shell -a "creates=/tmp1 pwd"
172.16.1.31 | CHANGED | rc=0 >>
/root
removes实例
[root@m01 ansible]# ansible 172.16.1.31 -m shell -a "removes=/tmp hostname"
172.16.1.31 | CHANGED | rc=0 >>
nfs01
[root@m01 ansible]# ansible 172.16.1.31 -m shell -a "removes=/tmp1 hostname"
172.16.1.31 | SUCCESS | rc=0 >>
skipped, since /tmp1 does not exist
简介:
Runs a local script on a remote node after transferring it
实例:
ansible 172.16.1.31 -m script -a "/server/scripts/yum.sh"
synop
复制模块将文件从本地或远程计算机复制到远程计算机上的某个位置。
使用fetch模块将文件从远程位置复制到本地框。
如果在复制的文件中需要变量插值,请使用模板模块。在内容字段中使用变量将导致不可预测的输出。
对于windows目标,请改用win_copy模块sis
参数 | 含义 |
---|---|
src | 要复制文件本地的路径,如果是目录/结尾,复制的时候不包含目录 |
dest | 应将文件复制到的远程绝对路径。如果src是一个目录,那么它也必须是一个目录。如果DEST是一个不存在的路径,如果要么以“//”结束,要么SRC是一个目录,则创建DEST。如果dest是相对路径,则起始目录由远程主机确定。如果SRC和DEST是文件,则未创建DEST的父目录,如果该任务不存在,则任务失败。 |
backup | 创建一个包含时间戳信息的备份文件,以便在不正确地删除原始文件时可以将其取回。 |
owner | 应该拥有该文件/目录的用户的名称,该名称将被馈送给chown。 |
group | 设置文件所属组 |
mode | 设置复制后的文件权限 例如:600 755 等等 |
src与dest实例
ansible 172.16.1.31 -m copy -a "src=1.txt dest=./"
backup
[root@m01 ~]# ansible 172.16.1.31 -m copy -a "src=1.txt dest=./ backup=yes"
172.16.1.31 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"backup_file": "./1.txt.22000.2019-11-01@17:08:50~",
"changed": true,
"checksum": "47f5487a006fd6ce0f74306c7c8594b219b72d08",
"dest": "./1.txt",
"gid": 0,
"group": "root",
"md5sum": "91dc86f0a5e0bede58197f3f22883180",
"mode": "0644",
"owner": "root",
"secontext": "unconfined_u:object_r:admin_home_t:s0",
"size": 188,
"src": "/root/.ansible/tmp/ansible-tmp-1572599329.88-195785710959257/source",
"state": "file",
"uid": 0
}
[root@m01 ~]# ansible 172.16.1.31 -m shell -a "ls ./1.txt*"
172.16.1.31 | CHANGED | rc=0 >>
./1.txt
./1.txt.22000.2019-11-01@17:08:50~
synopsis
设置文件、符号链接或目录的属性。
或者,删除文件、符号链接或目录。
许多其他模块支持与文件模块相同的选项,包括复制、模板和组装。
对于Windows目标,请改用Win_文件模块。
[root@m01 ~]# ansible 172.16.1.31 -m file -a "path=/tmp/1.txt owner=test group=test mode=600"
172.16.1.31 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": true,
"gid": 1000,
"group": "test",
"mode": "0600",
"owner": "test",
"path": "/tmp/1.txt",
"secontext": "unconfined_u:object_r:user_tmp_t:s0",
"size": 0,
"state": "file",
"uid": 1000
}
path是路径 相当于dest
state:用于指定创建
[root@m01 ~]# ansible 172.16.1.31 -m file -a "dest=/tmp/1.txt state=file"
[root@m01 ~]# ansible 172.16.1.31 -m file -a "dest=/tmp/dir state=directory"
简介(synopsis)
使用yum包管理器安装、升级、降级、删除和列出包和组。
此模块仅适用于Python2如果需要Python 3支持,请参阅dnf模块。
参数 | 含义 |
---|---|
name | 需要安装软件的名称 |
state | installed安装absent卸载 |
list | 指定软件的名称查看是否可以安装,以及是否已经安装过了 |
ansible 172.16.1.31 -m yum -a "name=iftop state=removed"
ansible 172.16.1.31 -m yum -a "name=iftop state=installed"
ansible 172.16.1.31 -m yum -a "list=iftop"
synopsis
控制远程主机上的服务支持的init系统包括bsd init、openrc、sysv、solaris smf、systemd和upstart。
对于Windows目标,请改用Win_服务模块。
参数 | 含义 |
---|---|
name | 指定管理的服务名称(管理的服务一定在chkconfig中可以看到) |
state | 对应的状态 reloaded restarted stopped started |
enabled | 服务是否开机自启动 yes no |
synopsis
控制远程主机上的系统服务。
参数 | 含义 |
---|---|
name | 指定管理的服务名称(管理的服务一定在chkconfig中可以看到) |
state | 对应的状态 reloaded restarted stopped started |
enabled | 服务是否开机自启动 yes no |
synopsis
使用此模块管理crontab和环境变量项。此模块允许您创建环境变量和命名的crontab条目、更新或删除它们。
当crontab作业被管理时:模块包含一行crontab条目“ansibe:”的描述,与传递给模块的“name”相对应,将来ansibe/module调用将使用该条目查找/检查状态。“name”参数应该是唯一的,更改“name”值将导致创建一个新的cron任务(或删除另一个任务)。
管理环境变量时,不添加注释行,但是,当模块需要查找/检查状态时,它使用“name”参数来查找环境变量定义行。
使用%等符号时,必须正确转义。
name :给定时任务定义名称
state=absent :删除一条规则
disabled=yes :注释定时任务
minute=0-59 or * or */ 分钟
hour=0-23 |* */ 时
day=1-31 | * */ 日
month 月 weekday 周 job=对应的命令 默认是*
[root@m01 ~]# ansible 172.16.1.31 -m cron -a "name=test01 minute=0 hour=0 job='/usr/sbin/sh /server/scripts/test.sh >/dev/null 2>&1'"
172.16.1.31 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": true,
"envs": [],
"jobs": [
"test01"
]
}
[root@m01 ~]# ansible 172.16.1.31 -m command -a "crontab -l"
172.16.1.31 | CHANGED | rc=0 >>
##time update
*/5 * * * * /usr/sbin/ntpdate ntp1.aliyun.com >/dev/null 2>&1
###Pack and backup at 00:00 every day####
###00 00 * * * /usr/bin/sh /server/scripts/back.sh >/dev/null 2>&1
#Ansible: test01
0 0 * * * /usr/sbin/sh /server/scripts/test.sh >/dev/null 2>&1
[root@m01 ~]# ansible 172.16.1.31 -m cron -a "name=test01 minute=0 hour=0 job='/usr/sbin/sh /server/scripts/test.sh >/dev/null 2>&1' disabled=yes"
172.16.1.31 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": true,
"envs": [],
"jobs": [
"test01",
"None"
]
}
[root@m01 ~]# ansible 172.16.1.31 -m command -a "crontab -l" 172.16.1.31 | CHANGED | rc=0 >>
##time update
*/5 * * * * /usr/sbin/ntpdate ntp1.aliyun.com >/dev/null 2>&1
###Pack and backup at 00:00 every day####
###00 00 * * * /usr/bin/sh /server/scripts/back.sh >/dev/null 2>&1
#Ansible: test01
#0 0 * * * /usr/sbin/sh /server/scripts/test.sh >/dev/null 2>&1
[root@m01 ~]# ansible 172.16.1.31 -m cron -a "name=test01 state=absent" 172.16.1.31 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": true,
"envs": [],
"jobs": [
"None"
]
}
[root@m01 ~]# ansible 172.16.1.31 -m command -a "crontab -l"
172.16.1.31 | CHANGED | rc=0 >>
##time update
*/5 * * * * /usr/sbin/ntpdate ntp1.aliyun.com >/dev/null 2>&1
###Pack and backup at 00:00 every day####
###00 00 * * * /usr/bin/sh /server/scripts/back.sh >/dev/null 2>&1
编写的规范:
https://docs.ansible.com/ansible/latest/reference_appendices/YAMLSyntax.html
遵循pyyaml
语法格式:
host:
tasks:
--内容
实例:
- hosts: webservers
vars:
http_port: 80
max_clients: 200
remote_user: root
tasks:
- name: ensure apache is at the latest version
yum:
name: httpd
state: latest
- name: write the apache config file
template:
src: /srv/httpd.j2
dest: /etc/httpd.conf
notify:
- restart apache
- name: ensure apache is running
service:
name: httpd
state: started
handlers:
- name: restart apache
service:
name: httpd
state: restarted
4.3.3 空格的用法说明
对编写的内容进行分级时,需要有两个空格表示分级
软件安装步骤:
- server端安装步骤:
第一步:
第二步:
- 客户端安装步骤:
[root@m01 ~]# vim 1.yml
- hosts: 172.16.1.7
tasks:
- name: instsll nginx
yum: name=nginx state=installed
- name: check install
shell: rpm -qa|grep nginx
- name: start nginx
systemd: name=nginx state=started
- name: check start
shell: ss -lntup|grep nginx
4.4.2 测试模拟运行
[root@m01 ~]# ansible-playbook -C 1.yml ##调试
[root@m01 ~]# ansible-playbook 1.yml ##运行
测试安装成功
服务端自动安装配置启动服务,客户端自动挂载
[root@m01 yml]# cat nfs.yml
- hosts: 172.16.1.31
vars:
packe:
- rpcbind
- nfs-utils
tasks:
- name: yum install nfs rpcbind
yum: name={{ packe }} state=present
- name: copy nfs configure
copy: src=/server/ansible/conf/nfs/exports dest=/etc/
- name: create /data directory
file: dest=/data state=directory owner=nfsnobody group=nfsnobody
- name: start nfs rpcbind
systemd: name={{ item }} state=started enabled=yes
with_items:
- rpcbind
- nfs
- hosts: 172.16.1.7
tasks:
- name: yum install nfs-utils
yum: name=nfs-utils state=present
- name: create file /www
file: dest=/www state=directory
- name: start rpc
systemd: name=rpcbind state=started enabled=yes
- name: mount
mount: name=/www src=172.16.1.31:/data fstype=nfs state=mounted