文章目录
- Ansible的配置
- 配置文件
 
- 主机清单
- 远程主机的分组
- 变量
 
 
- Ansible的脚本Playbook
- Playbook的文件格式YAML
- ansible-playbook的命令
- Playbook的基本语法
- 变量
 
Ansible的配置
配置文件
Ansible是一款功能强大的自动化工具,可以实现对远程主机的管理和操作,下面是Ansible配置文件的详解。
Ansible的配置文件为ansible.cfg,默认情况下会在以下路径中查找:
- 当前工作目录下的ansible.cfg
- 用户主目录下的.ansible.cfg
- /etc/ansible/ansible.cfg
如果需要使用其他文件名或路径,可以通过在命令行中指定-c参数来覆盖默认配置。
下面是Ansible常用的配置文件参数及其含义:
- inventory:指定主机清单文件的路径,默认为- /etc/ansible/hosts。
inventory = /etc/ansible/hosts
- library:用于指定自定义模块的路径。
library = /usr/share/my_modules/
- remote_tmp:指定了远程主机上用于存储临时文件的目录路径。
remote_tmp = ~/.ansible/tmp
- local_tmp:指定了本地主机上用于存储临时文件的目录路径。
local_tmp = ~/.ansible/tmp
- remote_user:指定 Ansible 在远程主机上执行任务时所使用的用户名。默认情况下,Ansible 会使用当前登录用户的用户名。
remote_user = root
- private_key_file:指定 Ansible 在远程主机上执行任务时所使用的私钥文件路径。可以使用 SSH 密钥对进行身份验证。
private_key_file = /path/to/file
- host_key_checking:指定是否检查远程主机的 SSH 主机密钥。默认情况下,该参数值为- true,表示检查主机密钥;可以将其修改为- False来关闭主机密钥检查。
host_key_checking = False
- forks:指定 Ansible 在同时执行任务时所使用的进程数。默认情况下,该参数值为- 5。
forks          = 5
- become和- become_method:用于在远程主机上以管理员身份执行任务。- become参数用于指定是否启用管理员身份执行任务,可以将其设置为- true或- false;- become_method参数用于指定管理员身份的获取方式,常用的取值包括- sudo、- su等。
become=True
become_method=sudo
- log_path:指定 Ansible 的日志文件路径。可以在该文件中查看 Ansible 的执行日志和错误信息。
log_path = /var/log/ansible.log
主机清单
Ansible 主机清单(Inventory)是指 Ansible 用于管理和执行任务的主机列表。主机清单可以是一个文本文件,也可以是一个脚本或程序。在主机清单中,每个主机都有一个唯一的名称和一个或多个变量,用于指定主机的连接参数、主机组、主机状态等信息。
Inventory的配置文件
/etc/ansible/hosts
在配置文件中修改 Inventory 文件的位置,文件上面讲过默认是在/etc/ansible/ansible.cfg
如果你要修改到 /opt/ansible/hosts的话就要修改配置文件
inventory = /opt/ansible/hosts
利用参数-i传递主机清单配置文件
[root@localhost ~]# ansible-playbook -i /opt/ansible/hosts xxx.yaml
远程主机的分组
给远程主机分组,以便于在Playbook中使用。下面的文件中,展示了主机清单文件中最简单的分组方法,[ ]内是组名。将远程主机分为 test1、test2、test3几个组
vim /etc/ansible/ansible.cfg
# 添加如下
192.168.100.10
[test1]
192.168.200.10
192.168.200.20
three.ipipip.com
[test2]
192.168.200.40
192.168.200.50
[test3]
192.168.200.60
分组也可以支持嵌套。例如 [new_york]、[california]、[texas] 等。那么,我们就可以使用 [usa:children] 来将这些子组组合在一起,并将它们作为一个整体来管理。
[new_york]
192.168.200.20
192.168.100.30
[california]
192.168.200.40
192.168.100.10
[texas]
192.168.100.20
[test3]
192.168.200.60
[usa:children]
new_york
california
texas
变量
主机清单文件中的变量
为单个远程主机指定参数
[test1]
192.168.100.10   http_port=80  
192.168.100.20   http_port=303 
为一个组指定变量
[test1]
192.168.100.10   
192.168.100.10
[test1:vars]
http_port=80
Ansible的脚本Playbook
Playbook的文件格式YAML
Ansible Playbook 使用 YAML 格式编写,YAML(YAML Ain’t Markup Language)是一种轻量级的数据序列化格式,易于阅读和编写。下面是一个 YAML 文件的示例:
---
- hosts: webservers
  become: yes
  tasks:
  - name: Install Apache2
    apt:
     name: apache2
     state: latest
  - name: Start Apache2
    service:
     name: apache2
     state: started
   
# 该示例中,--- 表示 YAML 文件的开始
# hosts 指定了要管理和配置的主机组
# become 表示以管理员身份执行任务。
# tasks 则包含了一组有序的任务列表,其中包括了安装和启动 Apache 两个任务。
# apt 和 service分别表示使用 apt 命令安装 Apache 和启动 Apache 服务
需要注意的是,YAML 文件的缩进与格式非常重要,它们决定了文件的语义和结构。
以下是一些常见的 YAML 语法:
-  注释 :YAML 文件支持注释注释使用 #标记
-  键值对:在 YAML 文件中,键值对使用冒号 :分隔,键和值之间使用空格进行缩进。例如:
key: value
- 数组list
- item1
- item2
- item3
数组中的每个元素都是以-开始的
- 需要注意的地方
变量里有冒号(:)时要加引号
foo: "ansibleLinuxdocker:i like"
变量以 {开头时要加引号
foo: "{{chenshiren}}"
ansible-playbook的命令
如何执行Ansible脚本Playbook呢?Ansible提供了一个单独的命令:ansible-playbook
常见的ansible-playbook的使用方法如下:
执行Playbook的基本方法
ansible-playbook playbook.yml
# playbook.yml 是要执行的 Ansible Playbook 文件名
使用--syntax-check参数检测脚本的语法
ansible-playbook  playbook.yml --syntax-check
使用--verbose查看输出的细节
ansible-playbook playbook.yml --verbose
使用 --list-hosts 查看该脚本影响哪些主机(host)
ansible-playbook playbook.yml --list-hosts
并行执行脚本
ansible-playbook playbook.yml -f 10
Playbook的基本语法
如最上面展示的yaml脚本为例
---
- hosts: webservers
  become: yes
  tasks:
  - name: Install Apache2
    apt:
     name: apache2
     state: latest
  - name: Start Apache2
    service:
     name: apache2
     state: started
可以分为两部分
- 在什么机器上面以什么身份执行
- hosts: webservers
  become: yes
| key | 含义 | 
|---|---|
| hosts | 为主机的IP,或者主机组名,或者关键字all | 
| remote_user | 在远程以哪个用户身份执行 | 
| become | 切换成其他用户身份执行,值为yes或者no | 
| become_method | 与become一起用,指可以为’sudo’/'su’等 | 
| become_user | 与become_user 一起用,可以是root或者其他用户名 | 
- 执行的任务都有什么
  - name: Install Apache2
    apt:
     name: apache2
     state: latest
  - name: Start Apache2
    service:
     name: apache2
     state: started
-  任务(task)是从上至下顺序执行的,如果中间发生错误,那么整个Playbook会中止 
-  每一个任务都是对模块的一次调用,只是使用不同的参数和变量而已 
-  每个任务最好有name属性,这是供人读的,没有实际的操作。然后会在命令行里面输出,提示用户执行情况 
任务的基本语法
 tasks:
  - name: Install Apache2
    apt:
     name: apache2
     state: latest
其中name是可选的,也可以简写成下面的样子
 tasks:
  - apt:
     name: apache2
     state: latest
写了name的任务在Playbook执行时,会显示对应的名字,信息更友好、丰富。
如下
TASK [install http]   *********************************************************************
changed: [192.168.200.20]
changed: [192.168.200.30]
没有写name的任务在执行Playbook时,直接显示对应的任务语法,如果调用模块很多很容易就不知道运行到哪里了
TASK [yum: name=httpd state=present] *********************************************************************
changed: [192.168.200.20]
changed: [192.168.200.30]
参数的不同写法
法1
 tasks:
  - name: Install Apache2
    apt: name=apache2 state=latest
法2
当需要传入的参数过长时,可以分隔到多行
  tasks:
  - name: 设置文件权限  
    copy: src=/home/csq.txt  dest=/tmp/csq.txt
           owner=csq  group=csq  mode=0644
法3
 或者使用YML的字段格式传入参数
 tasks:
  - name: Install Apache2
    apt:
     name: apache2
     state: latest
任务执行的状态
-  如果本次执行了,那么Action会得到返回值 changed
-  如果不需要执行,那么Action会得到返回值 ok
# 以这个文件内容为例执行两次看看结果
- hosts: server
  tasks:
  - name: 复制文件
    copy:
     src: /etc/sudoers
     dest: /opt/
执行第一次

执行第二次

由于第一次执行时,已经复制过文件,因此Ansible会根据目标文件的状态避免重复执行复制
变量
在Playbook中用户自定义的变量
用户可以在 Playbook中,通过vars关键字自定义变量,使用时用{{}}引用起来即可
例如
[root@localhost ceshi]# vim ansible.yaml 
- hosts: server
  vars:
   stdin: "hello,word"
  tasks:
  - name: 输出hello,word
    command: echo {{stdin}}
把变量放在单独的文件中
在 Ansible 中,当变量较多或需要在多个 Playbook 中重用时,可以将变量放置在一个单独的文件中,然后在 Playbook 中通过 var_files 关键字来引用这个文件中定义的变量。 例如,我们可以在 vars.yml 文件中定义一些变量
例如,我们可以在 vars.yml 文件中定义一些变量:
[root@localhost ceshi]# mkdir vars
[root@localhost ceshi]# vim vars/vars.yaml 
#定义数据库的连接信息
files: /home/csq/csq.txt
然后,在 Playbook 中使用 var_files 来引用这些变量:
[root@localhost ceshi]# vim ansible.yaml 
---
- hosts: server
  vars_files:
   - vars/vars.yaml
  tasks:
  - name: 创建两个文件 /home/csq/csq.txt /home/zhw/zhw.txt
    file:
     path: "{{files}}"
     state: touch
     mode: 0600
文件模板中使用的变量
在 Ansible 中,template 模块用于将本地的 Jinja2 模板文件渲染后,将结果写入到远程主机上的某个文件中。在 template 模块中,可以使用多种方式来传递模板文件中需要使用的变量。下面是几种常见的方式:
使用 vars 参数来传递变量
可以在 template 模块中使用 vars 参数来传递变量。
例如:
[root@localhost ceshi]# vim ansible.yaml 
---
- hosts: test1
  vars:
   defined_name: "Hello My name is Chenshiren"
   ansible_hostname: chenshiren
   ansible_default_ipv4: 192.168.200.10
  remote_user: root
  tasks:
  - name: 安装http
    yum:
     name: httpd
     state: present
  - name: 写入配置文件http.conf
    template:
     src: templates/httpd.conf.j2
     dest: /etc/httpd/conf/httpd.conf
  - name: 写入html文件
    template:
     src: templates/index.html.j2
     dest: /var/www/html/index.html
  - name: 重启http服务 设置开机自启
    service:
     name: httpd
     state: restarted
     enabled: yes
# 执行过程
[root@localhost ceshi]# ansible-playbook ansible.yaml 
PLAY [test1] ****************************************************************************
TASK [Gathering Facts] ******************************************************************
ok: [192.168.200.30]
TASK [安装http] ***************************************************************************
ok: [192.168.200.30]
TASK [写入配置文件http.conf] ******************************************************************
ok: [192.168.200.30]
TASK [写入html文件] *************************************************************************
changed: [192.168.200.30]
TASK [重启http服务] *************************************************************************
changed: [192.168.200.30]
PLAY RECAP ******************************************************************************
192.168.200.30             : ok=5    changed=2    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
# 执行完成以后关闭一下防火墙

index.html.j2文件内容如下
[root@localhost ceshi]# cat templates/index.html.j2 
<html>
<title>Demo</title>
<body>
<div class="block" style="hight:99%;">
  <div class="centered">
    <h1>#46 Demo {{defined_name}} <h1>
      <p>Served by {{ansible_hostname}} ({{ ansible_default_ipv4}}).</p>
  </div>
</div>
</body>
</html>
# 你只需要知道 {{}} 是用来引用变量的就行了



















