003.Ansible基础使用
一 ansible命令用法
ansible命令行执行方式有:ad-hoc、ansible-playbook两种,web方式其官方提供付费产品tower。ad-hoc主要用于临时命令的执行,ansible-playbook相当于ad-hoc的集合,通过一定的规则编排在一起执行。
1.1 免密钥
1 [root@manage ~]# ssh-keygen -t rsa -p ''
1 [root@localhost ~]# mkdir .ssh 2 [root@manage ~]# scp -p /root/.ssh/id_rsa.pub root@172.24.8.31:/root/.ssh/authorized_keys 3 [root@manage ~]# scp -p /root/.ssh/id_rsa.pub root@172.24.8.32:/root/.ssh/authorized_keys 4 [root@manage ~]# scp -p /root/.ssh/id_rsa.pub root@172.24.8.33:/root/.ssh/authorized_keys
提示:也可使用以下命令复制到相应的主机:
1 [root@manage ~]# ssh-copy-id -i /root/.ssh/id_rsa.pub root@172.24.8.31
1.2 ad-hoc基础命令
基本语法:
1 ansible <host-pattern> [options]
<host-pattern>:指inventory中定义的主机或主机组,可以为ip、hostname、inventory中的group组名等。同时支持具有“.”、“*”或“:”等特殊字符的匹配型字符串。
提示:<>表示该选项为必选,[]表述是该选项中的参数任选其一或多个。
1 [options]: 2 -v,--verbose:输出更详细的执行过程信息,-vvv可得到执行过程所有信息; 3 -i path,--inventory=path:指定inventory信息,默认/etc/ansible/hosts; 4 -f num,--forks=num:并发线程数,默认5个线程; 5 --private-key=private_key_file:指定秘钥文件; 6 -m name,--module-name=name:指定执行使用的模块;
提示:-m指定模块名称, 默认情况下是指command模块, 可以省略不写。
1 -m directory,--module-path=directory:指定模块存放路径,默认/usr/share/ansible; 2 -a 'arguments',--args=‘arguments’"模块参数; 3 -k,--ask-pass ssh:认证密码; 4 -k,ask-sudo=pass sudo:用户的密码(--sudo时使用); 5 -o,--one-line:标准输出至一行; 6 -s,--sudo:相当于linux系统下的sudo命令; 7 -t directory,--tree=directory:输出信息至directory目录下,结果文件以远程主机命名; 8 -t seconds,--timeout=seconds:指定连接远程主机的最大超时,单位是秒; 9 -b num,--background=num:后台执行命令,超num秒后中止正在执行的任务; 10 -p num,--poll=num:定期返回后台任务进度; 11 -u username,--user=username:指定远程主机以username运行命令; 12 -u sudo_username,--sudo-user=sudo_username:使用sudo,相当于linux系统下的sudo命令; 13 -c connection,--connection=connection:指定连接方式,可用选项paramiko(ssh)、ssh、local,local方式常用于crontab和kickstarts; 14 -l subset,--limit=subset:指定运行主机; 15 -l ~regex,--limit=~regex:指定运行主机(正则); 16 --list-hosts:列出符合条件的主机列表,不执行任何命令。
1.3 playbook基础命令
基本语法:
1 ansible-playbook <playbookname>
1 --ask-vault-pass:加密playbook文件时提示输入密码; 2 -d,--diff:显示文件更新的不同的地方; 3 -e extra_vars,--extra-vars=extra_vars:在playbook中引入外部变量; 4 --flush-cache:将fact清除到的远程主机缓存; 5 --force-handlers:强制运行handlers任务,即使在任务失败的情况下; 6 -i inventory:指定要读取的inventory文件; 7 --list-tags:列出所有可用的tags; 8 --list-tasks:列出所有即将被执行的任务; 9 --skip-tags=skip_tags:跳过指定的tags任务; 10 --start-at-task=start_at_task:从第几条任务开始执行; 11 --step:逐步执行playbook定义的任务,并经人工确认后继续执行下一个任务; 12 --syntax-check:检查playbook中的语法书写; 13 -t tags,--tags=tags:指定执行tags的任务。
二 ansible系列命令介绍
2.1 ansible
ansible是ansible基础命令之一,起主要在如下场景使用:
- 非固化需求;
- 临时性操作;
二次开发接口调用。
2.2 ansible-galaxy
ansible-galaxy类似github或pip功能,通过ansible-galaxy命令可查找和安装优秀的roles。
基本语法:
1 ansible-galaxy [delete|import|info|init|install|list|login|remove|search|setup] [--help] 2 [options] 3 info:列出指定role详细信息; 4 install:下载并安装galaxy指定的roles到本地; 5 list:列出本地已下载的roles; 6 remove:删除本地已下载的roles。
2.3 ansible-pull
ansible默认使用push模式,使用ansible-pull命令可使用ansible另一种工作模式,pull模式。通常适应于以下场景:
大量机器需要配置,即使使用高并发线程依旧要花费很长时间;
在没有网络的机器上运行ansible。
基本语法:
1 ansible-pull -u <repository> [options] [<playbook.yml>]
提示:通过ansible-pull结合git和crontab可实现通过crontab定期拉取指定的git版本到本地,并以指定模式自动运行预先制订的指令。
2.4 ansible-doc
ansible-doc是ansible模块文档说明,针对每个模块都有详细的用法及应用案例介绍,类似linux的man。
基本语法:
1 ansible-doc [-l|-f|-s] [options] [-t <plugin type> ] [plugin]
示例:
1 [root@manage ~]# ansible-doc -l #列出支持的模块 2 [root@manage ~]# ansible-doc ping #查看模块功能说明
2.5 ansible-playbook
ansible-playbook是日常使用频率最高的命令,通过读取预先编写好的playbook文件实现批量管理。playbook具有编写简单、可定制性高、灵活方便,以及可固化日常所有操作的特点。
基本语法:
1 ansible-playbook [options] playbook.yml [playbook2 ...]
2.6 ansible-vault
ansible-vault主要用于配置文件加密,如编写的playbook配置文件中包含敏感信息,可使用ansible-vault加密/解密此配置文件。
基本语法:
1 ansible-vault [create|decrypt|edit|encrypt|encrypt_string|rekey|view] [options] [vaultfile.yml]
加密示例:
1 ansible-vault encrypt test.yml
解密示例:
1 ansible-vault decrypt test.yml
2.7 ansible-console
ansible-console是ansible提供的交互式工具,用户可以在ansible-console虚拟出的终端上类似shell使用ansible内置命令。
三 inventory配置及详解
inventory是ansible管理主机信息的配置文件,默认存放于:/etc/ansible/hosts,命令使用inventory分组格式如下:ansible -i /etc/ansible/hosts myhost -m ping
3.1 定义主机和组
1 [root@manage ~]# vi /etc/ansible/hosts 2 172.24.8.31 #可直接定义ip地址 3 client02 #可定义主机名 4 client03:2345 #可指定非标准22端口 5 [myhost] #定义一个名为myhost的分组 6 172.24.8.31 7 172.24.8.3[2:4] #代表172.24.8.32/172.24.8.33/172.24.8.34也属于此分组
提示:支持同一个主机属于多个分组。
3.2 定义主机变量
1 172.24.8.31 ntp_server=ntp1.aliyun.com
3.3 定义组变量
1 [myhost:vars] 2 ntp_server=ntp1.aliyun.com #定义myhost组中所有主机的ntp_server值
3.4 定义组嵌套及组变量
1 [myhost1] 2 172.24.8.31 3 [myhost2] 4 172.24.8.32 5 172.24.8.33:2345 6 [myhost:children] 7 myhost1 8 myhost2 9 [myhost:vars] 10 ntp_server=ntp1.aliyun.com
3.5 多重变量定义
变量除了可以定义在inventory中,也可以独立于inventory文件之外,通常以.yml、.yaml、.json为后缀或者无后缀。器读取顺序如下:
- inventory配置文件(默认/etc/ansible/hosts)
- playbook中的vars定义的区域
- roles中的vars目录下的文件
- roles同级目录group_vars和hosts_vars目录下的文件
四 ansible与正则
4.1 全量匹配
1 [root@manage ~]# ansible "*" -m ping 2 [root@manage ~]# ansible all -m ping 3 [root@manage ~]# ansible 172.24.8.* -m ping
4.2 逻辑或(or)匹配
1 [root@manage ~]# ansible myhost1:myhost2 -m ping
4.3 逻辑非(!)匹配
1 [root@manage ~]# ansible myhost:\!myhost2 -m ping
提示:所有在myhost组里但不在myhost2组的主机。
去掉!特殊意义,可采用\。
4.4 逻辑与(&)匹配
1 [root@manage ~]# ansible myhost:\&myhost2 -m ping #myhost组和myhost2组同时存在的主机
4.5 多条件组合
1 [root@manage ~]# ansible myhost1:myhost2:\&myhost3:\!myhost4 -m ping 2 #myhost1组和myhost2组所有主机在myhost3中存在的,且不属于myhost4的主机。
4.6 模糊匹配
1 [root@manage ~]# ansible 172* -m ping #所有以172开头的主机
4.7 域切割
1 [root@manage ~]# ansible myhost2[0] -m ping 2 [root@manage ~]# ansible myhost2[0:1] -m ping
提示:ansible底层基于python,ansible也支持获取数组相应值。如:
1 [myhost2] 2 172.24.8.32 3 172.24.8.33:2345 4 myhost2[0]:第一个值,172.24.8.32; 5 myhost2[-1]:最后一个值,172.24.8.33; 6 myhost2[0:1]:第一个值和第二个值; 7 myhost2[1:]:第一个值导最后一个值。
上一篇: 什么野菜补血?这四种野菜补血功效超强