searchusermenu
  • 发布文章
  • 消息中心
点赞
收藏
评论
分享
原创

Ansible的入门文档

2023-05-29 06:45:40
17
0

ansible是一种基于python开发的自动化运维工具,它只需要在服务端安装ansible,无需在每个客户端安装客户端程序,通过ssh的方式来进行客户端服务器的管理,基于模块来实现批量数据配置、批量设备部署以及批量命令执行。

一、ansible 清单配置文件说明

当安装ansible以后,会提供一个默认的管理清单,即/etc/ansible/hosts文件,hosts文件一般为ini 风格的文件格式,具体的格式如下,这里定义了一个分组yum ,该分组中有一台主机IP是10.101.136.33 , all:vars 的分组则是所有的主机组都能使用的变量。默认ansible 可以使用密钥的方式直接免密登陆虚拟机,也可以使用ansible_ssh_pass=密码的方式来管理资产主机。

[all:vars]
[all:vars]
ansible_ssh_user=root
ansible_ssh_port=10000
ansible_python_interpreter=/usr/bin/python2.7

[yum]
10.101.136.33

二、ansible工作模式:

1、adhoc(点对点模式):此模式相当于对管理主机执行单个的shell命令

2、是playbook(剧本模式):该模式应用较多,该模式是指将一系列任务整合形成一个剧本,以此来达成某种功能(譬如部署某个服务,数据库备份等)的目的。

我们在此处只介绍剧本模式,并结合剧本模式来说明各个模块的详细说明。

三、 详细字段说明

3.1 playbook常见的形式

1、在playbook 中直接写tasks任务,所有的任务都在一个剧本中。如下面

---
- name: 安装 Nginx
  hosts: web_servers
  tasks:
    - name: 安装 Nginx
      apt:
        name: nginx
        state: present
      become: true

在上述任务中我们使用的yaml格式来编写任务执行的剧本。这个 Playbook 的目标是在 web_servers 组中的主机上安装 Nginx。

在一个tasks中分别定义了该任务的名字,apt:表示模块的名字name 和state表示该模块的参数。

Ansible 针对不同的任务有不同的模块。如果我们不知道某个模块的参数的意思可以使用ansible-doc -s 模块名 ,来查看该模块的参数的详细的说明,-s 表示是以简洁的方式输出。如果不加-s 则会出现详细的例子,实际在使用时,只需要在此基础上稍作修改就可以完成想要完成的任务。

下面在控制节点上创建 Ansible Playbook 文件,定义 PXC 集群的安装和配置任务。例如:

---

- name: Install PXC Cluster
  hosts: pxc
  become: true
  tasks:
  - name: Install PXC packages
    apt:
      name: "{{ item }}"
      state: present
with_items:
- percona-xtradb-cluster-57
      - percona-xtrabackup-24
  - name: Configure PXC Cluster
    template:
      src: templates/my.cnf.j2
      dest: /etc/mysql/my.cnf
    notify: restart mysql
  handlers:
  - name: restart mysql
    service:
      name: mysql

#在控制节点上创建模板文件,用于生成 PXC 集群的配置文件。例如:

[mysqld]
datadir=/var/lib/mysql
socket=/var/run/mysqld/mysqld.sock
log-error=/var/log/mysql/error.log
pid-file=/var/run/mysqld/mysqld.pid
bind-address=0.0.0.0

# PXC Settings
wsrep_provider=/usr/lib/libgalera_smm.so
wsrep_cluster_name=my_cluster
wsrep_cluster_address=gcomm://{{ groups['pxc'] | map('extract', hostvars, ['ansible_host']) | join(',') }}
wsrep_node_name={{ inventory_hostname }}
wsrep_node_address={{ ansible_host }}
wsrep_sst_method=xtrabackup-v2

执行 ansible-playbook -i inventory.ini pxc.yml 来完成任务的部署。

第一个模块apt 使用with_items 来循环安装指定的包,第二个模块template 通过jinjia2 的语法来动态生成集群的配置文件,第三个模块则是一个触发认为,当配置文件被修改后,在该任务执行完成时,重启该服务来保证配置文件来生效。

3.2 ansible 中变量的使用

在实际的生产过程中,我们即使不用写剧本,但是查看剧本时学会查看剧本的变量还是十分有必要的,因为ansible 的变量十分灵活,灵活则意味着复杂。

下面针对ansible 的变量我们一一来解释说明。

1、 在剧本中使用vars 来定义变量

- hosts: test
vars:
testvar1: testfile
remote_user: root
tasks:
- name: task1
file:
path: /testdir/{{ testvar1 }}
state: touch

2、在剧本中使用vars_file 来定义变量文件,在文件中存放变量

- hosts: test
remote_user: root
vars_files:
- /testdir/ansible/nginx_vars.yml
  • 剧本中gather_facts=true 时ansible 将在各个主机上收集一些常用的信息,这些facts,是ansible 内置变量的一种。我们可以使用setup模块filter 来过滤显示,如果要调用该主机的系统的发行版,则可以使用  {{ansible_distribution}}来调用
  • 自定义注册变量:通过register 来将命令执行的结果注册进 testvar ,在下个任务中调用testvar 就等于调用了上个任务的结果。
---
- hosts: test
remote_user: root
tasks:
- name: test shell
shell: "echo test > /var/testshellfile"
register: testvar
- name: shell module return values
debug:
var: testvar
  • 通过-e 参数传递的方式来传递变量

ansible-playbook cmdvar.yml -e 'pass_var="test"

  • 通过set_fact 来注册变量
---
- hosts: test
remote_user: root
tasks:
- set_fact:
testvar: "testtest"
- debug:
msg: "{{testvar}}"
  • 主机变量和主机组变量
[testB]
test70 ansible_host=10.1.1.70
test71 anisble_host=10.1.1.71
[testB:vars]
test_group_var1='group var test'
test_group_var2='group var test2'
  • 内置变量 play_hosts 、groups、inventory_dir

通过内置变量play_hosts可以获取到当前play所操作的所有主机的主机名列表,如上图中就可以获取[test70,test71]

通过groups内置变量可以获取到清单中”所有分组”的”分组信息”

10.1.1.60
test70.zsythink.net ansible_host=10.1.1.70
test71 anisble_host=10.1.1.71
[testA]
test60 ansible_host=10.1.1.60
test61 ansible_host=10.1.1.61
[testB]
test70 ansible_host=10.1.1.70
[test:children]
testA
testB




# ansible test70 -m debug -a "msg={{groups}}"
test70 | SUCCESS => {
"changed": false,
"msg": {
"all": [
"10.1.1.60",
"test70.zsythink.net",
"test71",
"test60",
"test61",
"test70"
],
"test": [
"test60",
"test61",
"test70"
],

"testA": [
"test60",
"test61"
],

"testB": [
"test70"
],

"ungrouped": [
"10.1.1.60",
"test70.zsythink.net",
"test71"
]}}

通过inventory_dir变量获取到ansible主机中清单文件的存放路径,我使用的是默认的清单文件/etc/ansible/hosts,所以,inventory_dir变量对应的值为/etc/ansible

总结:变量的优先级从低到高排列:

  1. 在清单中定义的组变量。
  2. 在清单或 Playbook 所在目录的 group_vars 子目录中定义的组变量。
  3. 在清单中定义的主机变量。
  4. 在清单或 Playbook 所在目录的 host_vars 子目录中定义的主机变量。
  5. 在运行时中发现的主机事实。
  6. (vars 和 vars_files)playbook 中的 Play 变量。
  7. 任务变量。
  8. 在命令行中定义的额外变量。

注意(如果在多个级别上定义了相同名称的变量,则采用优先级别最高的变量。较窄范围(如主机变量或任务变量)优先于较宽范围(如组变量或 play 变量)。通过清单定义的变量将通过 playbook 定义的变量覆盖。在命令行中使用 --extra-vars 或 -e 选项定义的额外变量拥有最高优先级。

0条评论
作者已关闭评论
张****霞
1文章数
2粉丝数
张****霞
1 文章 | 2 粉丝
张****霞
1文章数
2粉丝数
张****霞
1 文章 | 2 粉丝
原创

Ansible的入门文档

2023-05-29 06:45:40
17
0

ansible是一种基于python开发的自动化运维工具,它只需要在服务端安装ansible,无需在每个客户端安装客户端程序,通过ssh的方式来进行客户端服务器的管理,基于模块来实现批量数据配置、批量设备部署以及批量命令执行。

一、ansible 清单配置文件说明

当安装ansible以后,会提供一个默认的管理清单,即/etc/ansible/hosts文件,hosts文件一般为ini 风格的文件格式,具体的格式如下,这里定义了一个分组yum ,该分组中有一台主机IP是10.101.136.33 , all:vars 的分组则是所有的主机组都能使用的变量。默认ansible 可以使用密钥的方式直接免密登陆虚拟机,也可以使用ansible_ssh_pass=密码的方式来管理资产主机。

[all:vars]
[all:vars]
ansible_ssh_user=root
ansible_ssh_port=10000
ansible_python_interpreter=/usr/bin/python2.7

[yum]
10.101.136.33

二、ansible工作模式:

1、adhoc(点对点模式):此模式相当于对管理主机执行单个的shell命令

2、是playbook(剧本模式):该模式应用较多,该模式是指将一系列任务整合形成一个剧本,以此来达成某种功能(譬如部署某个服务,数据库备份等)的目的。

我们在此处只介绍剧本模式,并结合剧本模式来说明各个模块的详细说明。

三、 详细字段说明

3.1 playbook常见的形式

1、在playbook 中直接写tasks任务,所有的任务都在一个剧本中。如下面

---
- name: 安装 Nginx
  hosts: web_servers
  tasks:
    - name: 安装 Nginx
      apt:
        name: nginx
        state: present
      become: true

在上述任务中我们使用的yaml格式来编写任务执行的剧本。这个 Playbook 的目标是在 web_servers 组中的主机上安装 Nginx。

在一个tasks中分别定义了该任务的名字,apt:表示模块的名字name 和state表示该模块的参数。

Ansible 针对不同的任务有不同的模块。如果我们不知道某个模块的参数的意思可以使用ansible-doc -s 模块名 ,来查看该模块的参数的详细的说明,-s 表示是以简洁的方式输出。如果不加-s 则会出现详细的例子,实际在使用时,只需要在此基础上稍作修改就可以完成想要完成的任务。

下面在控制节点上创建 Ansible Playbook 文件,定义 PXC 集群的安装和配置任务。例如:

---

- name: Install PXC Cluster
  hosts: pxc
  become: true
  tasks:
  - name: Install PXC packages
    apt:
      name: "{{ item }}"
      state: present
with_items:
- percona-xtradb-cluster-57
      - percona-xtrabackup-24
  - name: Configure PXC Cluster
    template:
      src: templates/my.cnf.j2
      dest: /etc/mysql/my.cnf
    notify: restart mysql
  handlers:
  - name: restart mysql
    service:
      name: mysql

#在控制节点上创建模板文件,用于生成 PXC 集群的配置文件。例如:

[mysqld]
datadir=/var/lib/mysql
socket=/var/run/mysqld/mysqld.sock
log-error=/var/log/mysql/error.log
pid-file=/var/run/mysqld/mysqld.pid
bind-address=0.0.0.0

# PXC Settings
wsrep_provider=/usr/lib/libgalera_smm.so
wsrep_cluster_name=my_cluster
wsrep_cluster_address=gcomm://{{ groups['pxc'] | map('extract', hostvars, ['ansible_host']) | join(',') }}
wsrep_node_name={{ inventory_hostname }}
wsrep_node_address={{ ansible_host }}
wsrep_sst_method=xtrabackup-v2

执行 ansible-playbook -i inventory.ini pxc.yml 来完成任务的部署。

第一个模块apt 使用with_items 来循环安装指定的包,第二个模块template 通过jinjia2 的语法来动态生成集群的配置文件,第三个模块则是一个触发认为,当配置文件被修改后,在该任务执行完成时,重启该服务来保证配置文件来生效。

3.2 ansible 中变量的使用

在实际的生产过程中,我们即使不用写剧本,但是查看剧本时学会查看剧本的变量还是十分有必要的,因为ansible 的变量十分灵活,灵活则意味着复杂。

下面针对ansible 的变量我们一一来解释说明。

1、 在剧本中使用vars 来定义变量

- hosts: test
vars:
testvar1: testfile
remote_user: root
tasks:
- name: task1
file:
path: /testdir/{{ testvar1 }}
state: touch

2、在剧本中使用vars_file 来定义变量文件,在文件中存放变量

- hosts: test
remote_user: root
vars_files:
- /testdir/ansible/nginx_vars.yml
  • 剧本中gather_facts=true 时ansible 将在各个主机上收集一些常用的信息,这些facts,是ansible 内置变量的一种。我们可以使用setup模块filter 来过滤显示,如果要调用该主机的系统的发行版,则可以使用  {{ansible_distribution}}来调用
  • 自定义注册变量:通过register 来将命令执行的结果注册进 testvar ,在下个任务中调用testvar 就等于调用了上个任务的结果。
---
- hosts: test
remote_user: root
tasks:
- name: test shell
shell: "echo test > /var/testshellfile"
register: testvar
- name: shell module return values
debug:
var: testvar
  • 通过-e 参数传递的方式来传递变量

ansible-playbook cmdvar.yml -e 'pass_var="test"

  • 通过set_fact 来注册变量
---
- hosts: test
remote_user: root
tasks:
- set_fact:
testvar: "testtest"
- debug:
msg: "{{testvar}}"
  • 主机变量和主机组变量
[testB]
test70 ansible_host=10.1.1.70
test71 anisble_host=10.1.1.71
[testB:vars]
test_group_var1='group var test'
test_group_var2='group var test2'
  • 内置变量 play_hosts 、groups、inventory_dir

通过内置变量play_hosts可以获取到当前play所操作的所有主机的主机名列表,如上图中就可以获取[test70,test71]

通过groups内置变量可以获取到清单中”所有分组”的”分组信息”

10.1.1.60
test70.zsythink.net ansible_host=10.1.1.70
test71 anisble_host=10.1.1.71
[testA]
test60 ansible_host=10.1.1.60
test61 ansible_host=10.1.1.61
[testB]
test70 ansible_host=10.1.1.70
[test:children]
testA
testB




# ansible test70 -m debug -a "msg={{groups}}"
test70 | SUCCESS => {
"changed": false,
"msg": {
"all": [
"10.1.1.60",
"test70.zsythink.net",
"test71",
"test60",
"test61",
"test70"
],
"test": [
"test60",
"test61",
"test70"
],

"testA": [
"test60",
"test61"
],

"testB": [
"test70"
],

"ungrouped": [
"10.1.1.60",
"test70.zsythink.net",
"test71"
]}}

通过inventory_dir变量获取到ansible主机中清单文件的存放路径,我使用的是默认的清单文件/etc/ansible/hosts,所以,inventory_dir变量对应的值为/etc/ansible

总结:变量的优先级从低到高排列:

  1. 在清单中定义的组变量。
  2. 在清单或 Playbook 所在目录的 group_vars 子目录中定义的组变量。
  3. 在清单中定义的主机变量。
  4. 在清单或 Playbook 所在目录的 host_vars 子目录中定义的主机变量。
  5. 在运行时中发现的主机事实。
  6. (vars 和 vars_files)playbook 中的 Play 变量。
  7. 任务变量。
  8. 在命令行中定义的额外变量。

注意(如果在多个级别上定义了相同名称的变量,则采用优先级别最高的变量。较窄范围(如主机变量或任务变量)优先于较宽范围(如组变量或 play 变量)。通过清单定义的变量将通过 playbook 定义的变量覆盖。在命令行中使用 --extra-vars 或 -e 选项定义的额外变量拥有最高优先级。

文章来自个人专栏
文章 | 订阅
0条评论
作者已关闭评论
作者已关闭评论
0
0