Ansible基础知识笔记(一)
一.变量
(1)ansible默认的主机清单文件为”/etc/ansible/hosts”,可以在默认的清单文件中为各个主机定义主机变量、为各个组定义组变量。
(2)除了直接在hosts文件中定义主机变量和组变量,还有一种方法也可以定义主机变量和组变量,即在清单文件的同级目录中创建两个目录,分别为”group_vars”和”host_vars”,将组变量文件放在”group_vars”目录中,将主机变量文件放在”host_vars”目录中,这样ansible就能获取到对应组变量和主机变量了。且group_vars定义的优先级比hosts定义的组变量的优先级更高。
在group_vars目录中,有两种方式可以定义组变量。
方式一:直接使用变量文件,变量文件的文件名需要与组名相同(可以添加”.yml”、”.yaml”、”.json”作为后缀)。
方式二:使用目录,目录名需要与组名相同,然后再在目录中定义变量文件。
在”host_vars”目录中定义主机变量也有两种方式
方式一:直接使用变量文件,变量文件的文件名需要与主机名相同(可以添加”.yml”、”.yaml”、”.json”作为后缀)。
方式二:使用目录,目录名需要与主机名相同,然后再在目录中定义变量文件。
“host_vars”目录能够定义在主机清单的同级目录下,也能定义在playbook的同级目录下,定义在playbook同级目录中的优先级更高。
(3)即使在调用角色的时候传入对应的变量,也无法覆盖定义在vars/main.yml文件中的值,那么我们可以利用这个特性,将你想要确保使用的值定义在vars/main.yml中,以便别人在调用角色时,使用的值就是你定义的值,当然,如果你强烈推荐的值别人压根不想使用,也是有办法灵活的进行覆盖的,比如在调用playbook时使用”-e”选项传入参数.
除了使用”-e”传入的变量的优先级,其他变量(包括主机变量)的优先级均低于vars/main.yml中变量的优先级。
如何对变量加密
有些变量需要加密的,例如密码等。可以通过encrypt_string命令,对指进行加密。
例如:
ansible-vault encrypt_string 123456
需要特别注意的是声明格式, 变量名称: 加密值。此时加密值不能放到引号中。
即如下是正确的
vars: test_user: "testuser" test_passwd: !vault | $ANSIBLE_VAULT;1.1;AES256 30316633646364663764333666383437373439353538353336623532323131623739353663653637 3430626637386231366236643034643365323738336231330a326534623039363030393739663237 65623635616666656233333337636439366535383334393138623231613035373133323832383335 3737386234363761350a343839326663626664396436336465393862613237393864316533663533 6335
下面的是错误的,不会对值进行解密的
vars: test_user: "testuser" test_passwd: "!vault | $ANSIBLE_VAULT;1.1;AES256 30316633646364663764333666383437373439353538353336623532323131623739353663653637 3430626637386231366236643034643365323738336231330a326534623039363030393739663237 65623635616666656233333337636439366535383334393138623231613035373133323832383335 3737386234363761350a343839326663626664396436336465393862613237393864316533663533 6335"
”使用ansible-vault加密数据“可以通过以下网址了解更多知识。
https://www.zsythink.net/archives/3250
二. playbook 部分
在ansible中,类似”脚本”的文件被称作”剧本”,’剧本’的英文名称为’playbook’,将要做的事情编写成playbook,把不同的模块按照顺序编排在剧本中,ansible就会按照剧本一步一步的执行。可作为一个适合部署复杂应用程序的基础。可以定制配置,可以按指定的操作步骤有序执行,支持同步和异步方式。
playbook是通过YAML格式来进行描述定义的,可实现多台主机应用的部署,对不同分组的主机执行特定指令步骤。
常用参数说明
hosts
#自定义主机,非必选项,默认将引用/etc/ansible/hosts的参数,要引用自定义hosts,需要通过-i file参数来实现。
tasks
需要在主机上运行的任务
name
play 的名称,在运行该 play 时,会在运行过程中显示。
become
与配置文件中的 become 作用一样,用于提权,当配置文件中禁用提权时,你想要某个 play 使用提权的话,你可以在 play 中添加 become。
playbook 以 yaml 格式编写的,通常以 yml 扩展名保存。yaml 格式使用空格缩进,对于空格的数量没有特别要求,但需要注意:
- 同一级别内的元素必须使用相同的缩进;
- 对于子项目,缩进必须比父项目多
执行示例
ansible-playbook -i inventory/hosts playbooks/deploy_0_to_full_mysql_mha.yml
查询具体执行过程
在调试的时候,为了查看具体的执行过程,特别是为了获取更具体的错误信息时,我们可以借助 -vvvv。
如果要查询 ansible XXXX 某命令的执行过程,可以在命令的最后,添加 -vvvv 命令即可。
例如上面的命令
ansible-playbook -i inventory/hosts playbooks/deploy_0_to_full_mysql_mha.yml -vvvv
三. 角色
tasks目录
角色需要执行的主任务文件放置在此目录中,默认的主任务文件名为main.yml,当调用角色时,默认会执行main.yml文件中的任务,你也可以将其他需要执行的任务文件通过include的方式包含在tasks/main.yml文件中。
handlers目录
当角色需要调用handlers时,默认会在此目录中的main.yml文件中查找对应的handler
defaults目录
角色会使用到的变量可以写入到此目录中的main.yml文件中,通常,defaults/main.yml文件中的变量都用于设置默认值,以便在你没有设置对应变量值时,变量有默认的值可以使用,定义在defaults/main.yml文件中的变量的优先级是最低的。
vars目录
角色会使用到的变量可以写入到此目录中的main.yml文件中,看到这里你肯定会有疑问,vars/main.yml文件和defaults/main.yml文件的区别在哪里呢?区别就是,defaults/main.yml文件中的变量的优先级是最低的,而vars/main.yml文件中的变量的优先级非常高,如果你只是想提供一个默认的配置,那么你可以把对应的变量定义在defaults/main.yml中,如果你想要确保别人在调用角色时,使用的值就是你指定的值,则可以将变量定义在vars/main.yml中,因为定义在vars/main.yml文件中的变量的优先级非常高,所以其值比较难以覆盖。
meta目录
如果你想要赋予这个角色一些元数据,则可以将元数据写入到meta/main.yml文件中,这些元数据用于描述角色的相关属性,比如 作者信息、角色主要作用等等,你也可以在meta/main.yml文件中定义这个角色依赖于哪些其他角色,或者改变角色的默认调用设定,在之后会有一些实际的示例,此处不用纠结。
templates目录
角色相关的模板文件可以放置在此目录中,当使用角色相关的模板时,如果没有指定路径,会默认从此目录中查找对应名称的模板文件。
files目录:角色可能会用到的一些其他文件可以放置在此目录中,比如,当你定义nginx角色时,需要配置https,那么相关的证书文件即可放置在此目录中。
四. 任务委派--让某个任务在指定的主机上执行【delegate_to】
当我们执行一个playbook时,需要设置目标主机,也就是说,playbook中定义的task会在目标主机上执行(一些特定的模块除外,某些模块天生就只会在ansible主机上执行,即使你指定了目标主机,它也仍然会在ansible主机上执行)。但是,在某些场景下,我们需要指定某个任务在特定的主机上执行。遇到这种情况,我们就可以使用ansible的”任务委托”功能,”任务委派”可以让某个任务在指定的主机上执行,使用”delegate_to”关键字即可实现”任务委托”功能。
五. Python 与 Ansible
paramiko模块
基于SSH用于连接远程服务器并执行相关操作。
python3调用ansible_python调用ansible远程执行命令
https://blog.csdn.net/weixin_39840235/article/details/112805915
六.ansible-doc 查看模块的信息和用法
6.1 列出所有可用模块
使用ansible-doc -l
命令可以列出所有可用的模块。
6.2 查看指定模块的文档
使用ansible-doc <module_name>
命令可以查看指定模块的文档,例如ansible-doc ping
查看ping模块的文档。
6.3 显示详细的说明和示例
使用ansible-doc -s <module_name>
命令可以显示模块的详细说明和示例,例如ansible-doc -s ping
查看ping模块的详细使用方法。
6.4 模块未安装
使用ansible-doc XXX查看某模块时,如果未安装,则会提示一个 WARNING.
例如:
[WARNING]:module XXX not found in: /root/.ansible/plugins/modules :/usr/share/ansible/plugins/modules :/usr/lib/python2.7/site-packages/ansible/modules
从上面的反馈信息中,可以得知module信息的查找,在以下三个路径下:
/root/.ansible/plugins/modules
/usr/share/ansible/plugins/modules
/usr/lib/python2.7/site-packages/ansible/modules
有时候 使用 ansible-doc -l 查询所有模块,返回的信息繁杂,建议可以直接进入以上路径去查找,它还有一个简单的分类。
例如数据库的
/usr/lib/python2.7/site-packages/ansible/modules/database
mysql的module所在的路径为
/usr/lib/python2.7/site-packages/ansible/modules/database/mysql
七. 其它注意项
1. 连接ansible主机本身报错
如果在连接ansible本身报错,报错信息
Data could not be sent to remote host \"XX.XX.XX.XX\".Make sure this host can be reached over ssh: OpenSSH_8.6p1,.............
表示通过SSH连接 ansible 主机(本身)的时候报错,此时,我们可以通过设置ansible_connection参数来避免这种错误。在host的文件中,找到对应的IP,追加如下信息即可:
ansible_connection=local
表示本地连接,无需SSH连接。
2. 可能连接部分被管理机需指定SSH用户
连接不上,报错的信息和前面的情形一样。此时可以使用参数ansible_user。
更多关于“主机清单文件 hosts”的设置,可以参考如下分享:
https://blog.csdn.net/a20251839/article/details/116198644
3. 也可以在执行环境变量中指定ansible_user
可以在houst文件中,指定ansible_user属性,执行ansible-playbook 也可以在 执行环境变量 -e ' ' 中指定。
如下:
4.例如 监控体系变化,telegraf 收集的数据既要写入influxDB,又要写入 victoriametrics中
部分代码如下:
# 查看telegraf 配置文件中释放已添加的参数 - name: Check if has add telegraf_vm shell: "cat /etc/telegraf/telegraf.conf | grep victoriametrics-addr|wc -l" register: check_telegraf_vm ignore_errors: yes # 如果配置文件中没有vm的配置,则添加 - name: add the para of vm to telegraf cnf blockinfile: path: /etc/telegraf/telegraf.conf marker: "#{mark}######add Victoriametrics #####" insertafter: "influx_uint_support" block: "[[outputs.influxdb]]\n urls = [\"http://<victoriametrics-addr>:8428/insert/XXXX/influx\"] " backup: yes when: - check_telegraf_vm.stdout == "0" ignore_errors: yes
说明: (1) victoriametrics-addr 代表 其程序部署所在的DB ServerIP(上线时,请根据实际需求替换,此处只是演示);(2) block: "[[outputs.influxdb]]\n urls = [\"http://<victoriametrics-addr>:8428/insert/XXXX/influx\"] " 这一行中 ,字符\n起到的作用是换行,如果没有 \n ,block 中的内容会写到一行中;字符\"中的\是转义符的标识,需留意。
八 案例
8.1 统计某相关进程,是否仍然存在。
有时候stop service,其进程仍然存在,这时,就需要通过查看进程来进一步判断。
- name: check if XXXXX process still exist shell: ps -ef | grep xxxxx | grep -v grep register: xxxxx_process ignore_errors: true - name: print the qty of active xxxx process if exist debug: msg: "You colud stop xxxxx service, but still {{xxxxx_process.stdout_lines|length}} xxxxx process is active. " when: xxxxx_process.stdout_lines|length >0
8.2 目录查找和重命名
查看指定路径下是否存在 XXYYZZ 目录,存在的话,明确告知,并且把这个目录重命名为XXYYZZ_当前日期时间
- name: find /data/ if have XXYYZZ directory find: path: /data recurse: no file_type: directory patterns: ['XXYYZZ'] ###如果是多个,可以向 [] 继续添加。用,隔开即可 register: XXYYZZ_status - name: print the result of finding directory debug: meg: "the path have XXYYZZ" when XXYYZZ_status.matched >0 - name: rename XXYYZZ add datatime shell: mv XXYYZZ XXYYZZ_$(date+"%Y-%m-%d-%H-%M-%S") when XXYYZZ_status.matched >0 ignore_errors: true
九. 学习参考
1.ansible笔记--朱双印
https://www.zsythink.net/archives/category/%e8%bf%90%e7%bb%b4%e7%9b%b8%e5%85%b3/ansible
2.Python模块之paramiko
https://blog.csdn.net/m0_59485658/article/details/128097458
3.Install MySQL MHA with Ansible
https://gitee.com/leviathan-litan/ansible-mysql-mha/tree/master#install-mysql-mha-with-ansible
-----笔记性质,待进一步整理
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· 清华大学推出第四讲使用 DeepSeek + DeepResearch 让科研像聊天一样简单!
· 实操Deepseek接入个人知识库
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库