主机、命令行、剧本、变量
主机变量
代码语言:txt复制[student@workstation ansible]$ cat inventory
[dev]
servera
[test]
serverb
[prod]
serverc http_port=8080
serverd http_port=8081
[balancers]
serverb
[webservers:children]
prod
使用-e传递命令行变量
代码语言:txt复制ansible-playbook -e "cmdvar=hahayaa" myvariables.yaml
剧本变量是用vars来定义的
代码语言:txt复制- hosts: all
remote_user: root
vars:
- msg: "erererThis is Playbook Variable duoduolalaaamengmeng"
tasks:
#1.这个是命令行变量
- name: commandline variables
copy: content={{ cmdvar }} dest=/tmp/cmd.txt
#2.这个是playbook变量
- name: playbook variables
copy: content={{ msg }} dest=/tmp/msg.txt
#3.这个是主机列表,写在主机后面的变量
- name: host inventory variables
copy: content={{ http_port }} dest=/tmp/port.txt
使用-e 传递一个变量文件,格式@path
代码语言:txt复制ansible servera -e "@/home/ansible/myvars" -m debug -a "var=password"
主机组变量
也可以单独写主机变量
代码语言:txt复制[dev:vars]
http_port=8989
server_name=www.example.com
高级主机组变量
上面定义主机变量的方式是直接在hosts文件中,写主机变量,此种方法是把它独立到一个特定文件夹里的文件里面去写(推荐)
1.主机列表存放的目录
代码语言:txt复制[ansible@workstation ~]$ cat ansible.cfg
#主机列表存放的目录
[defaults]
inventory = /home/ansible/inventory/hosts
2.查看主机配置文件
代码语言:txt复制[ansible@workstation ~]$ cat inventory/hosts
[dev]
servera user=haha
serverb
3.在主机目录下创建group_vars(主机组变量),host_vars(单个主机变量),注意一定是要在主机列表目录创建这两个文件夹
代码语言:txt复制[ansible@workstation ~]$ tree .
.
├── ansible.cfg
├── inventory
│ ├── group_vars
│ │ └── dev
│ ├── hosts
│ └── host_vars
│ └── servera
└── roles
4.查看group_var目录文件的内容
代码语言:txt复制[ansible@workstation ~]$ cat inventory/group_vars/dev
baobaobao: httpd
5.查看host_vars目录文件的内容
代码语言:txt复制[ansible@workstation ~]$ cat inventory/host_vars/servera
user: lalala
home: /home/lalala
6.测试一下结果
使用主机组的变量测试
代码语言:txt复制[ansible@workstation ~]$ ansible dev -m debug -a
"msg={{ baobaobao }}"
servera | SUCCESS => {
"msg": "httpd"
}
serverb | SUCCESS => {
"msg": "httpd"
}
使用主机变量查看结果
代码语言:txt复制[ansible@workstation ~]$ ansible servera -m debug -a "msg='{{ user }} {{ home }}'"
servera | SUCCESS => {
"msg": "lalala /home/lalala"
}
注:主机变量优先级高于主机组变量
注册变量
代码语言:txt复制- hosts: h1
remote_user: root
tasks:
- name: make log
shell: echo 'hahalalayaya' > /tmp/msg.log
#将shell执行的返回结果以json的形式返回给retmsg
register: retmsg
- name: get return values
#使用debug输出变量
debug:
var: retmsg
Shell模块的返回结果,每个模块的返回结果都不一定一样
代码语言:txt复制ok: [host1] => {
"retmsg": {
"changed": true,
"cmd": "echo 'hahalalayaya' > /tmp/msg.log", #执行的命令
"delta": "0:00:00.002812", #命令执行了多久
"end": "2019-11-06 15:29:39.912294", #命令结束时间
"failed": false,
"rc": 0, #$?的结果
"start": "2019-11-06 15:29:39.909482", #命令开始时间
"stderr": "", #标准错误输出
"stderr_lines": [],
"stdout": "", #标准输出
"stdout_lines": []
}
}
代码语言:txt复制#输出json格式内容的两种方式
#方式一
- name: print cmd
debug:
#注意输出的内容要加双引号
msg: "{{ retmsg.cmd }}"
#方式二
- name: print status
debug:
msg: "result={{ retmsg['rc'] }}"
Facts变量
facts代表主机各种信息
收集facts信息
获取目标主机安装的详细信息 | ansible_os_family |
---|---|
获取fqdn信息 | ansible_fqdn |
获取主机的环境变量信息 | ansible_env |
获取主机名 | ansible_hostname |
获取目标主机所有接口信息 | ansible_interface |
获取默认ipv4地址 | ansible_default_ipv4.address |
获取默认网卡地址 | ansible_default_ipv4.macaddress |
获取dns域名信息 | ansible_dns.nameservers |
获取内核版本号 | ansible_kernel |
获取操作系统类型 | ansible_os_family |
获取分区vda的大小 | ansible_devices.vda.size |
获取目标主机安装的详细信息,放到本机目录中
代码语言:txt复制ansible all -m setup --tree /tmp/facts
过滤Facts变量
代码语言:txt复制ansible dev -m setup -a "filter=*ansible_devices*"
ansible dev -m setup -a "filter=*ansible_default_ipv4*"
Facts变量的引用
在playbook文件中,或者在模板文件中引用
代码语言:txt复制- hosts: all
tasks:
- debug:
msg:
- "{{ ansible_hostname }}"
- "{{ ansible_default_ipv4.address }}"
- "{{ ansible_dns['nameservers'][0] }}"
关闭Facts收集
关闭facts收集以后,playbook启动的时间会变快
代码语言:txt复制- hosts: dev
gather_facts: no
tasks:
- debug:
msg: "closeed facts"
随时开启Facts收集
代码语言:txt复制- hosts: dev
gather_facts: no
tasks:
- setup:
- debug:
msg:
- "closeed facts"
- "{{ ansible_hostname }}"
自定义Facts变量
ansible 在收集主机信息的时候默认是在/etc/ansible/facts.d/
目录下,注意是在远程主机目录下!!!
1.自定义目录与内容,两种风格方式都可以
代码语言:txt复制tail /home/ansible/facts.d/*
==> /home/ansible/facts.d/haha.fact <==
[name]
haha = 123
xixi = 456
==> /home/ansible/facts.d/my.fact <==
{
"users": {
"shenqi": {
"level":"99",
"hobby": "[ 'computer' ,'music']"
}
}
}
2.使用fact_path可以指定目录,在所有目标端,都必须要有这个目录以及里面的文件才行!!!
代码语言:txt复制ansible localhost -m setup -a 'fact_path=/home/ansible/facts.d/ filter=*local*'
localhost | SUCCESS => {
"ansible_facts": {
"ansible_local": {
"haha": {
"name": {
"haha": "123",
"xixi": "456"
}
},
"my": {
"users": {
"shenqi": {
"hobby": "[ 'computer' ,'music']",
"level": "99"
}
}
}
}
},
"changed": false
}
引用外部变量
vars指令用于定义变量,可以在play中和task中使用
vars_files
vars_files指令用于引用外部定义了变量的文件,只能在play中使用,不能作为task中指令使用。
举例
代码语言:txt复制[student@workstation ansible]$ cat get_user.yml
- hosts: servera
vars_files:
- users.yml
tasks:
- debug:
msg: >
name={{ item.key }}
id={{ item.value.id }}
age={{ item.value.age }}
alias={{ item.value.alias }}
with_dict: "{{ users }}"
变量文件
代码语言:txt复制[student@workstation ansible]$ cat users.yml
users:
xiaoming:
id: 1
age: 12
alias: jery
gouwa:
id: 6
age: 9
alias: eric
执行结果
代码语言:txt复制[student@workstation ansible]$ ansible-playbook get_user.yml
PLAY [servera] **************************************************************************************************
TASK [Gathering Facts] **************************************************************************************************
ok: [servera]
TASK [debug] **************************************************************************************************
ok: [servera] => (item={'key': u'xiaoming', 'value': {u'alias': u'jery', u'age': 12, u'id': 1}}) => {
"item": {
"key": "xiaoming",
"value": {
"age": 12,
"alias": "jery",
"id": 1
}
},
"msg": "name=xiaoming id=1 age=12 alias=jeryn"
}
ok: [servera] => (item={'key': u'gouwa', 'value': {u'alias': u'eric', u'age': 9, u'id': 6}}) => {
"item": {
"key": "gouwa",
"value": {
"age": 9,
"alias": "eric",
"id": 6
}
},
"msg": "name=gouwa id=6 age=9 alias=ericn"
}
PLAY RECAP **************************************************************************************************
servera : ok=2 changed=0 unreachable=0 failed=0
include_vars
include_vars即可以在play中使用,也可以在task中用。
代码语言:txt复制[student@workstation ansible]$ cat get_user.yml
- hosts: servera
tasks:
- name: get user vars
include_vars: users.yml
- debug:
msg: >
name={{ item.key }}
id={{ item.value.id }}
age={{ item.value.age }}
alias={{ item.value.alias }}
with_dict: "{{ users }}"
效果同上