ansible学习(一)
# 安装ansible
yum install epel-release -y
yum install ansible -y
# 配置文件及参数
ansible 的配置文件为/etc/ansible/ansible.cfg,常见参数如下:
inventory = /etc/ansible/hosts #这个参数表示资源清单inventory文件的位置
library = /usr/share/ansible #指向存放Ansible模块的目录,支持多个目录方式,只要用冒号(:)隔开就可以
forks = 5 #并发连接数,默认为5
sudo_user = root #设置默认执行命令的用户
remote_port = 22 #指定连接被管节点的管理端口,默认为22端口,建议修改,能够更加安全
host_key_checking = False #设置是否检查SSH主机的密钥,值为True/False。关闭后第一次连接不会提示配置实例
timeout = 60 #设置SSH连接的超时时间,单位为秒
log_path = /var/log/ansible.log #指定一个存储ansible日志的文件(默认不记录日志)
# ansible 常用命令
ansible 命令集
/usr/bin/ansible Ansibe AD-Hoc 临时命令执行工具,常用于临时命令的执行
/usr/bin/ansible-doc Ansible 模块功能查看工具
/usr/bin/ansible-galaxy 下载/上传优秀代码或Roles模块 的官网平台,基于网络的
/usr/bin/ansible-playbook Ansible 定制自动化的任务集编排工具
/usr/bin/ansible-pull Ansible远程执行命令的工具,拉取配置而非推送配置(使用较少,海量机器时使用,对运维的架构能力要求较高)
/usr/bin/ansible-vault Ansible 文件加密工具
/usr/bin/ansible-console Ansible基于Linux Consoble界面可与用户交互的命令执行工具
其中,我们比较常用的是/usr/bin/ansible和/usr/bin/ansible-playbook。
ansible-doc 命令
ansible-doc 命令常用于获取模块信息及其使用帮助,一般用法如下:
ansible-doc -l #获取全部模块的信息
ansible-doc -s MOD_NAME #获取指定模块的使用帮助
# 查看一下ansible-doc的全部用法:
[root@server ~]# ansible-doc
Usage: ansible-doc [options] [module...]
Options:
-h, --help show this help message and exit # 显示命令参数API文档
-l, --list List available modules #列出可用的模块
-M MODULE_PATH, --module-path=MODULE_PATH #指定模块的路径
specify path(s) to module library (default=None)
-s, --snippet Show playbook snippet for specified module(s) #显示playbook制定模块的用法
-v, --verbose verbose mode (-vvv for more, -vvvv to enable # 显示ansible-doc的版本号查看模块列表:
connection debugging)
--version show program's version number and exit
以mysql相关的为例:
[root@server ~]# ansible-doc -l |grep mysql
mysql_db Add or remove MySQL databases from a remote...
mysql_replication Manage MySQL replication
mysql_user Adds or removes a user from a MySQL databas...
mysql_variables Manage MySQL global variables
## 查看mysql_user模块的相关使用信息
[root@server ~]# ansible-doc -s mysql_user
# ansible 命令详解
命令格式:
ansible <host-pattern> [-f forks] [-m module_name] [-a args]
也可以通过ansible -h来查看帮助,下面我们列出一些比较常用的选项,并解释其含义:
-a MODULE_ARGS #模块的参数,如果执行默认COMMAND的模块,即是命令参数,如: “date”,“pwd”等等
-k,--ask-pass #ask for SSH password。登录密码,提示输入SSH密码而不是假设基于密钥的验证
--ask-su-pass #ask for su password。su切换密码
-K,--ask-sudo-pass #ask for sudo password。提示密码使用sudo,sudo表示提权操作
--ask-vault-pass #ask for vault password。假设我们设定了加密的密码,则用该选项进行访问
-B SECONDS #后台运行超时时间
-C #模拟运行环境并进行预运行,可以进行查错测试
-c CONNECTION #连接类型使用
-f FORKS #并行任务数,默认为5
-i INVENTORY #指定主机清单的路径,默认为/etc/ansible/hosts
--list-hosts #查看有哪些主机组
-m MODULE_NAME #执行模块的名字,默认使用 command 模块,所以如果是只执行单一命令可以不用 -m参数
-o #压缩输出,尝试将所有结果在一行输出,一般针对收集工具使用
-S #用 su 命令
-R SU_USER #指定 su 的用户,默认为 root 用户
-s #用 sudo 命令
-U SUDO_USER #指定 sudo 到哪个用户,默认为 root 用户
-T TIMEOUT #指定 ssh 默认超时时间,默认为10s,也可在配置文件中修改
-u REMOTE_USER #远程用户,默认为 root 用户
-v #查看详细信息,同时支持-vvv,-vvvv可查看更详细信息
# ansible 配置公私钥
上面我们已经提到过 ansible 是基于 ssh 协议实现的,所以其配置公私钥的方式与 ssh 协议的方式相同,具体操作步骤如下:
问题:-bash: ssh-copy-id: command not found
解决:yum -y install openssh-clients ansible
## 1.生成私钥
[root@server ~]# ssh-keygen
## 2.向主机分发私钥
[root@server ~]# ssh-copy-id root@192.168.37.122
[root@server ~]# ssh-copy-id root@192.168.37.133
## 3.配置免密
#生产公钥
mkdir /root/.ssh
\cp -f /home/vm_script/id_rsa.pub /root/.ssh/id_rsa.pub
\cp -f /home/vm_script/id_rsa /root/.ssh/id_rsa
\cp -f /home/vm_script/id_rsa.pub /root/.ssh/authorized_keys
chmod 600 /root/.ssh/*
#配置免密
for hostname in ${hosts_name_list}; do
root_pass=$(/usr/bin/bash /home/vm_script/readini.sh /home/vm_script/config.ini $hostname root_pass)
expect << EOF
set timeout 60
spawn ssh-copy-id root@$hostname
expect {
"yes/no" {send "yes\r";exp_continue}
"password" {send "$root_pass\r";exp_continue}
}
EOF
#ssh root@$hostname "hostnamectl set-hostname $hostname"
#scp /root/.ssh/id_rsa root@$hostname:/root/.ssh/id_rsa
#scp /root/.ssh/id_rsa.pub root@$hostname:/root/.ssh/id_rsa.pub
done
# ansible 常用模块
## 1.ping模块
ansible web -m ping命令来进行主机连通性测试
执行结果如下:
[root@t30 ssh_key]# ansible all -m ping
192.168.1.30 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"
}
192.168.1.60 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"
}
[root@t30 ssh_key]#
## 2.command 模块
可以直接在远程主机上执行命令,并将结果返回本主机。
执行结果如下:
[root@t30 ssh_key]# ansible all -m command -a 'df -h'
192.168.1.30 | CHANGED | rc=0 >>
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/centos_t1-root 92G 3.5G 88G 4% /
devtmpfs 3.9G 0 3.9G 0% /dev
tmpfs 3.9G 124K 3.9G 1% /dev/shm
tmpfs 3.9G 8.5M 3.9G 1% /run
tmpfs 3.9G 0 3.9G 0% /sys/fs/cgroup
/dev/vda1 1014M 125M 890M 13% /boot
tmpfs 799M 0 799M 0% /run/user/0
192.168.1.60 | CHANGED | rc=0 >>
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/centos-root 91G 9.9G 82G 11% /
devtmpfs 8.0G 0 8.0G 0% /dev
tmpfs 8.0G 0 8.0G 0% /dev/shm
tmpfs 8.0G 25M 8.0G 1% /run
tmpfs 8.0G 0 8.0G 0% /sys/fs/cgroup
/dev/vda1 1014M 152M 863M 15% /boot
tmpfs 1.6G 0 1.6G 0% /run/user/0
[root@t30 ssh_key]#
命令模块接受命令名称,后面是空格分隔的列表参数。给定的命令将在所有选定的节点上执行。
它不会通过shell进行处理,比如$HOME和操作如"<",">","|",";","&" 工作(需要使用(shell)模块实现这些功能)。注意,该命令不支持| 管道命令。
此模块下常用的命令:
[root@server ~]# ansible all -m command -a 'chdir=/data/ ls' #先切换到/data/ 目录,再执行“ls”命令
[root@t30 ssh_key]# ansible all -m command -a 'creates=/data/aaa.jpg ls' #如果/data/aaa.jpg存在,则不执行“ls”命令
[root@t30 ssh_key]# ansible all -m command -a 'creates=/data/1.txt ls'
192.168.1.30 | SUCCESS | rc=0 >>
skipped, since /data/1.txt exists
192.168.1.60 | CHANGED | rc=0 >>
huawei-arm
pra
test
test.txt
[root@t30 ssh_key]#
## 3.shell 模块
shell模块可以在远程主机上调用shell解释器运行命令,支持shell的各种功能,如管道等。
[root@t30 ssh_key]# ansible all -m shell -a 'cat /etc/passwd |grep root'
192.168.1.60 | CHANGED | rc=0 >>
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
192.168.1.30 | CHANGED | rc=0 >>
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
[root@t30 ssh_key]#
只要是shell命令,都可以通过这个模块在远程主机上运行
## 4.copy 模块
这个模块用于将文件复制到远程主机,同时支持给定内容生成文件和修改权限等
src #被复制到远程主机的本地文件。可以是绝对路径,也可以是相对路径。如果路径是一个目录,则会递归复制,用法类似于"rsync"
content #用于替换"src",可以直接指定文件的值
dest #必选项,将源文件复制到的远程主机的绝对路径
backup #当文件内容发生改变后,在覆盖之前把源文件备份,备份文件包含时间信息
directory_mode #递归设定目录的权限,默认为系统默认权限
force #当目标主机包含该文件,但内容不同时,设为"yes",表示强制覆盖;设为"no",表示目标主机的目标位置不存在该文件才复制。默认为"yes"
others #所有的 file 模块中的选项可以在这里使用
示例1:
复制文件
[root@t30 ~]# ansible all -m copy -a 'src=/etc/passwd dest=/opt/passwd-copy'
示例2:
给定内容生成文件,并制定权限
[root@t30 ~]# ansible all -m copy -a 'content="this is a test\n" dest=/opt/name mode=777 '
查看生成的文件及其权限
[root@t30 ~]# ansible all -m shell -a 'ls -l /opt'
可以看到name文件已经创建,并且权限为777
示例3:
覆盖相关,将文件的内容修改一下,选择覆盖备份
[root@t30 ~]# ansible slave -m copy -a 'content="this is test 123\n" backup=yes dest=/opt/name mode=666'
查看修改后相关信息,并检查是否备份源文件
[root@t30 ~]# ansible slave -m shell -a 'ls -l /opt'
[root@t30 ~]# ansible slave -m shell -a 'cat /opt/name'
192.168.1.60 | CHANGED | rc=0 >>
this is test 123
[root@t30 ~]#
## 5.file 模块
该模块主要用于设置文件的属性,比如创建文件、创建链接文件、删除文件等
常见命令:
force #需要在两种情况下强制创建软链接,一种是源文件不存在,但之后会建立的情况下;另一种是目标软链接已存在,需要先取消之前的软链,然后创建新的软链,有两个选项:yes|no
group #定义文件/目录的属组。后面可以加上mode:定义文件/目录的权限
owner #定义文件/目录的属主。后面必须跟上path:定义文件/目录的路径
recurse #递归设置文件的属性,只对目录有效,后面跟上src:被链接的源文件路径,只应用于state=link的情况
dest #被链接到的路径,只应用于state=link的情况
state #状态,有以下选项:
directory:如果目录不存在,就创建目录
file:即使文件不存在,也不会被创建
link:创建软链接
hard:创建硬链接
touch:如果文件不存在,则会创建一个新的文件,如果文件或目录已存在,则更新其最后修改时间
absent:删除目录、文件或者取消链接文件