目录
一、部署文件的常用模块
二、使用jinja2文件部署自定义文件
一、部署文件的常用模块
部署文件常用模块有
- file 创建、删除文件或目录,修改selinux上下文。
- copy 复制文件到受控节点上,也可以直接在受控结点上创建文件。
- fetch 从受控结点获取文件。
- lineinfile 修改文件。
- blockinfile 修改文件。
- sefcontext 和 seport 模块可以持久修改 selinux 上下文。
这些模块的使用方法都可以通过 ansible-doc 查看文档,找例子修改一下就可以使用。
二、使用jinja2文件部署自定义文件
Ansible 将 jinja2 模板系统用于模板文件。Ansible 还使用 jinja2 语法来引用 playbook 中的变量。
- 使用 {% EXPR %} 表达式反映循环或判断
- 使用 {{ }} 反映变量的替换
- 使用 {# COMMENT #} 语法括起不应出现在最终文件中的注释
jinja2 模板通过 template 模块部署到受管主机上,用法类似于 copy,但是生成文件的内容就很牛逼了。
注意:可以在 Ansible 模板中使用 jinja2 循环和条件,但不能在 Ansible Playbook 中使用。
.j2 模板编写举例,结合 hostvars、groups、ansible_facts 等来编写 jinja2 模板,并用 plabook 生成 /etc/myhosts 文件。
我们把 dev 组上的 /etc/hosts 文件获取到本地,命名为 hosts.j2。
[student@workstation ansible]$ ansible dev -m fetch -a "src=/etc/hosts dest=./hosts.j2 flat=yes"
[student@workstation ansible]$ cat hosts.j2
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
编辑 hosts.j2。用魔法变量 groups.all 遍历所有主机。用魔法变量 hostvars 获取所有主机的 ansible_facts ,从而取得他们的IP地址、FQDN 和 hostname。
[student@workstation ansible]$ vim hosts.j2 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6{% for host in groups.all %}
{{ hostvars[host].ansible_facts.default_ipv4.address }} {{ hostvars[host].ansible_facts.fqdn }} {{ hostvars[host].ansible_facts.hostname }}
{% endfor %}
编写 hosts.yml 对所有主机生成 /tmp/hosts 文件,里面应当包含所有主机的IP地址、FQDN 和 hostname。
[student@workstation ansible]$ vim hosts.yml---
- hosts: alltasks:- name: Create /tmp/hoststemplate:src: hosts.j2dest: /tmp/hosts
执行并验证。
[student@workstation ansible]$ ansible-playbook hosts.yml --syntax-check
[student@workstation ansible]$ ansible-playbook hosts.yml --check
[student@workstation ansible]$ ansible-playbook hosts.yml
[student@workstation ansible]$ ansible all -a "cat /tmp/hosts"serverb.lab.example.com | CHANGED | rc=0 >>
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6192.168.27.133 servera.lab.example.com servera
192.168.27.134 serverb.lab.example.com serverb
192.168.27.135 serverc.lab.example.com serverc
192.168.27.136 serverd.lab.example.com serverdserverc.lab.example.com | CHANGED | rc=0 >>
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6192.168.27.133 servera.lab.example.com servera
192.168.27.134 serverb.lab.example.com serverb
192.168.27.135 serverc.lab.example.com serverc
192.168.27.136 serverd.lab.example.com serverd......