ansible模块说明
1)command
命令执行模块,但命令中不能包括>
,<
,;
,&
,|
字符
2)shell
万能模块,能够执行shell命令,能够在远程节点上,调用/bash/sh来执行,能够使用特殊参数
[root@m01 ~]# ansible web01 -m shell -a "cd /tmp;pwd"
web01 | CHANGED | rc=0 >>
/tmp
3)script
在连接远程主机后,能够在远程主机运行本地的脚本
[root@m01 ~]# cat d.sh
#!/bin/bash
echo oldboy
[root@m01 ~]# ansible web01 -m script -a "/root/d.sh"
web01 | CHANGED => {
"changed": true,
"rc": 0,
"stderr": "Shared connection to web01 closed.\r\n",
"stderr_lines": [
"Shared connection to web01 closed."
],
"stdout": "oldboy\r\n",
"stdout_lines": [
"oldboy"
]
}
===========================================================================
PS:
1)本地脚本不必有执行权限
2)本地脚本不用传输到远端主机
4)copy
将文件复制到远程位置
参数:
src 服务端本地的目录和文件;传输目录时,oldboy/是传输oldboy里面的内容,oldboy是传输oldboy的目录及里面的东西
dest 远程主机端的目录,如果远程端目录没有会自动创建
owner 目录或文件的属主
group 目录或文件的属组
mode 目录的权限
backup 开启数据的备份功能
remote_src 相当于远程主机的cp功能,备份远程主机的数据,在管理端主机可以没有文件
content 可以编辑文件信息,直接复制到的远程主机,不用在管理端创建文件
5)fetch
从远程主机的文件或数据复制到管理端
参数:
src 远程主机的目录文件
dest 管理端的目录
6)file
管理文件和文件属性
参数:
path 指定文件路径信息
mode 修改文件权限
owner 修改文件的属主
group 修改文件的属组
state 修改文件状态信息
(hard 硬链接 soft 软连接 touch 创建文件 directory 目录)
src 针对软连接和硬链接,目录或文件的源路径
dest 针对软连接和硬链接 ,目录或文件的目标路径
rescure 是否递归修改目录里面文件的熟性 yes/no
7)user
管理用户账户
参数:
name 指定用户的名称
create_home 是否创建用户的家目录 yes/no
shell 指定登录用户的shell
uid 指定登录用户的uid
group 指定登录用户的属组(主要组)
groups 指定登录用户的附属组
password 指定登录用户的密码信息(必须是密文),相当于直接在/etc/shadow里面指定
state present表创建用户(默认) absent表删除用户
补充:
如何指定用户密码的密文信息
1)使用ansible模块
ansible all -i localhost, -m debug -a "msg={{ 'mypassword' | password_hash('sha512', 'mysecretsalt') }}"
mypassword:指定用户的密码
sha512:加密的算法
mysecretsalt:指定加密的方式
localhost:指在本机显示
[root@m01 ~]# ansible localhost -m debug -a "msg={{ '123456'|password_hash('sha512','123456') }}"
localhost | SUCCESS => {
"msg": "$6$123456$37mxvJGRzjWxgD3HYl.bKq4aUXrcYV8mk0pxmqg8ARv3t9ke5ZM/NBbwTkx1FDcnLhrOX3jQc6L/NKAohhQJn/"
}
[root@m01 ~]# ansible web01 -m user -a 'name=oldboy password=$6$123456$37mxvJGRzjWxgD3HYl.bKq4aUXrcYV8mk0pxmqg8ARv3t9ke5ZM/NBbwTkx1FDcnLhrOX3jQc6L/NKAohhQJn/'
web01 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"append": false,
"changed": true,
"comment": "",
"group": 1003,
"home": "/home/oldboy",
"move_home": false,
"name": "oldboy",
"password": "NOT_LOGGING_PASSWORD",
"shell": "/bin/bash",
"state": "present",
"uid": 1000
}
2)利用python模块加密
第一个历程: 安装pip下载工具
yum install -y python-pip
第二个历程: 利用pip工具下载python程序包
pip install passlib
第三个历程: 生成密文信息
[root@m01 ~]# python -c "from passlib.hash import sha512_crypt; import getpass; print(sha512_crypt.using(rounds=5000).hash(getpass.getpass()))"
Password:
$6$IQhh.egT4ow2dzmd$fk9W1.J4q1ArQ8nykkhh5A0waFbgU1Qa4sUdNm42.oYSpSMmIIl0262cSDg1Q6Ph8p3rnqHOs372A.GzD11.w/
8)group
用户组的管理
参数:
name:指定组名称
gid:指定组gid
state: present添加组(默认)absent()\删除组
9)yum
红帽系列安装软件包的模块
参数:
name 指定安装包的名字
state present/installed/latest 安装软件包 absent/removed删除软件包
10)service
服务模块
参数:
name 启动服务的名字
state 服务的状态 started启动状态 restarted重启 reloaded平滑重启 stopped停止
enabled yes/no 开机是否自启
11)cron
定时任务模块
参数:
minute 分钟
hour 小时
day 天
month 月
weekday 星期
name 定时任务的名字,一般用来删除定时任务使用
job 定时任务的命令
disable 注释定时任务,注释时,把定时任务的详细信息写上,包括时间信息和job信息
12)mount
系统的挂载参数
参数:
src 要挂载的设备路径
dest 要挂载的目录
state mounted永久挂载,同时挂载 present只写如/etc/fstab中并不进行挂载 absent 删除/etc/fstab里面的挂载信息,同时卸除挂载点
unmounted 只进行卸载,并不删除/etc/fstab里面的文件
剧本的编写
剧本:将多个模块操作命令进行整合
作用说明:
01)可以实现服务自动化部署
02)可以提高运维工作效率
03)可以减少运维工作问题
04)可以节省公司运维成本
剧本编写组成
1 .剧本的角色信息: hosts ---主机信息
2 .剧本任务信息: tasks --任务信息
剧本编写规范
遵循yaml语法规范====Python的代码语法规范
01 .缩进规范:两个空格表示一个缩进关系
标题一
标题二
标题三
PS:在缩进时只能用空格缩进,不能使用tab键缩进
02:字典规范
冒号后面要有空格,当冒号出现在结尾不需要有空格,冒号出现的注释信息中不需要有空格
key: vlaue
03:列表规范
- 号后面要有空格
name:
- nfs
- rpcbind
- rsyncd
脚本测试执行方法
1 .检验脚本的语法格式
anislbe-playbook --syntax-check play.yml
2 .检测脚本的模拟运行
ansible-playbook -C play.yml
剧本测试编写
一键自动化安装nfs
服务端
1 .安装nfs ,rpcbind
2 .编写配置文件
3 . 创建存储目录
4 .启动服务程序
客户端
1 .安装程序软件
2 .进行挂载操操作
脚本编写方法*
1 .利用变量编写
2 .利用字典编写
3 .采用json格式编写
剧本一采用变量编写
nfs服务端
[root@m01 /etc/ansible]# cat nfs_server.yml
- hosts: nfs_server
tasks:
- name: install nfs rpc_bind
yum: name=rpcbind state=installed
yum: name=nfs-utils state=installed
- name: copy configuartion
copy: src=/root/exports dest=/etc/
- name: create dir
file: path=/data state=directory owner=nfsnobody group=nfsnobody
- name: boot server
service: name=rpcbind state=started enabled=yes
service: name=nfs state=started enabled=yes
nfs客户端
[root@m01 /etc/ansible]# cat nfs_client.yml
- hosts: nfs_client
tasks:
- name: installed softward
yum: name=nfs-utils state=installed
- name: mount nfs
shell: mount -t nfs 172.16.1.31:/data /mnt
剧本二采用字典编写
nfs服务端
[root@m01 /etc/ansible]# cat nfs_server_dir.yml
- hosts: nfs_server
tasks:
- name: install softward
yum:
name:
- nfs-utils
- rpcbind
state: installed
- name: copy config
copy:
src: /root/exports
dest: /etc/
- name: mkdir dir
file:
path: /data
state: directory
owner: nfsnobody
group: nfsnobody
- name: boot service
service:
name: rpcbind
state: started
enabled: yes
service:
name: rpcbind
state: started
enabled: yes
nfs客户端
[root@m01 /etc/ansible]# cat nfs_client_dir.yml
- hosts: nfs_client
tasks:
- name: install softward
yum:
name: nfs-utils
state: installed
- name: mount dir
mount:
src: 172.16.1.31:/data
fstype: nfs
path: /mnt
state: present
剧本扩展
1 .在 剧本中设置变量信息
2 .在剧本中设置注册信息
3 .在剧本中设置判断信息
4 .在剧本中设置循环信息
5 .在剧本中设置错误忽略信息
6 .在剧本中设置标签信息
7 .在剧本中设置触发信息
设置剧本变量信息
方法一 在剧本中设置变量
[root@m01 /etc/ansible]# cat playbook_var.yml
- hosts: nfs_server
vars:
data_dir: /oldbaby
tasks:
- name: create dir
file: path={{ data_dir }} state=directory
字典格式设置变量
[root@m01 /etc/ansible]# cat playbook_var_dir.yml
- hosts: web01
vars:
data_dir: /oldbaby
tasks:
- name: create dir
file:
path: "{{ data_dir }}"
state: directory
python字典格式查看
[root@m01 /etc/ansible]# cat /server/scripts/test_python.sh
#!/bin/python
import yaml
file = open("/etc/ansible/playbook_var_dir.yml")
x = yaml.load(file)
print x
====================================================
[root@m01 /etc/ansible]# python /server/scripts/test_python.sh
[{'tasks': [{'name': 'create dir', 'file': {'path': 'data_dir', 'state': 'directory'}}], 'hosts': 'web01', 'vars': {'data_dir': '/oldbaby'}}]
方法二 在命令行中设置变量
[root@m01 /etc/ansible]# ansible-playbook -e data_dir=/oldgirl playbook_var.yml
方法三:在主机清单中配置
[root@m01 /etc/ansible]# cat /etc/ansible/hosts
[nfs_server]
nfs01 data_dir=/old01
[backup01]
backup
[nfs_client]
web01
backup
三种变量的优先级
命令行中最高
配置文件其次
主机清单最低
剧本中的注册信息
[root@m01 /etc/ansible]# cat zhuce.yml
- hosts: web01
tasks:
- name: check mount
shell: df -h
register: oldboy
- name: dispaly mount info
debug: msg={{ oldboy.stdout_lines }}
[root@m01 /etc/ansible]# ansible-playbook zhuce.yml
PLAY [web01] ************************************************************************************************************
TASK [Gathering Facts] **************************************************************************************************
ok: [web01]
TASK [check mount] ******************************************************************************************************
changed: [web01]
TASK [dispaly mount info] ***********************************************************************************************
ok: [web01] => {
"msg": [
"Filesystem Size Used Avail Use% Mounted on",
"/dev/sda3 19G 2.0G 17G 11% /",
"devtmpfs 224M 0 224M 0% /dev",
"tmpfs 235M 0 235M 0% /dev/shm",
"tmpfs 235M 26M 209M 11% /run",
"tmpfs 235M 0 235M 0% /sys/fs/cgroup",
"/dev/sda1 197M 105M 93M 54% /boot",
"tmpfs 47M 0 47M 0% /run/user/0"
]
}
PLAY RECAP **************************************************************************************************************
web01 : ok=3 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
剧本中设置判断信息
常见主机信息:
ansible_all_ipv4_address: 仅显示ipv4地址
ansible_devices:仅显示磁盘设备信息
ansible_distribution:显示是什么系统例如:centos suse
ansible_distribution_major_version: 显示系统主版本号
ansible_dirtribution_version:显示系统版本
ansible_machine:显示系统类型 例:32位,还是64位
ansible_eth0: 仅显示eth0的信息
ansible_hostname: 仅显示主机名
ansible_kernel: 仅显示内核版本
ansible_lvm: 显示lvm相关信息
ansible_memtotal_mb: 显示系统总内存
ansible_memfree_mb: 显示可用的系统内存
ansible_memory_mb: 显示系统内存
ansible_swaptotal_mb: 显示总的swap内存
ansible_swaptotal_mb: 显示总的swap内存
ansible_swapfree_mb:显示swap内存的可用内存
ansible_mounts: 显示系统磁盘挂载情况
ansible_processor: 显示cpu的个数(具体显示每个cpu的型号)
ansible_processor_vcpus:显示cpu的个数(只显示总的个数)
[root@m01 /etc/ansible]# cat nfs_client.yml
- hosts: nfs_client
tasks:
- name: installed softward
yum: name=nfs-utils state=installed
- name: mount nfs
shell: mount -t nfs 172.16.1.31:/data /mnt
- name: create dir
file: path=/oldbaby state=directory
when: (ansible_hostname == "web01")
对多个条件进行并且判断
when: (ansible_hostname == "web01") and (ansilbe_hostname == "nfs")
对多个条件进行或者判断
when: (ansible_hostname == "web01") or (ansible_hostname == 'nfs')
对条件进行取反操作
when: (ansible_hostname != "web01")
作业:
01. 修改目录权限属性信息: 问题* 如何递归修改目录权限???
[root@m01 /etc/ansible]# ansible web01 -m file -a "path=/oldboy mode=666 recurse=yes"
02. 默认在删除用户是不会删除用户家目录. 问题* 如何将用户家目录删除 == userdel -r
[root@m01 /etc/ansible]# ansible web01 -m user -a "name=oldboy01 state=absent remove=yes"
03. 在进行判断匹配时,如何取出内置变量指定子集信息
描述人特点: 身高 体重 性别 学历: 金融学历_企业管理 财务学历_注册会计师 工作
04. 扩展研究 lineinfile
lineinfile
参数:
regexp: 正则匹配
line: 匹配到的文本,要替换成什么(必须选项)
path: 匹配文件的路径(必须选项)
owner: 改变文件的属主
group: 改变文件的属组
mode: 改变文件的权限
insertafter: 如果匹配不到regexp才会匹配insertafter,然后在匹配到的内容的下一行写入line 不能与insertbefore一起使用
insertbefore:如果匹配不到regexp 才会匹配insertbefore,然后在匹配到的内容上一行写入line
create: yes/no no为默认 如果设为yes,如果文件不存在则创建文件,如果匹配不到regexp则在文件的末尾加入line,不能与insertbefore和insertafter一起使用
backrefs: yes/no no为默认 yes 表示可以使用后项引用,这个参数会忽略insertafer和insertbefore.如果匹配到将会line 替换,如果匹配不到则不会影响 不能全局替换,只能从下往上替换???
validate: 对配置文件语法进行检查