Ansible基础知识笔记(一),(2)除了直接在ho


一.变量

(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

六. 其它注意项

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 ' ' 中指定。

如下:

 -e 'ansible_user=XXXX'

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 中的内容会写到一行中;字符\"中的\是转义符的标识,需留意。 

七. 学习参考

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

 

-----笔记性质,待进一步整理

相关内容