目录
1.变量命名
2.变量级别
3.变量设定和使用方式
在playbook中直接定义变量
在文件中定义变量
使用变量
设定主机变量和清单变量
目录设定变量
用命令覆盖变量
使用数组设定变量
编辑 注册变量
事实变量
编辑
魔法变量
JINJA2模板
j2模板书写规则
编辑
for循环
if判定
Ansible的加密控制
创建加密文件
加密现有文件
查看加密文件
编辑加密文件
解密文件
编辑更改密码
- name: test var
hosts: all
vars:
USER: user
vim user_list.yml
USER: user
vim westos.yml
- name: test var
hosts: all
vars_files:
- ./user_list.yml
tasks:
- name: create user
user:
name: "{{ USER }}"
vim inventory
[host1]
192.168.81.11
[host2]
192.168.81.12
[host1:vars]
USER="user1"
[host2:vars]
USER="user2"
mkdir group_vars
vim group_vars/host1
vim group_vars/host2
//清单变量,目录中的文件名称与主机清单名称一致
mkdir host_vars
vim host_vars/192.168.81.11
vim host_vars/192.168.81.12
//主机变量,目录中的文件名称与主机名称一致
ansible-playbook test.yml -e "USER=hahah"
- name: test var
hosts: all
vars:
USER1:
name: user1
id: 123
USER2:
name: user2
id: 456
tasks:
- name:
user:
name: "{{USER1.name}}"
uid: "{{USER1.id}}"
state: present
- name:
user:
name: "{{USER2.name}}"
uid: "{{USER2.id}}"
state: present
- name: test register
hosts: host1
tasks:
- name: hostname command
shell: hostname
register: test
- name: show messages
debug:
msg: "{{test['stdout']}}"
ansible localhost -m setup //可以使用命令来查看当前主机的事实变量,并使用正确的变量名和格式在Ansible playbooks中引用这些变量。
- name: test fact
hosts: host1
tasks:
- name: show messages
debug:
msg: "{{ansible_facts['nodename']}}"
//host1主机上显示出当前主机的节点名称
gather_facts: no //在playbook中关闭事实变量收集
hostvars: //ansible软件的内部信息
group_names: //当前受管主机所在组
groups: //列出清单中所有的组和主机
inventory_hostname: //包含清单中配置的当前授管主机的名称
{# /etc/hosts line #} //注释说明文件用途
127.0.0.1 localhost //文件内容
{{ ansible_facts['all_ipv4_addresses'] }} {{ansible_facts['fqdn']}} //使用事实变量
vim jinja.yml
- name: test j2
hosts: host1
tasks:
- name: create test file
template:
src: ./test.j2
dest: /mnt/test
vim user1.yml
users:
- westos
- linux
- ansible
vim for.j2
- name: test j2
vars_files: ./user1.yml
hosts: host1
tasks:
- name: create list
template:
src: ./test1.j2
dest: /mnt/user_list
vim test2.j2
{% for NAME in users %}
{% if NAME in "linux" %}
{{ loop.index0 }}
{% endif %}
{% if NAME not in "linux"%}
{{ loop.index0 }} {{ NAME }}
{% endif %}
{% endfor %}
//使用if语句来检查当前的"NAME"是否包含字符串"linux"。如果包含,则使用loop.index0来输出当前索引的值,并在后面添加一个换行。如果不包含,则使用loop.index0输出当前索引的值,并在元素后面添加一个空格和"NAME"本身的值
loop.index //循环迭代记数从1开始
loop.index0 //循环迭代计数从0开始
练习
创建一个名为"hosts"的文件,其中包含了所有主机的IP地址、主机名和完全限定域名。使用源模板文件"./hosts.j2"和目标文件路径"/mnt/hosts"
cat hosts.j2
{% for HOST in groups['all'] %}
{{hostvars[HOST]['ansible_facts']['ens33']['ipv4']['address']}} {{hostvars[HOST]['ansible_facts']['hostname']}} {{hostvars[HOST]['ansible_facts']['fqdn']}}
{% endfor %}
vim host.yml
- name: create hosts
hosts: all
tasks:
- name: create hosts file
template:
src: ./hosts.j2
dest: /mnt/hosts
ansible-vault create westos //创建加密文件westos
vim westos-vault
lee
ansible-vault create --vault-password-file=westos-valut westos //创建了一个名为"westos"的Vault文件,并使用密码文件"westos-vault"中指定的密码为其加密
ansible-vault encrypt test
ansible-vault view westos
ansible-vault view --vault-password-file=westos-valut westos
ansible-vault edit westos1
ansible-vault edit --vault-password-file=westos-valut westos
ansible-vault decrypt westos //文件永久解密
ansible-vault decrypt westos --output=linux //文件解密保存在linux
ansible-vault rekey westos1
ansible-vault rekey westos1 --new-vault-password-file=key1