Ansible基础(一)

前言:

1、ansible输出结果颜色含义:
绿色: 命令执行成功 没有对远程主机做任何修改
黄色: 命令执行成功 大部分情况表示对远程主机做了改动
红色: 命令执行失败
粉色: 建议进行操作的方法
蓝色: 显示命令或剧本执行的过程

2、ansible帮助文档如何查看:
ansible-doc -l --- 查看所有ansible模块信息
ansible-doc -s 模块 --- 查看指定模块详细说明
ansible-doc 模块 --- 查看指定模块更加详细说明

一、ansible简介:

1、ansible 是基于sshd服务实现的
2、功能简介:

批量管理服务
批量部署服务
批量分发数据
批量采集数据信息

3、ansible软件并行批量管理

二、软件特点

优点

1、管理端不需要启动服务程序
2、管理端不需要编写配置文件
3、功能强大

缺点:

模块太多了

三、ansible程序功能组成

1、主机清单
2、模块功能
3、剧本编写

四、ansible使用前准备

1、基于ssh秘钥方式,将主机秘钥分发至个被管理主机,确保管理主机能直接登录(不用输入密码)
2、确认epel源更新完毕
3、安装ansible (yum install ansible -y)

==============================================================

五、ansible 主机清单配置5种方式的(/etc/ansible/hosts)

1、简单配置

172.16.1.7
172.16.1.31
172.16.1.41

2、分组配置

[web]
172.16.1.31
172.16.1.41
[nfs]
172.16.1.7
172.16.1.6

3、符号匹配主机信息

172.16.1.1 172.16.1.2 .. 172.16.1.200
[data]
172.16.1.[30:45]

4、配置特殊变量信息

特殊变量参照官方文档:https://docs.ansible.com/ansible/latest/user_guide/intro_inventory.html
[web]
172.16.1.7 ansible_user=root ansible_password=123456 ansible_port=22
[web]
web01 ansible_host=172.16.1.7 ansible_user=root ansible_password=123456 ansible_port=22

5、嵌入式胚子

5.1嵌入子组

[rsync:children]
rsync_server
rsync_client

[rsync_server]
172.16.1.41
[rsync_client]
172.16.1.7
172.16.1.31

5.2嵌入变量(剧本)

第二种嵌入式:嵌入变量 (剧本)
[rsync_client]
172.16.1.7
172.16.1.31
[rsync_client:vars]
ansible_user=root
ansible_password=123456

六、管理多台主机语法格式:

ansible 主机信息(可以是组) -m 模块名称 -a "完成动作"
举例:

[root@web01 ~]# ansible server -m command -a "hostname"
172.16.1.41 | CHANGED | rc=0 >>
backup-41

172.16.1.31 | CHANGED | rc=0 >>
nfs01-31

[root@web01 ~]# 

七、常用模块介绍

在ansible中 使用ansible-doc <模块名称> 来查看单独模块用法

1、command模块--可批量管理主机执行命令(默认模块)

常用参数
官方模块说明:https://docs.ansible.com/ansible/latest/modules/command_module.html#command-module

参数:chdir--在执行命令操作前进行切换目录

[root@web01 ~]# ansible server -m command -a "chdir=/tmp pwd"

参数:creates--判断一个文件是否存在,如果存在后面的命令就不会执行

[root@web01 ~]# ansible server -m command -a "creates=/tmp/hosts touch /tmp/hosts "

参数:removes--判断一个文件是否存在,如果不存在,后续的命令不会被执行

[root@web01 ~]# ansible server -m command -a "removes=/tmp/test touch /tmp/test"

2、shell模块--可以批量管理主机执行命令(万能模块)

官方模块说明:https://docs.ansible.com/ansible/latest/modules/shell_module.html#shell-module
参数chdir:在执行命令前进行目录切换

[root@web01 ~]# ansible server -m shell -a "chdir=/tmp ls"
172.16.1.41 | CHANGED | rc=0 >>
ansible_command_payload_yJt3M6
hosts
ls

172.16.1.31 | CHANGED | rc=0 >>
ansible_command_payload_G06CEK
hosts
ls

参数:creates----判断一个文件是否存在,如果存在,后续命令不会执行

[root@web01 ~]# ansible server -m shell -a "creates=/tmp/test touch /tmp/test"
 [WARNING]: Consider using the file module with state=touch rather than running 'touch'.  If you need to use command because file is
insufficient you can add 'warn: false' to this command task or set 'command_warnings=False' in ansible.cfg to get rid of this
message.

172.16.1.31 | CHANGED | rc=0 >>


172.16.1.41 | CHANGED | rc=0 >>

参数:removes--判断一个文件是否存在,如果不存在则候命的命令不会执行

[root@web01 ~]# ansible server -m shell -a  "removes=/tmp/test chdir=/tmp ls"
172.16.1.41 | CHANGED | rc=0 >>
ansible_command_payload_RhVulC
hosts
ls
test

172.16.1.31 | CHANGED | rc=0 >>
ansible_command_payload_WVfVC2
hosts
ls
test

3、script模块--批量执行脚本信息

官网模块说明:https://docs.ansible.com/ansible/latest/modules/script_module.html#script-module
使用这个模块需要注意的

1、保证本地(需要执行脚本的设备端)有脚本文件
2、脚本有执行权限

[root@web01 ~]# ansible server -m script -a "/web_data/install.sh" 

4、yum模块--批量部署软件程序

官方模块说明:https://docs.ansible.com/ansible/latest/modules/yum_module.html#yum-module
参数:name--指定安装软件的名称
参数:state--指定软件安装或卸载
在这个模块中卸载使用 removed 安装使用installed;注意看示例

[root@web01 ~]# ansible server -m yum -a "name=ansible state=installed"

5、service模块--批量管理服务的运行状态

官网模块说明:https://docs.ansible.com/ansible/latest/modules/service_module.html#service-module

参数

name:指定服务名称
enabled:设置服务是否开机自动运行 yes:开启开机自动运行 no:关闭开机自动运行
state:指定服务的运行状态(有以下几个状态)

restarted 重启
reloaded 重读配置文件(部分服务可用)
stopped 关闭服务
started 开启服务

[root@web01 ~]# ansible server -m service -a "name=sshd state=started"

6、copy模块--将管理端的主机数据文件,分发给被管理端;将管理端目录中的数据移动到其他目录

官网模块说明:https://docs.ansible.com/ansible/latest/modules/copy_module.html#copy-module
参数:src--指定管理端源数据
参数:dest--分发到远程主机的目标路径下
参数:owner--专属文件之后修改文件属主
参数:group--传输文件之后修改文件属组
参数:mode--修改文件的读、写、执行权限

[root@web01 ~]# ansible server -m copy -a "src=/tmp/rsyncd.conf dest=/tmp owner=rsync group=rsync mode=666"

参数:backup--在分发传输文件之前,将源文件进行备份,按照时间信息进行备份
参数remote_src--no表示从管理端找寻数据进行分发;yes 默认从被管理端找寻数据进行分发
参数content--分发文件时在文件中穿件简单信息

[root@web01 /tmp]# ansible server -m copy -a "content='xianjian'  dest=/tmp/xianjian  remote_src=no  mode=666"

注意:在copy模块中不能同时使用content 参数和src参数,否则会出现互斥,报错如下

[root@web01 /tmp]# ansible server -m copy -a "content='xianjian'   src=/tmp/xinjian dest=/tmp/xianjian  remote_src=no  mode=666"
172.16.1.41 | FAILED! => {
    "changed": false, 
    "msg": "src and content are mutually exclusive"
}
172.16.1.31 | FAILED! => {
    "changed": false, 
    "msg": "src and content are mutually exclusive"
}

7、fetch模块--将远程主机数据进行拉取

官网模块说明:https://docs.ansible.com/ansible/latest/modules/fetch_module.html#fetch-module
参数:src--要拉取的远程数据
参数:dest--要保存本地的文件路径

[root@web01 /tmp]# ansible 172.16.1.41 -m fetch -a "src=/tmp/xinjian dest=/tmp/"
172.16.1.41 | CHANGED => {
    "changed": true, 
    "checksum": "d5c2fe81c8a4fc3f532ab2617e6623dc46ce85a8", 
    "dest": "/tmp/172.16.1.41/tmp/xinjian", 
    "md5sum": "295b4c158e20855fb1fc47ec8f60600f", 
    "remote_checksum": "d5c2fe81c8a4fc3f532ab2617e6623dc46ce85a8", 
    "remote_md5sum": null
}

使用这个模块时注意src=/tmp/xinjian 不得加/;否则会出现如下报错

[root@web01 /tmp]# ansible 172.16.1.41 -m fetch -a "src=/tmp/xinjian/ dest=/tmp/"
172.16.1.41 | FAILED! => {
    "changed": false, 
    "file": "/tmp/xinjian/", 
    "msg": "unable to calculate the checksum of the remote file"
}


8、file模块--修改文件属性信息用于创建数据信息(文件、目录、连接文件、删除数据)

官方说明:https://docs.ansible.com/ansible/latest/modules/file_module.html#file-module
path:指定路径信息
owner:传输文件之后修改文件属主权限
group:传输文件后修改属组权限
mode:直接修改文件读、写、执行权限
state:touch(创建文件)、directory(创建目录)、hard(创建硬链接文件) link(创建软链接文件)、absent(删除数据)

创建件目录:

[root@web01 /]# ansible 172.16.1.31 -m file -a "path=/mnt/test/  state=directory"
172.16.1.31 | CHANGED => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": true, 
    "gid": 65534, 
    "group": "nfsnobody", 
    "mode": "0755", 
    "owner": "nfsnobody", 
    "path": "/mnt/test/", 
    "secontext": "system_u:object_r:nfs_t:s0", 
    "size": 6, 
    "state": "directory", 
    "uid": 65534
}
[root@web01 /]# 

创建文件:

[root@web01 /]# ansible 172.16.1.31 -m file -a "path=/mnt/test/test state=touch"
172.16.1.31 | CHANGED => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": true, 
    "dest": "/mnt/test/test", 
    "gid": 65534, 
    "group": "nfsnobody", 
    "mode": "0644", 
    "owner": "nfsnobody", 
    "secontext": "system_u:object_r:nfs_t:s0", 
    "size": 0, 
    "state": "file", 
    "uid": 65534
}
[root@web01 /]# 

删除数据信息:

[root@web01 /]# ansible 172.16.1.31 -m file -a "path=/tmp/test  state=absent"
172.16.1.31 | CHANGED => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": true, 
    "path": "/tmp/test", 
    "state": "absent"
}

9、mount模块--挂载模块

官方说明:https://docs.ansible.com/ansible/latest/modules/mount_module.html#mount-module
参数:src--指定要挂载数据
参数:path--指定挂载点
**参数:fstype--指定挂载后,文件系统类型 如:ext3、ext4、xfs、nfs **
参数:state--指定动作 如:mounted(挂载)、present(永久挂载)、umounted(临时卸载) absent(永久卸载)

动作 功能 特点
mounted 挂载 1、会立即进行挂载操作2、可实现永久挂载
present 挂载 只能永久挂载不会临时挂载
unmounted 卸载 只能进行临时卸载
absent 卸载 1. 进行临时卸载 2. 进行永久卸载 3. 挂载点目录会被删除

挂载:

[root@web01 /]# ansible server -m mount -a "src=172.16.1.31:/web_data path=/mnt fstype=nfs state=mounted"
172.16.1.31 | CHANGED => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": true, 
    "dump": "0", 
    "fstab": "/etc/fstab", 
    "fstype": "nfs", 
    "name": "/mnt", 
    "opts": "defaults", 
    "passno": "0", 
    "src": "172.16.1.31:/web_data"
}
172.16.1.41 | CHANGED => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": true, 
    "dump": "0", 
    "fstab": "/etc/fstab", 
    "fstype": "nfs", 
    "name": "/mnt", 
    "opts": "defaults", 
    "passno": "0", 
    "src": "172.16.1.31:/web_data"
}

10、 cron模块--定时任务模块

官方说明:https://docs.ansible.com/ansible/latest/modules/cron_module.html#cron-module
name: 定义定时任务注释信息
参数:minute --表示分钟信息
参数:hour --表示小时信息
参数:day --表示日期信息
参数:month --表示月份信息
参数:weekday --表示星期信息
参数:job --表示定义任务信息
参数:state --指定动作 如:present(创建定时任务)、absent(删除定时任务)
参数:disabled: 让定时任务临时失效

利用ansible编写时间同步定时任务:每隔5分钟,进行时间同步:

[root@web01 /]# ansible server  -m cron -a "name='date sync' minute=*/5  job='ntpdate ntp1.aliyun.com &>/dev/null'"
172.16.1.31 | CHANGED => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": true, 
    "envs": [], 
    "jobs": [
        "date sync"
    ]
}
172.16.1.41 | CHANGED => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": true, 
    "envs": [], 
    "jobs": [
        "date sync"
    ]
}

删除定时任务:

[root@web01 /]# ansible 172.16.1.31 -m cron -a "name='date sync' state=absent"
172.16.1.31 | CHANGED => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": true, 
    "envs": [], 
    "jobs": []
}

注释定时任务:

[root@web01 /]# ansible 172.16.1.31 -m cron -a "name='date sync' minute=*/5  job='ntpdate ntp1.aliyun.com &>/dev/null'  disabled=yes" 
172.16.1.31 | CHANGED => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": true, 
    "envs": [], 
    "jobs": [
        "date sync"
    ]
}

11、 group模块--批量创建用户组

官网说明:https://docs.ansible.com/ansible/latest/modules/group_module.html#group-module
参数:name--指点组名
参数:gid--指定gid
参数:state--指定动作 present(创建) absent(删除)

[root@web01 /]# ansible server -m group -a  "name=tese gid=777 state=present"
172.16.1.31 | CHANGED => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": true, 
    "gid": 777, 
    "name": "tese", 
    "state": "present", 
    "system": false
}
172.16.1.41 | CHANGED => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": true, 
    "gid": 777, 
    "name": "tese", 
    "state": "present", 
    "system": false
}

12、user模块--批量创建用户模块

官方说明:https://docs.ansible.com/ansible/latest/modules/user_module.html#user-module
参数:name--指定用户名称
参数:uid--指定用户uid信息
参数:group--指定属组
参数:groups--指定属于附加组
参数:password—-指定用户密码信息(必须密文的信息)
参数:shell—-指定用户shell信息 /sbin/nologin
参数:create_home--no表示不创建家目录

创建用户:

[root@web01 /]# ansible server -m user -a "name=girl uid=888 group=tese  shell=/sbin/nologin create_home=no"
172.16.1.41 | CHANGED => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": true, 
    "comment": "", 
    "create_home": false, 
    "group": 777, 
    "home": "/home/girl", 
    "name": "girl", 
    "shell": "/sbin/nologin", 
    "state": "present", 
    "system": false, 
    "uid": 888
}
172.16.1.31 | CHANGED => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": true, 
    "comment": "", 
    "create_home": false, 
    "group": 777, 
    "home": "/home/girl", 
    "name": "girl", 
    "shell": "/sbin/nologin", 
    "state": "present", 
    "system": false, 
    "uid": 888
}

删除用户:

[root@web01 /]# ansible server -m user -a "name=girl state=absent"
172.16.1.41 | CHANGED => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": true, 
    "force": false, 
    "name": "girl", 
    "remove": false, 
    "state": "absent"
}
172.16.1.31 | CHANGED => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": true, 
    "force": false, 
    "name": "girl", 
    "remove": false, 
    "state": "absent"
}
[root@web01 /]# 

ansible创建用户密文密码

**方法一:利用ansible模块功能
ansible all -i localhost, -m debug -a "msg={{ 'mypassword' | password_hash('sha512', 'mysecretsalt') }}"
mypassword: 指定明文密码信息
mysecretsalt:加密计算方式(辅助加密)

[root@web01 ~]# ansible all -i localhost, -m debug -a "msg={{ '123456' | password_hash('sha512', 'mysecretsalt') }}"
localhost | SUCCESS => {
    "msg": "$6$mysecretsalt$ZB9R8AirQYAXhtfhOo2qdJz52FyNI6v3L6Uc3KNRP.arBKIYpcuEyQewT5qBAHoyQFwHkW6Z551Ql.cZ53GeY0"
}

方法二:利用python模块功能
使用这种方法需要安装python-pip
如果安装不上需要更新pip源,更新方法:
更新pip源:

配置方法:在文件
~/.pip/pip.conf
中添加或修改:

[global]
index-url = https://mirrors.aliyun.com/pypi/simple/

[install]
trusted-host=mirrors.aliyun.com

==============================================================

安装好 :yum install python-pip 后
执行 pip install passlib
然后执行(什么也不用改,直接执行即可) :
python -c "from passlib.hash import sha512_crypt; import getpass; print(sha512_crypt.using(rounds=5000).hash(getpass.getpass()))"

[root@m01 ~]# pip install passlib
Collecting passlib
  Downloading https://files.pythonhosted.org/packages/ee/a7/d6d238d927df355d4e4e000670342ca4705a72f0bf694027cf67d9bcf5af/passlib-1.7.1-py2.py3-none-any.whl (498kB)
    100% |████████████████████████████████| 501kB 13kB/s 
Installing collected packages: passlib
Successfully installed passlib-1.7.1
You are using pip version 8.1.2, however version 19.1.1 is available.
You should consider upgrading via the 'pip install --upgrade pip' command.
[root@m01 ~]# python -c "from passlib.hash import sha512_crypt; import getpass; print(sha512_crypt.using(rounds=5000).hash(getpass.getpass()))"
Password: 
$6$pYHuK3LNv3OwCytH$MnGUAzTXLH9TdU/Xz.9u9FY2QaZfEtH5l.kEE9hID9sZPrug6fm0M3BWMVjUk81uemTHkZhtg7i982M.05x8T1
[root@m01 ~]# ansible nfs01 -m user -a 'name=test password="$6$pYHuK3LNv3OwCytH$MnGUAzTXLH9TdU/Xz.9u9FY2QaZfEtH5l.kEE9hID9sZPrug6fm0M3BWMVjUk81uemTHkZhtg7i982M.05x8T1"'
172.16.1.31 | CHANGED => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": true, 
    "comment": "", 
    "create_home": true, 
    "group": 1001, 
    "home": "/home/test", 
    "name": "test", 
    "password": "NOT_LOGGING_PASSWORD", 
    "shell": "/bin/bash", 
    "state": "present", 
    "system": false, 
    "uid": 1000
}
[root@m01 ~]# ansible nfs01 -m command -a "id test"
172.16.1.31 | CHANGED | rc=0 >>
uid=1000(test) gid=1001(test) groups=1001(test)
[root@m01 ~]# 

你可能感兴趣的:(Ansible基础(一))