Hello Guys this is another post on the Ansible learning experiments, well in this post, I've explored about files and directories which can be created and copied and downloaded and uploaded. We could also do file permission changes how we do in Linux 'chmod' and 'chown' commands.
Let's begin with effectively doing automation management with configurations and deploy the challenges related to files and directories.
We can compare ansible modules copy and fetch both are related to file moment and they work in opposite directions as shown below:
Ansible modules copy vs fetch |
We have many files related modules available in the Ansible.
- acl archive unarchive iso_extract read_csv synchronize
- assemble tempfile template xattr xml
- blockinfile lineinfile patch
- copy fetch file find stat replace
In this post we will have three modules to experiment here.
- file
- copy
- fetch
Prerequisites
- Ansible installed controller node
- SSH password less connectivity established
Here is a sample inventory file which I have used for this experiment:
inventory file [db] 192.168.33.210 192.168.33.220Following is the Syntax for all ad-hoc command line will be used
ansible[-i inventory] server1:server2[group1:group2] -m file -a "arguments such as path status-action-value" [-b]
Exploring 'file' module
- Create a file
- Create a directory
- modify the file permissions
- Delete a file or directory
Creating a file using the 'file' module
Creating a file (just like touch command in Linux) first we can tryout with ad-hoc command, later we can use this inside a playbook.ansible db -m file -a "path=/tmp/hello.txt state=touch"
Ansible file module creating file |
Change file permission mode
ansible db -m file -a "path=/tmp/newfile.txt state=touch mode=0777"
Remove a file on remote host
ansible db -m file -a "path=/tmp/newdir.txt state=absent"
Ansible file delete optin |
Creating Directory
ansible db -m file -a "path=/tmp/newdir state=directory"
Ansible direcoty creation |
To write files where root owns the directory, example create file text.txt under /etc foldeer permission deny. If your user have sudo access you can do. Similar to it we can do with Ansible CLI
ansible db -m file -a "path=/etc/test.txt state=touch" -bHere -b or --become option will allow as prefixing as sudo to a command. note that this will only works for the sudoer users.
2. The copy module
A small change in the current folder to use as custom ansible configuration folder where it has two files ansible.cfg and hosts inventory as 'prod_inv' file same thing is mentioned in the ansible.cfg file. As Ansible will take the prority to current directory containing ansible.cfg event though the default exists :[defaults] inventory = ./prod_inv host_key_checking = False
Simple example test for copy module, from Ansible Engine hello.txt from /tmp location copied to the remote web servers into /tmp location.
ansible web -m copy -a "src=/tmp/hello.txt dest=/tmp/hello.txt"
How to copy a directory to remote box in Ansible?
This is little tricky idea we can do Copying directories using copy module just like scp command in Linux. Let's try this with the playbook--- - name: Ansible copy module test hosts: web tasks: - name: copy dir copy: src: /tmp/testdir dest: /tmpExecution of the Playbook will be as follows:
ansible-playbook copydir.yaml
Ansible playbook execution for copy module |
How to copy multiple files or directories to remote box in Ansible?
--- - name: Ansible copy module test 2 hosts: web tasks: - name: copy multiple files copy: src: /tmp/testdir/{{ item }} dest: /tmp mode: 0774 with_items: ['hello2.txt', 'hello4.txt', 'sub1/hello5.txt']Execution of the Playbook will be as follows:
ansible-playbook copy-multiple.yaml
Multi-copy image
Multiple files and sub directories copy to remote node using 'with_items' |
Can I create text content when I use copy module?
--- # Filename: copy_content.yml - name: Ansible copy content test hosts: localhost tasks: - name: create a file with content copy: dest: /tmp/test_content.yml content: "hello world!\n"The execution of the copy content example as:
ansible-playbook copy-content.yaml
copy module with content to a file in Ansible |
3. The fetch module
ansible -i prod_inv web \ -m fetch -a "src=/tmp/hello.txt dest=./downloaded"
Ansible default fetch operation |
ansible -i prod_inv web -m fetch -a "src=/tmp/hello.txt dest=./download flat=true"When you execute the above ansible ad-hoc command it will download from host1 but fails when host2
ansible -i prod_inv web -m fetch -a "src=/tmp/hello.txt dest=./downloads/ flat=true"Downloads from host1, host2 but will be downloads to the same destination location, as a solution to this, separates the destination filename with inventory hostname should be added.
ansible -i prod_inv web -m fetch \ -a "src=/tmp/hello.txt dest=./{{ inventory_hostname }}_download/ flat=true"To use the fetch module in ansible to retrieve the file /tmp/p1-sample.txt from my-src.host, you can use the following playbook:
--- - hosts: my-src.host tasks: - name: fetch file from my-src.host fetch: src: /tmp/p1-sample.txt dest: /tmp/p1-sample.txt flat: trueHere, You can also specify a different destination path by modifying the dest parameter. The 'flat' parameter is set to true indicates fetch operation on a flat file. For example, to store the file in the /tmp directory on the localhost with a different file-name, we can use the following dest value:
dest: /tmp/p1-sample-fetched.txt
Can I fetch multiple files from remote host to local host?
You can also specify a list of src files to fetch multiple files at once. For example:--- - hosts: my-src.host tasks: - name: fetch files from my-src.host fetch: src: - /tmp/p1-sample.txt - /tmp/p2-sample.txt dest: /tmp/
This playbook will retrieve the files /tmp/p1-sample.txt and /tmp/p2-sample.txt from the host my-src.host and store them in the /tmp directory on the local host where Ansible runs.
No comments:
Post a Comment