如何在Ansible剧本中创建新的配置文件
时间:2020-01-09 10:39:03 来源:igfitidea点击:
我想创建一个名为/etc/apt/apt.conf.d/1000-force-ipv4-transport的文件,其值设置为Acquire :: ForceIPv4 true;在AWS托管的20台云服务器上。
我已经设置了Ansible剧本来自动执行操作。
如何使用Ansible剧本创建新文件?
是否可以使用Ansible IT自动化工具创建包含多行文本的复杂文件(例如squid.conf)?
您可以使用以下任一模块来创建新文件:
- 复制模块将文件复制到远程位置。
- 模板模块将文件模板输出到远程服务器。
如何在远程服务器上写一行内容并创建文件
语法非常简单:
- copy: content: "your config line here" dest: "/path/to/file"
当代替src使用时,将文件的内容直接设置为指定的值。
这是用于简单值,用于任何复杂或具有格式的内容,请切换到模板模块。
因此,这是一个示例create-file.yml文件:
# create a file to force apt-get to use IPv4 only - copy: content: "Acquire::ForceIPv4 true;" dest: "/etc/apt/apt.conf.d/1000-force-ipv4-transport"
其中:
- ``content:" Acquire :: ForceIPv4 true;"`将文件的内容直接设置为指定的字符串
- ``目的地:" /etc/apt/apt.conf.d/1000-force-ipv4-transport"`设置将文件复制/创建到的远程绝对路径
backup:yes
应该复制文件的远程绝对路径。owner:root
设置应该拥有文件/目录的用户group:root
设置应该拥有文件/目录的组mode:0600
使用八进制数字设置文件权限
因此,这是一个示例列表文件:
$ cat ~/hosts
sh [kvmhost] 192.168.2.45 ansible_user = root 192.168.2.46 ansible_user = root``````这是我为您更新的create-file.yml:
-- # same config file - hosts: kvmhost remote_user: root tasks: # create a new file on each host - copy: content: "Acquire::ForceIPv4 true;" dest: "/etc/apt/apt.conf.d/1000-force-ipv4-transport" backup: yes owner: root group: root mode: 0644 # run apt-get too using IPv4 - apt: update_cache: yes cache_valid_time: 3600 upgrade: dist
您可以照常运行它:
$ ANSIBLE_HOSTS=~/hosts; ansible-playbook create-file.yml
如何在Ansible剧本中创建空白文件
语法非常简单:
file: path: /usr/local/etc/my.conf state: touch owner: root group: root mode: 0600
其中:
- ``path:/usr/local/etc/my.conf`设置被管理文件的路径
state:touch
创建一个按路径设置的文件owner:root
设置应该拥有文件/目录的用户group:root
设置应该拥有文件/目录的组mode:0600
使用八进制数字设置文件权限
如何使用Ansible创建复杂文件
如果您需要添加多行,请考虑使用模板模块。
模板由Jinja2模板语言处理,并创建文件到远程服务器。
第1步创建名为squid.yml的Ansible Playbook
$ cat squid.yml
输出示例:
# Create squid.conf - hosts: kvmhost remote_user: root tasks: - template: src: squid.conf.j2 dest: /etc/squid/squid.conf owner: root group: root mode: '0644' validate: '/usr/sbin/squid -k check' backup: yes - service: name: squid state: restarted
步骤2创建名为squid.conf.j2的Jinja2模板
$ cat squid.conf.j2
输出示例:
acl mylan src {{ theitroad_vlan_lan_subnet }} acl SSL_ports port 443 acl CONNECT method CONNECT http_access deny !Safe_ports http_access deny CONNECT !SSL_ports http_access allow localhost manager http_access deny manager http_access allow localhost http_access allow mylan http_access deny all http_port {{ theitroad_http_port }} tcp_outgoing_address {{ theitroad_cloud_server_ip }} cache_mem {{ theitroad_memory }} MB cache_dir diskd /var/spool/squid 1024 16 256 Q1=72 Q2=64 access_log daemon:/var/log/squid/access.log squid coredump_dir /var/spool/squid refresh_pattern ^ftp: 1440 20% 10080 refresh_pattern ^gopher: 1440 0% 1440 refresh_pattern -i (/cgi-bin/|\?) 0 0% 0 refresh_pattern (Release|Packages(.gz)*)$ 0 20% 2880 refresh_pattern . 0 20% 4320 forwarded_for delete via off forwarded_for off follow_x_forwarded_for deny all request_header_access X-Forwarded-For deny all
步骤3更新列表文件~/hosts
使用squid.conf.j2模板的变量更新了列表文件:
$ cat ~/hosts
输出示例:
### my hosts ## [kvmhost] 192.168.2.45 ansible_user=root 192.168.2.46 ansible_user=root ## variables with values ## [kvmhost:vars] cm_vlan_lan_subnet=10.8.0.0/24 cm_http_port=10.8.0.1:3128 cm_cloud_server_ip=72.xxx.yyy.zzz cm_memory=1024
步骤4运行您的剧本在远程服务器上创建复杂的squid.conf文件
执行以下命令:
$ ANSIBLE_HOSTS=~/hosts; ansible-playbook squid.yml