awoyaoc 2020-05-08
安装完ansible后,发现ansible一共为我们提供了七个指令:ansible、 ansible-doc、ansible-galaxy、ansible-console、ansible-playbook、ansible-pull、ansible-vault。
下面简单介绍一下这几个命令的用法。相应命令的详细用法可以通过man来查询。
Ansible是指令核心部分,其主要用于执行ad-hoc命令。 Ad-Hoc 是指ansible下临时执行的一条命令,并且不需要保存的命令。
一个ad-hoc命令的执行,需要按以下格式进行执行:
ansible 主机或组 -m 模块名 -a "模块参数" ansible参数
其中:
该指令用于查看模块信息,常用参数有-l ,具体如下:
//列出所有已安装的模块
ansible-doc -l
//查看某个模块的具体用法
ansible-doc <module>
ansible-galaxy 指令用于方便的从https://galaxy.ansible.com/ 站点下载第三方扩展模块,我们可以形象的理解其类似于centos下的yum、python下的pip或easy_install 。
ansible-console是ansible为我们提供的一款交互式工具,类似于Windows中的cmd及Linux中的shell。可以在ansible-console虚拟出来的终端上像shell一样使用ansible内置的各种命令,这为习惯于shell交互方式的用户提供了良好的使用体验,所有的操作与shell类似,而且支持tab键补全。
如:
该指令是使用最多的指令,其通过读取playbook 文件后,执行相应的动作。
该指令使用需要谈到Ansible的另一种工作模式:pull模式(Ansible默认使用push模式)。
前面的学习使用都是基于Ansible 的push 模式来工作,即不要在远程主机做任何操作只需要在控制机编排playbook,push 到远程主机即可完成任务,另外一个工作模式就是pull这和通常使用的push模式工作机理刚好相反,其适用于以下场景:
1) 被控节点在配置时不可用,比如自动伸缩的服务池
2) 被控节点较多,控制机资源有限无法满足高线程和低时间的运行效率
Ansible 基于pull 模式的工作流程:
1) 每台被控端需要安装Ansible 和git(svn)
2) 所有的配置及playbooks 都存放在git 仓库
3) 被控端的ansible-pull 计划任务会定期检查给定的git 的tag 或者分支
4) ansible-pull 执行特定的playbooks 即local.yml 或者hostname.yml
5) 每次更改playbooks 只需要提交到git 即可
将Ansible设置为从节点pull而不是push,是有一些缺点,例如要求在节点上安装软件,但是也存在一些优点:
在GitHub上创建一个新的库:pull-test
本地将这个库下载下来,并提交ansible脚本:
# git clone 10.152.35.204:root/pull-test.git # cd pull-test/ # vim main.yml # git add main.yml # git commit -m "show route info" # git push -u origin master
这里的main.yml只是打印了本地的路由信息,实际上可以执行任何操作:
编辑host inventory:
127.0.0.1 ansible_ssh_pass=root123
开始测试:
注意,ansible-pull的本地主机清单里面的ip地址必须是127.0.0.1,否则会报错:
ERROR! Specified hosts and/or --limit does not match any hosts
如果不提供任何主机清单(/etc/ansible/hosts里面也为空),那么仓库中的ansible脚本里面需要使用127.0.0.1或者localhost作为hosts。
在实际应用中,ansible-pull一般与linux下的crontab协作,用于定期检查仓库中的配置或者脚本是否更新:
# -C 分支 -d 目的地 -i 主机路径 -e 添加参数 -o 只有git仓库发生改变才执行playbook
如:
*/5 * * * * ansible-pull -C master -d /root/test -i /opt/ansible-pull-test/hosts -U <github仓库> -e "role=db" shenchan.yml -o
ansible-vault主要应用于配置文件中含有敏感信息,又不希望他能被人看到,vault可以帮你加密/解密这个配置文件,属高级用法。
主要对于playbooks里比如涉及到配置密码或其他变量时,可以通过该指令加密,这样我们通过cat看到的会是一个密码串类的文件,编辑的时候需要输入事先设定的密码才能打开。这种playbook文件在执行时,需要加上 --ask-vault-pass参数,同样需要输入密码后才能正常执行。
5.7.6 还可以将加密的密码存在文件中,这样在运行的时候就不需要输入密码了:
注:从ansible2.4开始,官方就不再推荐使用--vault-password-file选项了,开始推荐使用--vault-id来代替--vault-password-file指定密码文件。
同样的,在更新密码的时候,推荐使用--new-vault-id来代替--new-vault-password-file指定新的密码文件。
前面的命令都是对整个文件进行加密,但是通常我们并不需要加密整个文件,因为这样反而会对我们的阅读造成困扰,有时我们只是想把“密码”等敏感信息隐藏起来而已。
从ansible2.3开始,使用encrypt_string命令,可以加密字符串,通过加密字符串的功能,能够有效的隐藏敏感信息的值。
比如,有如下的playbook:
我们觉得password这个密码变量以明文的方式存储在playbook中不太安全,因为所有有权限查看该playbook的人都能看到密码,我们需要对密码字符串的值进行加密,以保证它不会明文出现在这里。操作如下:
先对字符串进行加密,加密时,会提示输入密码:
这一长串文本就是1234加密后的文本。现在,复制这串文本,用这串文本替换playbook中的密码,如:
这里的密码已经被替换为了加密后的字符串了,下面来运行这个playbook:
除了上述几个命令之外,还有ansible-lint这个命令,不过需要安装ansible-lint的软件包
ansible-lint 是一个对playbook的语法进行检查的工具。
如果没有安装ansible-lint,也可以使用 ansible-playbook --syntax-check对剧本进行语法的检查。
ansible-playbook --syntax-check + 剧本名 (对剧本语法进行检查但不执行)