Ansible基础

# 一、Ansible基础

## 1.Ansible基础概述

1.1什么是Ansible

Ansible是一个IT自动化的配置管理工具,自动化主要体现在Ansible集成了丰富模块,丰富的功能组件,可以通过一个命令完成一系列的操作。进而能减少我们重复性的工作和维护成本,以提高工作的效率。

1.2Ansible可以完成哪些功能呢

1.2.1批量制行远程命令,可以对N多台主机同时进行命令的执行

1.2.2批量配置软件服务,可以进行自动化的方式配置和管理服务

1.2.3 实现软件开发功能,jumpserver底层使用ansible来实现的自动化管理

1.2.4编排高级的IT任务,Ansible的playbook是一门编程语言,可以用来描述一套IT架构

1.3 Ansible的特点

1.31容易学习,无代理模式,不像saltstack既要学服务端又要学习客户端,还要学习服务端与客户端之间的通讯协议
1.3.2操作灵活,体现在Ansible有较多的模块,提供了丰富的功能,playbook则提供了类似于编程语言的复杂功能
1.3.3简单易用,体现在Ansible —个命令可以完成很多事情
1.3.4安全可靠,因为Ansible使用了SSH协议进行通汛,既稳定又安全
1.3.5可移植性高,可以将写好的playbook拷贝至任意机器进行执行

4.Ansible架构中的控制节点、被控制节点、inventroy,ad-hoc,playbook、连接协议是什么?

# 二、Ansible的安全配置

## 2.1Ansible安装

| 外网地址 | 内网地址 | 角色 |
| --------- | ----------- | ------------- |
| 10.0.0.61 | 172.16.1.61 | Ansible控制端 |
| 10.0.0.7 | 172.16.1.7 | Ansible被控端 |
| 10.0.0.8 | 172.16.1.8 | Ansible被控端 |

2.1.1先安装epel源(提供最新的ansible)

```HTML
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
```

2.1.2安装Ansible

```HTML
yum install ansible -y
查看ansible的版本
[root@manager ~]# ansible --version
ansible 2.9.7
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
executable location = /usr/bin/ansible
python version = 2.7.5 (default, Oct 30 2018, 23:45:53) [GCC 4.8.5 20150623 (Red Hat 4.8.5-36)]
```

2.1.3Ansible的配置文件,配置文件可以随意放但有查找的顺序(配置文件查找的顺序)

```HTML
1.$ANSIBLE_CONFIG
2.当前目录下的ansible.cfg
3.当前用户家目录下的.ansible.cfg
4.查找/etc/ansible/ansible.cfg

[root@manager ~]# cat /etc/ansible/ansible.cfg
#inventory = /etc/ansible/hosts #主机列表配置文件 #library = /usr/share/my_modules/ #库文件存放目录
#remote_tmp = ~/.ansible/tmp #临时py文件存放在远程主机目录
#local_tmp = ~/.ansible/tmp #本机的临时执行目录
#forks = 5 #默认并发数
#sudo_user = root #默认sudo用户
#ask_sudo_pass = True #每次执行是否询问sudo的ssh密码
#ask_pass = True #每次执行是否询问ssh密码
#remote_port = 22 #远程主机端口
#host_key_checking = False #跳过检查主机指纹
#log_path = /var/log/ansible.log #ansible日志
```

# 三、Ineventory主机清单

3.1.1场景一、基于密码连接

```HTML
[root@manager ~]cat /etc/ansible/hosts
#方式一、主机+端口+密码
[webservers]
172.16.1.7 ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_pass='123456'
172.16.1.8 ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_pass='123456'
```

3.1.2场景二、基于密钥连接,需要先创建公钥和私钥,并下发公钥至被控端

```HTML
#1.在61服务器上生产密钥对
[root@manager ~]# ssh-keygen -C 1026044760@qq.com
#2.查看密钥
[root@manager ~]# ll ~/.ssh/
总用量 12
-rw------- 1 root root 1679 4月 20 11:11 id_rsa
-rw-r--r-- 1 root root 399 4月 20 11:11 id_rsa.pub
-rw-r--r-- 1 root root 534 4月 20 10:34 known_hosts
#3.将公钥推给被控的服务器
[root@manager ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub root@172.16.1.7
[root@manager ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub root@172.16.1.8
-------------------------------------------------------------------
1.创建一个项目目录
mkdir proj
2.在该项目下创建ansible.cfg、hosts
touch ansible.cfg hosts
3.ansible --version 查看加载的是哪个配置文件
4.最后在该目录下执行ansible webservers -m ping -i /root/proj/hosts
[root@manager proj]# cat ansible.cfg
[defaults]
inventory = ./proj/hosts
[root@manager proj]# cat hosts
[webservers]
web01 ansible_ssh_host=172.16.1.7 ansible_ssh_port=22
web02 ansible_ssh_host=172.16.1.8 ansible_ssh_port=22
----------------------------------------------------------------
[root@manager proj]# cat hosts
#方式一、主机+端口+密钥
[webservers]
172.16.1.7
172.16.1.8
[root@manager proj]# ansible webservers -m ping -i ./hosts 172.16.1.7 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"
}
172.16.1.8 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"
}
-----------------------------------------------------------------------
[root@manager proj]# cat hosts
#方式二、别名+主机+端口+密钥
[webservers]
web01 ansible_ssh_host=172.16.1.7 ansible_ssh_port=22
web02 ansible_ssh_host=172.16.1.8 ansible_ssh_port=22
[root@manager proj]# ansible webservers -m ping -i ./hosts web01 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"
}
web02 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"
}
```

3.1.3场景三、主机组使用方式

```HTML
#1.定义两个组
[webservers]
172.16.1.7
172.16.1.8
[lbservers]
172.16.1.5
172.16.1.6
#2.servers组包括两个子组[lbservers,webserver]
[servers:children]
[lbservers]
[webserver]
注意:
如果控制端和被控制端第一次通讯,需要先添加指纹信息,那如果机器特别多少的情况下怎么办?
仅需开启ansible中的 host_key_checking = False
```

# 四、Ad-Hos

1.常用模块

```HTML
command 执行shell命令(不支持管道等特殊字符)
shell 执行shell命令(支持管道等特殊字符)
scripts 执行shell脚本
yum_repository 配置yum仓库
get_url 联网下载
yum 安装
copy 配置
service、systemd 启动
user group 创建用户与组
file 授权
crond 定时任务
mount 挂载
firewalld
selinux
```

2.使用过程中需要先了解ansible-doc帮助手册

```HTML
[root@manager ~]# ansible-doc -l #查看所有模块说明
[root@manager ~]# ansible-doc copy #查看指定模块说明
[root@manager ~]# ansible-doc copy -s #表示指定模块参数
```

3.command默认执行bash命令模块,模块不支持重定向或管道技术

```HTML
[root@manager ansible_adhoc]# ansible webservers -m command -a 'ps -ef'

```

4.shell模块,支持管道技术(“万能的shell”)

```HTML
[root@manager ansible_adhoc]# ansible webservers -m shell -a 'ps -ef|grep nginx'

```

5.yum模块:安装软件模块

```HTML
name:软件包名称
httpd #指定要安装的软件包名称
file:// #指定从本地哪个目录安装rpm
https:// #指定从哪个网站安装rpm包
state:
present 安装
absent 卸载
latest 安装最新版
enablerepo 指定通过那个仓库下载
disablerepo 禁止从哪个仓库下载
download_only=true 仅下载软件包,不安装

```

6.yum模块示例

```HTML
#示例一、安装当前最新的Apache软件,如果存在则不安装
[root@manager ansible_adhoc]# ansible webservers -m yum -a 'name=httpd state=present'
#示例二、安装当前最新的Apache软件,通过epel仓库安装
[root@manager ansible_adhoc]# ansible webservers -m yum -a "name=httpd state=present enablerepo=epel"
#示例三、通过公网URL安装rpm软件
[root@manager ansible_adhoc]# ansible webservers -m yum -a "name=https://mirror.tuna.tsinghua.edu.cn/zabbix/zabbix/5.0/rhel/7/x86_64/zabbix-agent-5.0.0-1.el7.x86_64.rpm state=present"
#示例四、安装最新版本的Apache软件,如果存在则更新Apache
[root@manager ansible_adhoc]# ansible webservers -m yum -a "name=httpd state=latest"
#示例五、更新所有的软件包,但排除和kernel相关的
[root@manager ansible_adhoc]# ansible webservers -m yum -a "name=* state=latest exclude=kernel"
#示例六、删除Apache软件
[root@manager ansible_adhoc]# ansible webservers -m yum -a "name=httpd state=absent"

```

7.copy文件拷贝模块

```HTML
copy:拷贝当前目录下的文件到被控端指定的路径
scr 要拷贝的文件(相对路径 绝对路径)
dest 拷贝到目标主机的那个路径下
owner 设定文件的属主
group 设定文件的属组
mode 设定文件的权限
backup 备份
content 往目标主机文件中增加内容(相当于重定向)
1.将当前目录下的文件exports.j2拷贝到被控主机的/etc/exports 属主属组为root文件权限644
[root@manager ansible_adhoc]# ansible webservers -m copy -a "src=./exports.j2 dest=/etc/exports owner=root group=root mode=644"
2.将当前目录下的文件exports.j2拷贝到被控主机的/etc/exports 属主属组为root文件权限644并备份
[root@manager ansible_adhoc]# ansible webservers -m copy -a "src=./exports.j2 dest=/etc/exports owner=root group=root mode=644 backup=yes"
3.给被控制主机的/tmp/1.txt文件中写文件
[root@manager ansible_adhoc]# ansible webservers -m copy -a "content="123" dest=/tmp/1.txt"

```

8.group、user模块 创建用户组和用户

```HTML
group组模块
name 指定创建组名
gid 指定组的gid
state
absent 移除远端主机的组
present 创建远端主机的组
[root@manager ansible_adhoc]# ansible webservers -m group -a "name=www gid=666 state=present"
user模块
name 用户名称
uid uid
group 指定组
groups 指定附加组
shell 指定登录shell
create_home 创建用户的家目录
state
present 创建
absent 删除
remove 移除用户的相关的文件
[root@manager ansible_adhoc]# ansible webservers -m user -a "name=www uid=666 group=www shell=/no/login create_home=no state=present"
示例一、创建test用户、uid为555
[root@manager ansible_adhoc]# ansible webservers -m user -a "name=test uid=555"
示例二、移除test用户,同时移除家目录
[root@manager ansible_adhoc]# ansible webservers -m user -a "name=test uid=555 state=absent remove=yes"

#示例三、创建jsm用户,为其添加123作为登录密码,并且创建家目录
[root@manager ansible_adhoc]# ansible localhost -m debug -a "msg={{'123'|password_hash('sha512','salt')}}"
[root@manager ansible_adhoc]# ansible webservers -m user -a 'name=jsm password="$6$salt$jkHSO0tOjmLW0S1NFlw5veSIDRAVsiQQMTrkOKy4xdCCLPNIsHhZkIRlzfzIvKyXeGdOfCBoW1wJZPLyQ9Qx/1" create_home=yes'


```

9.file模块(创建文件或目录、授权)

```HTML
path 指定被控主机目录或文件的路径
recurse 递归授权
state 状态
directory 在被控端创建目录
touch 在被控端创建文件
link 创建链接文件
absent 表示删除文件或目录
mode 设置文件或目录的权限
owner 设置文件或目录属主
group 设置文件或目录的属组

#创建目录,/data 权限为755 属主www 属组www
[root@manager ansible_adhoc]# ansible webservers -m file -a "path=/data state=directory owner=www group=www mode=755 recurse=yes"
创建文件,/data/test 权限644 属主www 属组www
[root@manager ansible_adhoc]# ansible webservers -m file -a "path=/data/test state=touch owner=www group=www mode=644"

```

10.启动与停止 systemd|service (一模一样的模块)

```HTML
name 定义要启动服务的名称
state 指定服务的状态
started 启动服务
stopped 停止服务
restarted 重启服务
reloaded 重载服务
enabled 开机自启

启动nfs服务,并加入开机自启动
[root@manager ansible_adhoc]# ansible webservers -m systemd -a "name=nfs state=started enabled=yes"
停止nfs服务
[root@manager ansible_adhoc]# ansible webservers -m systemd -a "name=nfs state=stopped enabled=yes"


```

11.挂载模块mount

```HTML
path 被控端要挂载的目录
src 设备|nfs|磁盘|光盘 /dev/sda1
fstype:
iso9660 光盘
nfs
xfs
opts:
ro,noauto
defaults
state:
mounted 挂载设备,并将配置写入/etc/fstab
present 写入fstab,不挂载
absent 卸载设备,会清理/etc/fstab写入的配置
unmounted 卸载设备,不会清除/etc/fstab写入的配置
172.16.1.7 /data 挂载到 172.16.1.31 /opt
172.16.1.8 /data 挂载到 172.16.1.31 /mnt
[root@manager ansible_adhoc]# ansible client -m mount -a "src=172.16.1.7:/data path=/opt fstype=nfs opts=defaults state=mounted"
[root@manager ansible_adhoc]# ansible client -m mount -a "src=172.16.1.8:/data path=/mnt fstype=nfs opts=defaults state=mounted"

```

 

posted @ 2020-05-14 22:37  断尽的记忆  阅读(260)  评论(0编辑  收藏  举报