[内容] Ansible 数据的加密 (vault)

注意:

在使用 Ansible 数据的加密之前,要先安装 Ansible、添加被 Ansible 管理的主机,并且需要 root 权限

正文:

内容目录:

内容一:加密机密文件
1.1 通过密码加密机密文件
1.2 通过文件加密机密文件

内容二:更换已加密的机密文件的密码
2.1 更换通过密码加密的机密文件的密码
2.2 更换通过文件加密的机密文件的密码

内容三:解密机密文件
3.1 直接解密机密文件
3.2 解密机密文件后再将其另存为

内容四:显示已加密的机密文件

内容五:显示已解密的机密文件

内容六:执行已加密的机密文件

具体的内容:

内容一:加密机密文件
1.1 通过密码加密机密文件

# ansible-vault encrypt <confidential files to encrypt>

1.2 通过文件加密机密文件

# ansible-vault reky --vualt-password-file=<file as password> <confidential file to encrypt>

(补充:作为密码的文件可以是任意明文文本)

内容二:更换已加密的机密文件的密码
2.1 更换通过密码加密的机密文件的密码

# ansible-vault reky --vault-id <encrypted confidential file>

或者:

# ansible-vault reky --ask-vault-pass <encrypted confidential file>

2.2 更换通过文件加密的机密文件的密码

# ansible-vault reky --new-vualt-password-file=<file as password> <encrypted confidential file>

(补充:作为密码的文件可以是任意明文文本)

内容三:解密机密文件
3.1 直接解密机密文件

# ansible-vault decrypt <confidential file to decrypt>

3.2 解密机密文件后再将其另存为

# ansible-vault decrypt <confidential file to decrypt> --output <confidential file saved as a decrypted file>

内容四:显示已加密的机密文件

# ansible-vault view <encrypted confidential file>

内容五:显示已解密的机密文件

# ansible-vault edit <encrypted confidential file>

内容六:执行已加密的机密文件

# ansible-playbook --vault-id <encrypted confidential file>

或者:

# ansible-playbook --ask-vault-pass <encrypted confidential file>

[内容] Ansible 执行脚本 Playbook 的循环

注意:

在使用 Playbook 之前,要先安装 Ansible、添加被 Ansible 管理的主机,并且需要 root 权限

正文:

内容目录:

内容一:在 playbook 里使用循环
1.1 在 playbook 里使用简单的单循环
1.2 在 playbook 里使用数组实现单组循环
1.3 在 playbook 里使用变量实现单组循环
1.4 在 playbook 里使用数组实现多组循环

内容二:在 json 文档上使用单组循环
2.1 在 json 文档上使用单组循环
2.2 使用 json 文档的 playbook

具体的内容:

内容一:在 playbook 里使用循环
1.1 在 playbook 里使用简单的单循环

# vim test.yml

创建以下内容:

---
- name: test
  hosts: all
  tasks:
  - name: install rpms
    yum:
    - php
    - nginx
    - mariadb


补充:这里以
1) 在 test.yml 中
2) 创建一个名为 test,
3) 在所有服务器上执行,
4) 安装 php、nginx 和 mariadb,
的 playbook 为例

1.2 在 playbook 里使用数组实现单组循环

# vim test.yml

创建以下内容:

---
- name: test
  hosts: all
  tasks:
  - user:
      name: "{{item.name}}"
      group: "{{item.group}}"
      password: "{{'1' | password_hash('sha512',mysecretsalt)}}"
    with_items:
    - {name: "a1", group: "users"}
    - {name: "a2", group: "mail"}
    - {name: "a3", group: "wheel"}
    - {name: "a4", group: "root"}


补充:这里以
1) 在 test.yml 中
2) 创建一个名为 test
3) 在所有服务器上执行
4) 创建一个循环组的用户
的 playbook 为例

1.3 在 playbook 里使用变量实现单组循环

# vim test.yml

创建以下内容:

---
- name: test
  hosts: all
  vars:
    issue_all
    - issue_name: a
      issue_cont: 1
    - issue_name: b
      issue_cont: 2
    - issue_name: c
      issue_cont: 3
    - issue_name: d
      issue_cont: 4
    - issue_name: e
      issue_cont: 5
  tasks:
  - name: issue
    shell: "echo {{ item.issue_name }}={{ item.issue_cont }}"
    loop: "{{ issue_all }}"


补充:这里以
1) 在 test.yml 中
2) 创建一个名为 test
3) 在所有服务器上执行
4) 输出一个循环组的信息
的 playbook 为例

1.4 在 playbook 里使用数组实现多组循环

# vim test.yml

创建以下内容:

---
- name: test
  hosts: all
  remote_user: root
  vars:
    name: [a, b, c]
    id: [1, 2, 3]
  tasks:
  - shell: echo {{item}}
    with_nested:
    - "{{name}}"
    - "{{id}}"


补充:这里以
1) 在 test.yml 中
2) 创建一个名为 test
3) 在所有服务器上执行
4) 循环输出两个循环组的信息(本案例会输出信息:a1、a2、a3、b1、b2、b3、c1、c2、c3)
的 playbook 为例

内容二:在 json 文档上使用单组循环
2.1 在 json 文档上使用单组循环

# vim hosts.j2

创建以下内容:

{% for host in groups['all'] %}
{{ hostvars[host]['ansible_facts']['hostname'] }} {{ hostvars[host]['ansible_facts']['default_ipv4']['address'] }}
{% endfor %}

(补充:这里以创建所有服务器名和 IP 地址对应的关系,名为 hosts.j2 的 json 文件为例)

2.2 使用 json 文档的 playbook

# vim test.yml

添加以下内容:

......
  - name: template
    template:
      src: hosts.j2
      dest: /root/hosts.txt
......

(补充:这里以在 test.yml 中,使用 hosts.j2 创建 /root/hosts.txt 为例)

[内容] Ansible 事实变量 (Ansible 内部变量)

注意:

在使用 Ansible 事实变量之前,要先安装 Ansible、添加被 Ansible 管理的主机,并且需要 root 权限

正文:

内容一: 在命令行使用事实变量
1.1 显示所有事实变量

# ansible all -m setup

(补充:这里以显示所有服务器上的所有事实变量为例)

1.2 显示某一个事实变量

# ansible all -m setup -a filter=*hostname*

(补充:这里以显示所有服务器上的 hostname 事实变量为例)

内容二:在 playbook 使用事实变量的方法

# vim test.yml

创建以下内容:

---
- name: test
  hosts: all
  vars:
  - server_name: IP_ADDRESS
    server_cont: "{{ ansible_default_ipv4.address }}"
  - server_name: HOST_NAME
    server_cont: "{{ ansible_hostname }}"
  tasks:
......

或者:

---
- name: test
  hosts: all
  vars:
  - server_name: IP_ADDRESS
    server_cont: "{{ ansible_facts['default_ipv4']['address'] }}"
  - server_name: HOST_NAME
    server_cont: "{{ ansible_facts['hostname'] }}"
  tasks:
......


补充:
这里以在 test.yml 中:
1) 创建一个名为 test,
2) 在所有服务器上执行,
3) 创建名为 IP_ADDRESS 的 IP 地址事实变量和名为 HOST_NAME 的服务器名称的事实变量,
的 playbook 为例

内容三:在 json 文档上使用事实变量

# vim index.html.j2

创建以下内容:

{{ ansible_hostname }} {{ ansible_default_ipv4.address }}

或者:

{{ ansible_facts['hostname'] }} {{ ansible_facts['default_ipv4']['address'] }}

(补充:这里以创建一个名称为 index.html.j2,包含服务器名称的事实变量和服务器 IP 地址的事实变量的 json 文件为例)

补充: Ansible 在 playbook 里关闭事实收集的方法

# vim test.yml

创建以下内容:

---
- name: test
  hosts: all
  gather_facts: false
  tasks:
......

(补充:这里以在 test.yml 中,创建一个名称为 test,在所有服务器上取消事实变量的 playbook 为例)

[内容] Ansible 变量的优先级

第一优先级:全局范围的变量(例如:执行临时命令时指定的变量)
第二优先级:playbook 里的变量。
第三优先级:主机范围里的变量(例如:清单中的服务器或服务器组)

(补充:清单中的服务器优先级高于清单中的服务器组)

[内容] Ansible 魔法变量

注意:

在使用 Ansible 魔法变量之前,要先安装 Ansible、添加被 Ansible 管理的主机,并且需要 root 权限

正文:

内容一:Ansible 常用魔法变量

1) inventory_hostname

显示服务器名


2) group_names

显示服务器所在组


3) groups

显示服务器所在组,以及组里的所有服务器


4) hostvars

显示所有相关信息

内容二:Ansible 魔法变量的使用
2.1 在命令行使用魔法变量
2.1.1 魔法变量的使用格式

# ansible <Ansible server name or Ansible group name> -m debug -a var=<Ansible magic variable name>

2.1.2 魔法变量的使用案例
2.1.2.1 显示所有魔法变量

# ansible -m debug -a var=hostvars all

(补充:这里以显示所有服务器上的所有魔法变量为例)

2.1.2.2 显示某一个魔法变量

# ansible -m debug -a var=inventory_hostname all

(补充:这里以显示所有服务器上的 inventory_hostname 魔法变量为例)

2.2 在 playbook 使用魔法变量
2.2.1 在 playbook 的变量中使用魔法变量

# vim test.yml
---
- name: test
  hosts: all
  vars:
    server_all:
    - server_name: IP_ADDRESS
      server_cont: "{{ ansible_default_ipv4.address }}"
    - server_name: HOST_NAME
      server_cont: "{{ inventory_hostname }}"
  tasks:
......


补充:这里以
1) 在 test.yml 中,
2) 创建一个名为 test,
3) 在所有服务器上执行,
4) 创建名为 server_all 的变量数组,
5) 里面有名为 IP_ADDRESS 的 IP 地址事实变量和名为 HOST_NAME 的服务器名称版本事实变量,
的 playbook 为例

2.2.2 在 playbook 的条件判断 when 中使用魔法变量
2.2.2.1 案例一:使用一个魔法变量

# vim test.yml

添加以下内容:

......
when: "'test' in group_names"
......

(补充:这里以在 test.yml 中, test 为服务器的所属组为条件判断为例)

2.2.2.2 案例二:使用两个魔法变量

# vim test.yml

添加以下内容:

......
when: inventory_hostname in groups.test
......

(补充:这里以在 test.yml 中,服务器名在 test 组中为条件判断为例)

2.3 在 json 文档上使用魔法变量
2.3.1 在 json 文档上使用魔法变量

# vim hosts.j2

创建以下内容:

{% for host in groups['all'] %}
{{ hostvars[host]['ansible_facts']['hostname'] }} {{ hostvars[host]['ansible_facts']['default_ipv4']['address'] }}
{% endfor %}

(补充:这里以创建所有服务器名和 IP 地址对应的关系,名为 hosts.j2 的 json 文件为例)

2.3.2 使用 json 文档的 Playbook

# vim test.yml

添加以下内容:

......
  - name: template
    template:
      src: hosts.j2
      dest: /root/hosts.txt
......

(补充:这里以在 test.yml 中,使用 hosts.j2 创建 /root/hosts.txt 为例)