本篇博客实验环境详见ansible的部署以及基本模块的使用
取变量应用
[devops@server1 ansible]$ ls
ansible.cfg files hostinfo.yml httpd.yml inventory templates
[devops@server1 ansible]$ vim templates/info
主机名:{{ ansible_facts['hostname'] }}
主机ip:{{ ansible_facts['eth0']['ipv4']['address'] }}
根分区大小:{{ ansible_facts['devices']['dm-0']['size'] }}
系统内核:{{ ansible_facts['kernel'] }}
在这个文件内写需要取的变量。
[devops@server1 ansible]$ vim hostinfo.yml
---
- hosts: all
tasks:
- name: create infofile
template:
src: templates/info ##上面编写的info文件地址
dest: /mnt/hostinfo ##存放地址
[devops@server1 ansible]$ ansible-playbook hostinfo.yml
推送
测试变量的显示。
yml文件编写应用
软件安装
下面我们在来写一个yml文件。
[devops@server1 ansible]$ vim install.yml
---
- hosts: all
tasks:
- name: install httpd
yum:
name: httpd
state: present
when: ansible_facts['hostname'] == 'server2'
这个文件的作用就是安装httpd服务,只不过这里加了一个条件,就是当主机名为server2时安装
推送时发现跳过了server3。只对server2进行操作,这样就可以灵活定义需要操作的主机。
如:
[devops@server1 ansible]$ vim install.yml
---
- hosts: all
tasks:
- name: install httpd ##设置只在server2安装httpd等多个软件
yum:
name: "{{ item }}" ##固定变量
state: present
when: ansible_facts['hostname'] == 'server2'
loop:
- httpd
- mariadb
- php
- name: install vim ##设置在只server3安装vim
yum:
name: vim
state: present
when: ansible_facts['hostname'] == 'server3'
在server2安装多个软件,在server3只安装vim。
制作相互解析
[devops@server1 ansible]$ vim templates/hosts.j2
{% for host in groups ['webservers'] %}
{{ hostvars[host]['ansible_facts']['eth0']['ipv4']['address'] }} {{ hostvars[host]['ansible_facts']['hostname'] }}
{% endfor %}
制作解析文件。
[devops@server1 ansible]$ vim hosts.yml
---
- hosts: all
tasks:
- name: create hosts
template:
src: templates/hosts.j2
dest: /etc/hosts
owner: root
group: root
mode: 644
编写yml文件。
推送。
server2和server3的相互解析做好了。
批量创建用户
[devops@server1 ansible]$ vim adduser.yml
---
- hosts: all
tasks:
- name: create users
user:
name: "{{ item }}"
state: present
password: redhat ##密码
loop:
- user1
- user2
- user3
在两台主机都新建了用户,不过这样创建的用户密码都是一样的,我们可以创建一个列表,指定用户的密码和名称。
[devops@server1 ansible]$ cd vars/
[devops@server1 vars]$ ls
userlist.yml
[devops@server1 vars]$ vim userlist.yml
---
userlist:
- user: user1
pass: redhat
- user: user2
pass: yangmi
- user: user3
pass: hang
用户密码列表。
[devops@server1 ansible]$ pwd
/home/devops/ansible
[devops@server1 ansible]$ vim adduser.yml
---
- hosts: all
vars_files:
- vars/userlist.yml
tasks:
- name: create users
user:
name: "{{ item.user }}" ##用户名
state: present
password: "{{ item.pass }}" ##密码
loop: "{{ userlist }}"
可以直接查看到用户列表,这样是不安全的,我们可以对这个文件进行加密。
[devops@server1 ansible]$ ansible-vault --help
Usage: ansible-vault [create|decrypt|edit|encrypt|encrypt_string|rekey|view] [options] [vaultfile.yml]
encryption/decryption utility for Ansible data files
Options:
--ask-vault-pass ask for vault password
-h, --help show this help message and exit
--new-vault-id=NEW_VAULT_ID
the new vault identity to use for rekey
--new-vault-password-file=NEW_VAULT_PASSWORD_FILE
new vault password file for rekey
--vault-id=VAULT_IDS the vault identity to use
--vault-password-file=VAULT_PASSWORD_FILES
vault password file
-v, --verbose verbose mode (-vvv for more, -vvvv to enable
connection debugging)
--version show program's version number and exit
See 'ansible-vault <command> --help' for more information on a specific
command.
查看帮助
[devops@server1 ansible]$ ansible-vault encrypt vars/userlist.yml
输入密码后就可以进行加密了。
[devops@server1 ansible]$ ansible-playbook adduser.yml --ask-vault-pass
推送时要加入密码。
[root@server2 ~]# cat /etc/shadow
在server2中查看/etc/shadow,可以发现密码是明文的,为了安全性考虑,我们需要给它加密。
[devops@server1 ansible]$ vim adduser.yml
---
- hosts: all
vars_files:
- vars/userlist.yml
tasks:
- name: create users
user:
name: "{{ item.user }}"
state: present
password: "{{ item.pass | password_hash('sha512','mysecretsalt') }}" ##加密方式
loop: "{{ userlist }}"
[devops@server1 ansible]$ ansible-playbook adduser.yml --ask-vault-pass
推送。
[root@server2 ~]# cat /etc/shadow
再次在server2查看,加密成功了。
对多个yml文件进行加密时要注意,加密时要使用一个密码,因为在验证时只能输入一个密码。